changeset 3600:d0b6351ff063

Merge jdk8-b50
author andrew
date Fri, 03 Aug 2012 20:23:25 +0100
parents aa06aff75142 (current diff) c01c8e05ec8c (diff)
children db9277e6d65c
files .hgtags agent/src/share/classes/sun/jvm/hotspot/jdi/ReferenceTypeImpl.java src/cpu/x86/vm/vm_version_x86.cpp src/os/linux/vm/os_linux.cpp src/share/vm/classfile/loaderConstraints.cpp src/share/vm/classfile/systemDictionary.cpp src/share/vm/compiler/compileBroker.cpp src/share/vm/compiler/compilerOracle.cpp src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp src/share/vm/memory/allocation.cpp src/share/vm/memory/allocation.hpp src/share/vm/opto/library_call.cpp src/share/vm/opto/type.cpp src/share/vm/opto/type.hpp src/share/vm/runtime/arguments.cpp src/share/vm/runtime/globals.hpp src/share/vm/runtime/jniHandles.hpp src/share/vm/utilities/vmError.cpp
diffstat 480 files changed, 63720 insertions(+), 6788 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Thu Aug 02 17:00:18 2012 +0100
+++ b/.hgtags	Fri Aug 03 20:23:25 2012 +0100
@@ -259,3 +259,13 @@
 e77b8e0ed1f84e3e268239e276c7ab64fa573baa jdk8-b43
 5ba29a1db46ecb80a321ca873adb56a3fe6ad320 hs24-b14
 831e5c76a20af18f3c08c5a95ed31be0e128a010 jdk8-b44
+9d5f20961bc5846fa8d098d534effafbbdae0a58 jdk8-b45
+40e5a3f2907ed02b335c7caa8ecf068cc801380d hs24-b15
+cf37a594c38db2ea926954154636f9f81da2e032 jdk8-b46
+0c7bb1f4f9c8062b5c5bfa56b3bdca44839b4109 jdk8-b47
+66b0450071c1534e014b131892cc86b63f1d009c hs24-b16
+1e26f61bbb521642639f56fae11326f1932f5a7d jdk8-b48
+bd54fe36b5e50f9ef1e30a5047b27fee5297e268 hs24-b17
+e3619706a7253540a2d94e9e841acaab8ace7038 jdk8-b49
+72e0362c3f0cfacbbac8af8a5b9d2e182f21c17b hs24-b18
+58f237a9e83af6ded0d2e2c81d252cd47c0f4c45 jdk8-b50
--- a/agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpot.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpot.java	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -657,7 +657,7 @@
     while (fr != null) {
       trace.add(new StackTraceEntry(fr, getCDebugger()));
       try {
-        fr = fr.sender();
+        fr = fr.sender(t);
       } catch (AddressException e) {
         e.printStackTrace();
         showMessageDialog("Error while walking stack; stack trace will be truncated\n(see console for details)",
--- a/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/amd64/BsdAMD64CFrame.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/amd64/BsdAMD64CFrame.java	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,7 @@
 package sun.jvm.hotspot.debugger.bsd.amd64;
 
 import sun.jvm.hotspot.debugger.*;
+import sun.jvm.hotspot.debugger.amd64.*;
 import sun.jvm.hotspot.debugger.bsd.*;
 import sun.jvm.hotspot.debugger.cdbg.*;
 import sun.jvm.hotspot.debugger.cdbg.basic.*;
@@ -51,8 +52,11 @@
       return rbp;
    }
 
-   public CFrame sender() {
-      if (rbp == null) {
+   public CFrame sender(ThreadProxy thread) {
+      AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext();
+      Address rsp = context.getRegisterAsAddress(AMD64ThreadContext.RSP);
+
+      if ( (rbp == null) || rbp.lessThan(rsp) ) {
         return null;
       }
 
--- a/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/x86/BsdX86CFrame.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/x86/BsdX86CFrame.java	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,7 @@
 import sun.jvm.hotspot.debugger.bsd.*;
 import sun.jvm.hotspot.debugger.cdbg.*;
 import sun.jvm.hotspot.debugger.cdbg.basic.*;
+import sun.jvm.hotspot.debugger.x86.*;
 
 final public class BsdX86CFrame extends BasicCFrame {
    // package/class internals only
@@ -52,8 +53,11 @@
       return ebp;
    }
 
-   public CFrame sender() {
-      if (ebp == null) {
+   public CFrame sender(ThreadProxy thread) {
+      X86ThreadContext context = (X86ThreadContext) thread.getContext();
+      Address esp = context.getRegisterAsAddress(X86ThreadContext.ESP);
+
+      if ( (ebp == null) || ebp.lessThan(esp) ) {
         return null;
       }
 
--- a/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/CFrame.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/CFrame.java	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -34,7 +34,7 @@
 
 public interface CFrame {
   /** Returns null when no more frames on stack */
-  public CFrame sender();
+  public CFrame sender(ThreadProxy th);
 
   /** Get the program counter of this frame */
   public Address pc();
--- a/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/amd64/AMD64CFrame.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/amd64/AMD64CFrame.java	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,7 @@
 package sun.jvm.hotspot.debugger.cdbg.basic.amd64;
 
 import sun.jvm.hotspot.debugger.*;
+import sun.jvm.hotspot.debugger.amd64.*;
 import sun.jvm.hotspot.debugger.cdbg.*;
 import sun.jvm.hotspot.debugger.cdbg.basic.*;
 
@@ -43,8 +44,11 @@
     this.pc  = pc;
   }
 
-  public CFrame sender() {
-    if (rbp == null) {
+  public CFrame sender(ThreadProxy thread) {
+    AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext();
+    Address rsp = context.getRegisterAsAddress(AMD64ThreadContext.RSP);
+
+    if ( (rbp == null) || rbp.lessThan(rsp) ) {
       return null;
     }
 
--- a/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/x86/X86CFrame.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/x86/X86CFrame.java	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -25,6 +25,7 @@
 package sun.jvm.hotspot.debugger.cdbg.basic.x86;
 
 import sun.jvm.hotspot.debugger.*;
+import sun.jvm.hotspot.debugger.x86.*;
 import sun.jvm.hotspot.debugger.cdbg.*;
 import sun.jvm.hotspot.debugger.cdbg.basic.*;
 
@@ -43,8 +44,11 @@
     this.pc  = pc;
   }
 
-  public CFrame sender() {
-    if (ebp == null) {
+  public CFrame sender(ThreadProxy thread) {
+    X86ThreadContext context = (X86ThreadContext) thread.getContext();
+    Address esp = context.getRegisterAsAddress(X86ThreadContext.ESP);
+
+    if ( (ebp == null) || ebp.lessThan(esp) ) {
       return null;
     }
 
--- a/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,7 @@
 package sun.jvm.hotspot.debugger.linux.amd64;
 
 import sun.jvm.hotspot.debugger.*;
+import sun.jvm.hotspot.debugger.amd64.*;
 import sun.jvm.hotspot.debugger.linux.*;
 import sun.jvm.hotspot.debugger.cdbg.*;
 import sun.jvm.hotspot.debugger.cdbg.basic.*;
@@ -51,8 +52,11 @@
       return rbp;
    }
 
-   public CFrame sender() {
-      if (rbp == null) {
+   public CFrame sender(ThreadProxy thread) {
+      AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext();
+      Address rsp = context.getRegisterAsAddress(AMD64ThreadContext.RSP);
+
+      if ( (rbp == null) || rbp.lessThan(rsp) ) {
         return null;
       }
 
--- a/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/sparc/LinuxSPARCCFrame.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/sparc/LinuxSPARCCFrame.java	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -57,7 +57,7 @@
       return sp;
    }
 
-   public CFrame sender() {
+   public CFrame sender(ThreadProxy thread) {
       if (sp == null) {
         return null;
       }
--- a/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86CFrame.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86CFrame.java	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,7 @@
 import sun.jvm.hotspot.debugger.linux.*;
 import sun.jvm.hotspot.debugger.cdbg.*;
 import sun.jvm.hotspot.debugger.cdbg.basic.*;
+import sun.jvm.hotspot.debugger.x86.*;
 
 final public class LinuxX86CFrame extends BasicCFrame {
    // package/class internals only
@@ -52,8 +53,11 @@
       return ebp;
    }
 
-   public CFrame sender() {
-      if (ebp == null) {
+   public CFrame sender(ThreadProxy thread) {
+      X86ThreadContext context = (X86ThreadContext) thread.getContext();
+      Address esp = context.getRegisterAsAddress(X86ThreadContext.ESP);
+
+      if ( (ebp == null) || ebp.lessThan(esp) ) {
         return null;
       }
 
--- a/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcCFrame.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcCFrame.java	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -37,7 +37,7 @@
       return fp;
    }
 
-   public CFrame sender() {
+   public CFrame sender(ThreadProxy t) {
       return sender;
    }
 
--- a/agent/src/share/classes/sun/jvm/hotspot/jdi/ReferenceTypeImpl.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/jdi/ReferenceTypeImpl.java	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -688,8 +688,7 @@
         if (sde == null) {
            String extension = null;
            if (saKlass instanceof InstanceKlass) {
-              Symbol sdeSym = ((InstanceKlass)saKlass).getSourceDebugExtension();
-              extension = (sdeSym != null)? sdeSym.asString() : null;
+              extension = ((InstanceKlass)saKlass).getSourceDebugExtension();
            }
            if (extension == null) {
               sde = NO_SDE_INFO_MARK;
--- a/agent/src/share/classes/sun/jvm/hotspot/oops/ConstMethod.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/oops/ConstMethod.java	Fri Aug 03 20:23:25 2012 +0100
@@ -47,14 +47,11 @@
   private static int HAS_LINENUMBER_TABLE;
   private static int HAS_CHECKED_EXCEPTIONS;
   private static int HAS_LOCALVARIABLE_TABLE;
+  private static int HAS_EXCEPTION_TABLE;
 
   private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
     Type type                  = db.lookupType("constMethodOopDesc");
     constants                  = new OopField(type.getOopField("_constants"), 0);
-    // The exception handler table. 4-tuples of ints [start_pc, end_pc,
-    // handler_pc, catch_type index] For methods with no exceptions the
-    // table is pointing to Universe::the_empty_int_array
-    exceptionTable             = new OopField(type.getOopField("_exception_table"), 0);
     constMethodSize            = new CIntField(type.getCIntegerField("_constMethod_size"), 0);
     flags                      = new ByteField(type.getJByteField("_flags"), 0);
 
@@ -62,6 +59,7 @@
     HAS_LINENUMBER_TABLE      = db.lookupIntConstant("constMethodOopDesc::_has_linenumber_table").intValue();
     HAS_CHECKED_EXCEPTIONS     = db.lookupIntConstant("constMethodOopDesc::_has_checked_exceptions").intValue();
     HAS_LOCALVARIABLE_TABLE   = db.lookupIntConstant("constMethodOopDesc::_has_localvariable_table").intValue();
+    HAS_EXCEPTION_TABLE       = db.lookupIntConstant("constMethodOopDesc::_has_exception_table").intValue();
 
     // Size of Java bytecodes allocated immediately after constMethodOop.
     codeSize                   = new CIntField(type.getCIntegerField("_code_size"), 0);
@@ -78,6 +76,9 @@
 
     type                       = db.lookupType("LocalVariableTableElement");
     localVariableTableElementSize = type.getSize();
+
+    type                       = db.lookupType("ExceptionTableElement");
+    exceptionTableElementSize = type.getSize();
   }
 
   ConstMethod(OopHandle handle, ObjectHeap heap) {
@@ -86,7 +87,6 @@
 
   // Fields
   private static OopField  constants;
-  private static OopField  exceptionTable;
   private static CIntField constMethodSize;
   private static ByteField flags;
   private static CIntField codeSize;
@@ -100,6 +100,7 @@
 
   private static long checkedExceptionElementSize;
   private static long localVariableTableElementSize;
+  private static long exceptionTableElementSize;
 
   public Method getMethod() {
     InstanceKlass ik = (InstanceKlass)getConstants().getPoolHolder();
@@ -112,10 +113,6 @@
     return (ConstantPool) constants.getValue(this);
   }
 
-  public TypeArray getExceptionTable() {
-    return (TypeArray) exceptionTable.getValue(this);
-  }
-
   public long getConstMethodSize() {
     return constMethodSize.getValue(this);
   }
@@ -235,7 +232,6 @@
     super.iterateFields(visitor, doVMFields);
     if (doVMFields) {
       visitor.doOop(constants, true);
-      visitor.doOop(exceptionTable, true);
       visitor.doCInt(constMethodSize, true);
       visitor.doByte(flags, true);
       visitor.doCInt(codeSize, true);
@@ -326,6 +322,23 @@
     return ret;
   }
 
+  public boolean hasExceptionTable() {
+    return (getFlags() & HAS_EXCEPTION_TABLE) != 0;
+  }
+
+  public ExceptionTableElement[] getExceptionTable() {
+    if (Assert.ASSERTS_ENABLED) {
+      Assert.that(hasExceptionTable(), "should only be called if table is present");
+    }
+    ExceptionTableElement[] ret = new ExceptionTableElement[getExceptionTableLength()];
+    long offset = offsetOfExceptionTable();
+    for (int i = 0; i < ret.length; i++) {
+      ret[i] = new ExceptionTableElement(getHandle(), offset);
+      offset += exceptionTableElementSize;
+    }
+    return ret;
+  }
+
   public boolean hasCheckedExceptions() {
     return (getFlags() & HAS_CHECKED_EXCEPTIONS) != 0;
   }
@@ -415,7 +428,10 @@
     if (Assert.ASSERTS_ENABLED) {
       Assert.that(hasLocalVariableTable(), "should only be called if table is present");
     }
-    if (hasCheckedExceptions()) {
+
+    if (hasExceptionTable()) {
+      return offsetOfExceptionTable() - 2;
+    } else if (hasCheckedExceptions()) {
       return offsetOfCheckedExceptions() - 2;
     } else {
       return offsetOfLastU2Element();
@@ -432,4 +448,33 @@
     return offset;
   }
 
+  private int getExceptionTableLength() {
+    if (hasExceptionTable()) {
+      return (int) getHandle().getCIntegerAt(offsetOfExceptionTableLength(), 2, true);
+    } else {
+      return 0;
+    }
+  }
+
+  private long offsetOfExceptionTableLength() {
+    if (Assert.ASSERTS_ENABLED) {
+      Assert.that(hasExceptionTable(), "should only be called if table is present");
+    }
+    if (hasCheckedExceptions()) {
+      return offsetOfCheckedExceptions() - 2;
+    } else {
+      return offsetOfLastU2Element();
+    }
+  }
+
+  private long offsetOfExceptionTable() {
+    long offset = offsetOfExceptionTableLength();
+    long length = getExceptionTableLength();
+    if (Assert.ASSERTS_ENABLED) {
+      Assert.that(length > 0, "should only be called if table is present");
+    }
+    offset -= length * exceptionTableElementSize;
+    return offset;
+  }
+
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/agent/src/share/classes/sun/jvm/hotspot/oops/ExceptionTableElement.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,81 @@
+/*
+ * 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.
+ *
+ */
+
+package sun.jvm.hotspot.oops;
+
+import java.io.*;
+import java.util.*;
+import sun.jvm.hotspot.debugger.*;
+import sun.jvm.hotspot.interpreter.*;
+import sun.jvm.hotspot.runtime.*;
+import sun.jvm.hotspot.types.*;
+import sun.jvm.hotspot.utilities.*;
+
+public class ExceptionTableElement {
+  static {
+    VM.registerVMInitializedObserver(new Observer() {
+        public void update(Observable o, Object data) {
+          initialize(VM.getVM().getTypeDataBase());
+        }
+      });
+  }
+
+  private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
+    Type type            = db.lookupType("ExceptionTableElement");
+    offsetOfStartPC      = type.getCIntegerField("start_pc").getOffset();
+    offsetOfEndPC        = type.getCIntegerField("end_pc").getOffset();
+    offsetOfHandlerPC    = type.getCIntegerField("handler_pc").getOffset();
+    offsetOfCatchTypeIndex = type.getCIntegerField("catch_type_index").getOffset();
+  }
+
+  private static long offsetOfStartPC;
+  private static long offsetOfEndPC;
+  private static long offsetOfHandlerPC;
+  private static long offsetOfCatchTypeIndex;
+
+  private OopHandle handle;
+  private long      offset;
+
+  public ExceptionTableElement(OopHandle handle, long offset) {
+    this.handle = handle;
+    this.offset = offset;
+  }
+
+  public int getStartPC() {
+    return (int) handle.getCIntegerAt(offset + offsetOfStartPC, 2, true);
+  }
+
+  public int getEndPC() {
+    return (int) handle.getCIntegerAt(offset + offsetOfEndPC, 2, true);
+  }
+
+  public int getHandlerPC() {
+    return (int) handle.getCIntegerAt(offset + offsetOfHandlerPC, 2, true);
+  }
+
+  public int getCatchTypeIndex() {
+    return (int) handle.getCIntegerAt(offset + offsetOfCatchTypeIndex, 2, true);
+  }
+}
+
--- a/agent/src/share/classes/sun/jvm/hotspot/oops/GenerateOopMap.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/oops/GenerateOopMap.java	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -651,10 +651,11 @@
     boolean fellThrough = false;  // False to get first BB marked.
 
     // First mark all exception handlers as start of a basic-block
-    TypeArray excps = method().getExceptionTable();
-    for(int i = 0; i < excps.getLength(); i += 4) {
-      int handler_pc_idx = i+2;
-      markBB(excps.getIntAt(handler_pc_idx), null);
+    if (method().hasExceptionTable()) {
+      ExceptionTableElement[] excps = method().getExceptionTable();
+      for(int i = 0; i < excps.length; i++) {
+        markBB(excps[i].getHandlerPC(), null);
+      }
     }
 
     // Then iterate through the code
@@ -891,14 +892,15 @@
 
     // Mark entry basic block as alive and all exception handlers
     _basic_blocks[0].markAsAlive();
-    TypeArray excps = method().getExceptionTable();
-    for(int i = 0; i < excps.getLength(); i += 4) {
-      int handler_pc_idx = i+2;
-      BasicBlock bb = getBasicBlockAt(excps.getIntAt(handler_pc_idx));
-      // If block is not already alive (due to multiple exception handlers to same bb), then
-      // make it alive
-      if (bb.isDead())
-        bb.markAsAlive();
+    if (method().hasExceptionTable()) {
+      ExceptionTableElement[] excps = method().getExceptionTable();
+      for(int i = 0; i < excps.length; i ++) {
+        BasicBlock bb = getBasicBlockAt(excps[i].getHandlerPC());
+        // If block is not already alive (due to multiple exception handlers to same bb), then
+        // make it alive
+        if (bb.isDead())
+          bb.markAsAlive();
+      }
     }
 
     BytecodeStream bcs = new BytecodeStream(_method);
@@ -1468,12 +1470,12 @@
 
     if (_has_exceptions) {
       int bci = itr.bci();
-      TypeArray exct   = method().getExceptionTable();
-      for(int i = 0; i< exct.getLength(); i+=4) {
-        int start_pc   = exct.getIntAt(i);
-        int end_pc     = exct.getIntAt(i+1);
-        int handler_pc = exct.getIntAt(i+2);
-        int catch_type = exct.getIntAt(i+3);
+      ExceptionTableElement[] exct   = method().getExceptionTable();
+      for(int i = 0; i< exct.length; i++) {
+        int start_pc   = exct[i].getStartPC();
+        int end_pc     = exct[i].getEndPC();
+        int handler_pc = exct[i].getHandlerPC();
+        int catch_type = exct[i].getCatchTypeIndex();
 
         if (start_pc <= bci && bci < end_pc) {
           BasicBlock excBB = getBasicBlockAt(handler_pc);
@@ -2151,7 +2153,7 @@
     _conflict       = false;
     _max_locals     = (int) method().getMaxLocals();
     _max_stack      = (int) method().getMaxStack();
-    _has_exceptions = (method().getExceptionTable().getLength() > 0);
+    _has_exceptions = (method().hasExceptionTable());
     _nof_refval_conflicts = 0;
     _init_vars      = new ArrayList(5);  // There are seldom more than 5 init_vars
     _report_result  = false;
--- a/agent/src/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java	Fri Aug 03 20:23:25 2012 +0100
@@ -342,7 +342,7 @@
   public Oop       getProtectionDomain()    { return                protectionDomain.getValue(this); }
   public ObjArray  getSigners()             { return (ObjArray)     signers.getValue(this); }
   public Symbol    getSourceFileName()      { return getSymbol(sourceFileName); }
-  public Symbol    getSourceDebugExtension(){ return getSymbol(sourceDebugExtension); }
+  public String    getSourceDebugExtension(){ return                CStringUtilities.getString(sourceDebugExtension.getValue(getHandle())); }
   public TypeArray getInnerClasses()        { return (TypeArray)    innerClasses.getValue(this); }
   public long      getNonstaticFieldSize()  { return                nonstaticFieldSize.getValue(this); }
   public long      getStaticOopFieldCount() { return                staticOopFieldCount.getValue(this); }
--- a/agent/src/share/classes/sun/jvm/hotspot/oops/Method.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/oops/Method.java	Fri Aug 03 20:23:25 2012 +0100
@@ -127,7 +127,6 @@
     return getConstMethod().getConstants();
   }
   public MethodData   getMethodData()                 { return (MethodData) methodData.getValue(this);          }
-  public TypeArray    getExceptionTable()             { return getConstMethod().getExceptionTable();            }
   /** WARNING: this is in words, not useful in this system; use getObjectSize() instead */
   public long         getMethodSize()                 { return                methodSize.getValue(this);        }
   public long         getMaxStack()                   { return                maxStack.getValue(this);          }
@@ -328,6 +327,14 @@
     return null;
   }
 
+  public boolean hasExceptionTable() {
+    return getConstMethod().hasExceptionTable();
+  }
+
+  public ExceptionTableElement[] getExceptionTable() {
+    return getConstMethod().getExceptionTable();
+  }
+
   public boolean hasCheckedExceptions() {
     return getConstMethod().hasCheckedExceptions();
   }
--- a/agent/src/share/classes/sun/jvm/hotspot/oops/OopUtilities.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/oops/OopUtilities.java	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -141,18 +141,19 @@
   public static String stringOopToString(Oop stringOop) {
     if (offsetField == null) {
       InstanceKlass k = (InstanceKlass) stringOop.getKlass();
-      offsetField = (IntField) k.findField("offset", "I");
-      countField  = (IntField) k.findField("count",  "I");
+      offsetField = (IntField) k.findField("offset", "I");   // optional
+      countField  = (IntField) k.findField("count",  "I");   // optional
       valueField  = (OopField) k.findField("value",  "[C");
       if (Assert.ASSERTS_ENABLED) {
-        Assert.that(offsetField != null &&
-                    countField != null &&
-                    valueField != null, "must find all java.lang.String fields");
+         Assert.that(valueField != null, "Field \'value\' of java.lang.String not found");
       }
     }
-    return charArrayToString((TypeArray) valueField.getValue(stringOop),
-                             offsetField.getValue(stringOop),
-                             countField.getValue(stringOop));
+    if (offsetField != null && countField != null) {
+      return charArrayToString((TypeArray) valueField.getValue(stringOop),
+                               offsetField.getValue(stringOop),
+                               countField.getValue(stringOop));
+    }
+    return  charArrayToString((TypeArray) valueField.getValue(stringOop));
   }
 
   public static String stringOopToEscapedString(Oop stringOop) {
--- a/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -158,7 +158,7 @@
                         printUnknown(out);
                      }
                   }
-                  f = f.sender();
+                  f = f.sender(th);
                }
             } catch (Exception exp) {
                exp.printStackTrace();
--- a/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -504,11 +504,14 @@
                             2           /* exp. table len.  */ +
                             2           /* code attr. count */;
 
-            TypeArray exceptionTable = m.getExceptionTable();
-            final int exceptionTableLen = (int) exceptionTable.getLength();
-            if (exceptionTableLen != 0) {
+            boolean hasExceptionTable = m.hasExceptionTable();
+            ExceptionTableElement[] exceptionTable = null;
+            int exceptionTableLen = 0;
+            if (hasExceptionTable) {
+                exceptionTable = m.getExceptionTable();
+                exceptionTableLen = exceptionTable.length;
                 if (DEBUG) debugMessage("\tmethod has exception table");
-                codeSize += (exceptionTableLen / 4) /* exception table is 4-tuple array */
+                codeSize += exceptionTableLen /* exception table is 4-tuple array */
                                          * (2 /* start_pc     */ +
                                             2 /* end_pc       */ +
                                             2 /* handler_pc   */ +
@@ -586,15 +589,15 @@
             dos.write(code);
 
             // write exception table size
-            dos.writeShort((short) (exceptionTableLen / 4));
-            if (DEBUG) debugMessage("\texception table length = " + (exceptionTableLen / 4));
+            dos.writeShort((short) exceptionTableLen);
+            if (DEBUG) debugMessage("\texception table length = " + exceptionTableLen);
 
             if (exceptionTableLen != 0) {
-                for (int e = 0; e < exceptionTableLen; e += 4) {
-                     dos.writeShort((short) exceptionTable.getIntAt(e));
-                     dos.writeShort((short) exceptionTable.getIntAt(e + 1));
-                     dos.writeShort((short) exceptionTable.getIntAt(e + 2));
-                     dos.writeShort((short) exceptionTable.getIntAt(e + 3));
+                for (int e = 0; e < exceptionTableLen; e++) {
+                     dos.writeShort((short) exceptionTable[e].getStartPC());
+                     dos.writeShort((short) exceptionTable[e].getEndPC());
+                     dos.writeShort((short) exceptionTable[e].getHandlerPC());
+                     dos.writeShort((short) exceptionTable[e].getCatchTypeIndex());
                 }
             }
 
--- a/agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -783,37 +783,39 @@
                        });
 
          // display exception table for this method
-         TypeArray exceptionTable = method.getExceptionTable();
-         // exception table is 4 tuple array of shorts
-         int numEntries = (int)exceptionTable.getLength() / 4;
-         if (numEntries != 0) {
-            buf.h4("Exception Table");
-            buf.beginTable(1);
-            buf.beginTag("tr");
-            buf.headerCell("start bci");
-            buf.headerCell("end bci");
-            buf.headerCell("handler bci");
-            buf.headerCell("catch type");
-            buf.endTag("tr");
-
-            for (int e = 0; e < numEntries; e += 4) {
+         boolean hasException = method.hasExceptionTable();
+         if (hasException) {
+            ExceptionTableElement[] exceptionTable = method.getExceptionTable();
+            int numEntries = exceptionTable.length;
+            if (numEntries != 0) {
+               buf.h4("Exception Table");
+               buf.beginTable(1);
                buf.beginTag("tr");
-               buf.cell(Integer.toString(exceptionTable.getIntAt(e)));
-               buf.cell(Integer.toString(exceptionTable.getIntAt(e + 1)));
-               buf.cell(Integer.toString(exceptionTable.getIntAt(e + 2)));
-               short cpIndex = (short) exceptionTable.getIntAt(e + 3);
-               ConstantPool.CPSlot obj = cpIndex == 0? null : cpool.getSlotAt(cpIndex);
-               if (obj == null) {
-                  buf.cell("Any");
-               } else if (obj.isMetaData()) {
-                 buf.cell(obj.getSymbol().asString().replace('/', '.'));
-               } else {
-                 buf.cell(genKlassLink((InstanceKlass)obj.getOop()));
+               buf.headerCell("start bci");
+               buf.headerCell("end bci");
+               buf.headerCell("handler bci");
+               buf.headerCell("catch type");
+               buf.endTag("tr");
+
+               for (int e = 0; e < numEntries; e ++) {
+                  buf.beginTag("tr");
+                  buf.cell(Integer.toString(exceptionTable[e].getStartPC()));
+                  buf.cell(Integer.toString(exceptionTable[e].getEndPC()));
+                  buf.cell(Integer.toString(exceptionTable[e].getHandlerPC()));
+                  short cpIndex = (short) exceptionTable[e].getCatchTypeIndex();
+                  ConstantPool.CPSlot obj = cpIndex == 0? null : cpool.getSlotAt(cpIndex);
+                  if (obj == null) {
+                     buf.cell("Any");
+                  } else if (obj.isMetaData()) {
+                     buf.cell(obj.getSymbol().asString().replace('/', '.'));
+                  } else {
+                     buf.cell(genKlassLink((InstanceKlass)obj.getOop()));
+                  }
+                  buf.endTag("tr");
                }
-               buf.endTag("tr");
+
+               buf.endTable();
             }
-
-            buf.endTable();
          }
 
          // display constant pool hyperlink
--- a/agent/src/share/classes/sun/jvm/hotspot/utilities/BasicHashtable.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/BasicHashtable.java	Fri Aug 03 20:23:25 2012 +0100
@@ -41,10 +41,10 @@
   }
 
   private static synchronized void initialize(TypeDataBase db) {
-    Type type = db.lookupType("BasicHashtable");
+    Type type = db.lookupType("BasicHashtable<mtInternal>");
     tableSizeField = type.getCIntegerField("_table_size");
     bucketsField   = type.getAddressField("_buckets");
-    bucketSize = db.lookupType("HashtableBucket").getSize();
+    bucketSize = db.lookupType("HashtableBucket<mtInternal>").getSize();
   }
 
   // Fields
--- a/agent/src/share/classes/sun/jvm/hotspot/utilities/BasicHashtableEntry.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/BasicHashtableEntry.java	Fri Aug 03 20:23:25 2012 +0100
@@ -41,7 +41,7 @@
   }
 
   private static synchronized void initialize(TypeDataBase db) {
-    Type type = db.lookupType("BasicHashtableEntry");
+    Type type = db.lookupType("BasicHashtableEntry<mtInternal>");
     hashField      = type.getCIntegerField("_hash");
     nextField      = type.getAddressField("_next");
   }
--- a/agent/src/share/classes/sun/jvm/hotspot/utilities/Hashtable.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/Hashtable.java	Fri Aug 03 20:23:25 2012 +0100
@@ -40,7 +40,7 @@
 
   private static synchronized void initialize(TypeDataBase db) {
     // just to confirm that type exists
-    Type type = db.lookupType("Hashtable<intptr_t>");
+    Type type = db.lookupType("IntptrHashtable");
   }
 
   // derived class may return Class<? extends HashtableEntry>
--- a/agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableBucket.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableBucket.java	Fri Aug 03 20:23:25 2012 +0100
@@ -39,7 +39,7 @@
   }
 
   private static synchronized void initialize(TypeDataBase db) {
-    Type type = db.lookupType("HashtableBucket");
+    Type type = db.lookupType("HashtableBucket<mtInternal>");
     entryField = type.getAddressField("_entry");
   }
 
--- a/agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableEntry.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableEntry.java	Fri Aug 03 20:23:25 2012 +0100
@@ -41,7 +41,7 @@
   }
 
   private static synchronized void initialize(TypeDataBase db) {
-    Type type = db.lookupType("HashtableEntry<intptr_t>");
+    Type type = db.lookupType("IntptrHashtableEntry");
     literalField   = type.getAddressField("_literal");
   }
 
--- a/agent/src/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -85,6 +85,21 @@
       this(new ProcImageClassLoader());
    }
 
+   static void debugPrintln(String msg) {
+      if (DEBUG) {
+         System.err.println("DEBUG>" + msg);
+      }
+   }
+
+   static void debugPrintStackTrace(Exception exp) {
+      if (DEBUG) {
+         StackTraceElement[] els = exp.getStackTrace();
+         for (int i = 0; i < els.length; i++) {
+            System.err.println("DEBUG>" + els[i].toString());
+         }
+      }
+   }
+
    public Object readObject(Oop oop) throws ClassNotFoundException {
       if (oop instanceof Instance) {
          return readInstance((Instance) oop);
@@ -120,13 +135,96 @@
    }
 
    protected Symbol javaLangString;
+   protected Symbol javaUtilHashtableEntry;
+   protected Symbol javaUtilHashtable;
+   protected Symbol javaUtilProperties;
+
+   protected Symbol getVMSymbol(String name) {
+      return VM.getVM().getSymbolTable().probe(name);
+   }
+
    protected Symbol javaLangString() {
       if (javaLangString == null) {
-         javaLangString = VM.getVM().getSymbolTable().probe("java/lang/String");
+         javaLangString = getVMSymbol("java/lang/String");
       }
       return javaLangString;
    }
 
+   protected Symbol javaUtilHashtableEntry() {
+      if (javaUtilHashtableEntry == null) {
+         javaUtilHashtableEntry = getVMSymbol("java/util/Hashtable$Entry");
+      }
+      return javaUtilHashtableEntry;
+   }
+
+   protected Symbol javaUtilHashtable() {
+      if (javaUtilHashtable == null) {
+         javaUtilHashtable = getVMSymbol("java/util/Hashtable");
+      }
+      return javaUtilHashtable;
+   }
+
+   protected Symbol javaUtilProperties() {
+      if (javaUtilProperties == null) {
+         javaUtilProperties = getVMSymbol("java/util/Properties");
+      }
+      return javaUtilProperties;
+   }
+
+   private void setHashtableEntry(java.util.Hashtable p, Oop oop) {
+      InstanceKlass ik = (InstanceKlass)oop.getKlass();
+      OopField keyField = (OopField)ik.findField("key", "Ljava/lang/Object;");
+      OopField valueField = (OopField)ik.findField("value", "Ljava/lang/Object;");
+      OopField nextField = (OopField)ik.findField("next", "Ljava/util/Hashtable$Entry;");
+      if (DEBUG) {
+         if (Assert.ASSERTS_ENABLED) {
+            Assert.that(ik.getName().equals(javaUtilHashtableEntry()), "Not a Hashtable$Entry?");
+            Assert.that(keyField != null && valueField != null && nextField != null, "Invalid fields!");
+         }
+      }
+
+      Object key = null;
+      Object value = null;
+      Oop next = null;
+      try {
+         key = readObject(keyField.getValue(oop));
+         value = readObject(valueField.getValue(oop));
+         next =  (Oop)nextField.getValue(oop);
+         // For Properties, should use setProperty(k, v). Since it only runs in SA
+         // using put(k, v) should be OK.
+         p.put(key, value);
+         if (next != null) {
+            setHashtableEntry(p, next);
+         }
+      } catch (ClassNotFoundException ce) {
+         if( DEBUG) {
+            debugPrintln("Class not found " + ce);
+            debugPrintStackTrace(ce);
+         }
+      }
+   }
+
+   protected Object getHashtable(Instance oop, boolean isProperties) {
+      InstanceKlass k = (InstanceKlass)oop.getKlass();
+      OopField tableField = (OopField)k.findField("table", "[Ljava/util/Hashtable$Entry;");
+      if (tableField == null) {
+         debugPrintln("Could not find field of [Ljava/util/Hashtable$Entry;");
+         return null;
+      }
+      java.util.Hashtable table = (isProperties) ? new java.util.Properties()
+                                                 : new java.util.Hashtable();
+      ObjArray kvs = (ObjArray)tableField.getValue(oop);
+      long size = kvs.getLength();
+      debugPrintln("Hashtable$Entry Size = " + size);
+      for (long i=0; i<size; i++) {
+         Oop entry = kvs.getObjAt(i);
+         if (entry != null && entry.isInstance()) {
+            setHashtableEntry(table, entry);
+         }
+      }
+      return table;
+   }
+
    public Object readInstance(Instance oop) throws ClassNotFoundException {
       Object result = getFromObjTable(oop);
       if (result == null) {
@@ -134,11 +232,21 @@
          // Handle java.lang.String instances differently. As part of JSR-133, fields of immutable
          // classes have been made final. The algorithm below will not be able to read Strings from
          // debuggee (can't use reflection to set final fields). But, need to read Strings is very
-         // important. FIXME: need a framework to handle many other special cases.
+         // important.
+         // Same for Hashtable, key and hash are final, could not be set in the algorithm too.
+         // FIXME: need a framework to handle many other special cases.
          if (kls.getName().equals(javaLangString())) {
             return OopUtilities.stringOopToString(oop);
          }
 
+         if (kls.getName().equals(javaUtilHashtable())) {
+            return getHashtable(oop, false);
+         }
+
+         if (kls.getName().equals(javaUtilProperties())) {
+            return getHashtable(oop, true);
+         }
+
          Class clz = readClass(kls);
          try {
             result = clz.newInstance();
@@ -164,8 +272,8 @@
                   break;
                } catch (Exception exp) {
                   if (DEBUG) {
-                     System.err.println("Can't create object using " + c);
-                     exp.printStackTrace();
+                     debugPrintln("Can't create object using " + c);
+                     debugPrintStackTrace(exp);
                   }
                }
             }
@@ -329,8 +437,8 @@
                                      arrayObj[ifd.getIndex()] = readObject(field.getValue(getObj()));
                                   } catch (Exception e) {
                                      if (DEBUG) {
-                                        System.err.println("Array element set failed for " + ifd);
-                                        e.printStackTrace();
+                                        debugPrintln("Array element set failed for " + ifd);
+                                        debugPrintStackTrace(e);
                                      }
                                   }
                                }
@@ -348,8 +456,8 @@
 
       private void printFieldSetError(java.lang.reflect.Field f, Exception ex) {
          if (DEBUG) {
-            if (f != null) System.err.println("Field set failed for " + f);
-            ex.printStackTrace();
+            if (f != null) debugPrintln("Field set failed for " + f);
+            debugPrintStackTrace(ex);
          }
       }
 
@@ -601,7 +709,7 @@
             return Class.forName(className, true, cl);
          } catch (Exception e) {
             if (DEBUG) {
-               System.err.println("Can't load class " + className);
+               debugPrintln("Can't load class " + className);
             }
             throw new RuntimeException(e);
          }
--- a/make/bsd/makefiles/jvmg.make	Thu Aug 02 17:00:18 2012 +0100
+++ b/make/bsd/makefiles/jvmg.make	Fri Aug 03 20:23:25 2012 +0100
@@ -27,7 +27,9 @@
 # Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make
 DEBUG_CFLAGS/DEFAULT= $(DEBUG_CFLAGS)
 DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@))
-CFLAGS += $(DEBUG_CFLAGS/BYFILE)
+
+# _NMT_NOINLINE_ informs NMT that no inlining by Compiler
+CFLAGS += $(DEBUG_CFLAGS/BYFILE) -D_NMT_NOINLINE_
 
 # Set the environment variable HOTSPARC_GENERIC to "true"
 # to inhibit the effect of the previous line on CFLAGS.
--- a/make/bsd/makefiles/universal.gmk	Thu Aug 02 17:00:18 2012 +0100
+++ b/make/bsd/makefiles/universal.gmk	Fri Aug 03 20:23:25 2012 +0100
@@ -110,4 +110,5 @@
 
 .PHONY:	universal_product universal_fastdebug universal_debug \
 	all_product_universal all_fastdebug_universal all_debug_universal \
-	universalize export_universal copy_universal
+	universalize export_universal copy_universal \
+	$(UNIVERSAL_LIPO_LIST) $(UNIVERSAL_COPY_LIST)
--- a/make/hotspot_version	Thu Aug 02 17:00:18 2012 +0100
+++ b/make/hotspot_version	Fri Aug 03 20:23:25 2012 +0100
@@ -35,7 +35,7 @@
 
 HS_MAJOR_VER=24
 HS_MINOR_VER=0
-HS_BUILD_NUMBER=14
+HS_BUILD_NUMBER=18
 
 JDK_MAJOR_VER=1
 JDK_MINOR_VER=8
--- a/make/jprt.properties	Thu Aug 02 17:00:18 2012 +0100
+++ b/make/jprt.properties	Fri Aug 03 20:23:25 2012 +0100
@@ -102,6 +102,11 @@
 jprt.my.linux.armvfp.jdk7u6=${jprt.my.linux.armvfp.jdk7}
 jprt.my.linux.armvfp=${jprt.my.linux.armvfp.${jprt.tools.default.release}}
 
+jprt.my.linux.armv6.jdk8=linux_armv6_2.6
+jprt.my.linux.armv6.jdk7=linux_armv6_2.6
+jprt.my.linux.armv6.jdk7u6=${jprt.my.linux.armv6.jdk7}
+jprt.my.linux.armv6=${jprt.my.linux.armv6.${jprt.tools.default.release}}
+
 jprt.my.linux.armsflt.jdk8=linux_armsflt_2.6
 jprt.my.linux.armsflt.jdk7=linux_armsflt_2.6
 jprt.my.linux.armsflt.jdk7u6=${jprt.my.linux.armsflt.jdk7}
@@ -134,7 +139,7 @@
     ${jprt.my.macosx.x64}-{product|fastdebug|debug}, \
     ${jprt.my.windows.i586}-{product|fastdebug|debug}, \
     ${jprt.my.windows.x64}-{product|fastdebug|debug}, \
-    ${jprt.my.linux.armvfp}-{product|fastdebug}
+    ${jprt.my.linux.armv6}-{product|fastdebug}
 
 jprt.build.targets.open= \
     ${jprt.my.solaris.i586}-{productOpen}, \
--- a/make/linux/makefiles/jvmg.make	Thu Aug 02 17:00:18 2012 +0100
+++ b/make/linux/makefiles/jvmg.make	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 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
@@ -27,7 +27,9 @@
 # Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make
 DEBUG_CFLAGS/DEFAULT= $(DEBUG_CFLAGS)
 DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@))
-CFLAGS += $(DEBUG_CFLAGS/BYFILE)
+
+# _NMT_NOINLINE_ informs NMT that no inlining by Compiler
+CFLAGS += $(DEBUG_CFLAGS/BYFILE) -D_NMT_NOINLINE_
 
 # Set the environment variable HOTSPARC_GENERIC to "true"
 # to inhibit the effect of the previous line on CFLAGS.
--- a/make/pic.make	Thu Aug 02 17:00:18 2012 +0100
+++ b/make/pic.make	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2006, 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
@@ -30,6 +30,13 @@
 
 ifneq ($(OSNAME), windows)
   ifndef LP64
+    PARTIAL_NONPIC=1
+  endif
+  PIC_ARCH = ppc
+  ifneq ("$(filter $(PIC_ARCH),$(BUILDARCH))","")
+    PARTIAL_NONPIC=0
+  endif
+  ifeq ($(PARTIAL_NONPIC),1)
     NONPIC_DIRS  = memory oops gc_implementation gc_interface 
     NONPIC_DIRS  := $(foreach dir,$(NONPIC_DIRS), $(GAMMADIR)/src/share/vm/$(dir))
     # Look for source files under NONPIC_DIRS
--- a/make/solaris/makefiles/add_gnu_debuglink.make	Thu Aug 02 17:00:18 2012 +0100
+++ b/make/solaris/makefiles/add_gnu_debuglink.make	Fri Aug 03 20:23:25 2012 +0100
@@ -24,8 +24,11 @@
 
 # Rules to build add_gnu_debuglink, used by vm.make on Solaris
 
-GENERATED                 = ../generated
-ADD_GNU_DEBUGLINK         = $(GENERATED)/add_gnu_debuglink
+# Allow $(ADD_GNU_DEBUGLINK) to be called from any directory.
+# We don't set or use the GENERATED macro to avoid affecting
+# other HotSpot Makefiles.
+TOPDIR                    = $(shell echo `pwd`)
+ADD_GNU_DEBUGLINK         = $(TOPDIR)/../generated/add_gnu_debuglink
 
 ADD_GNU_DEBUGLINK_DIR     = $(GAMMADIR)/src/os/solaris/add_gnu_debuglink
 ADD_GNU_DEBUGLINK_SRC     = $(ADD_GNU_DEBUGLINK_DIR)/add_gnu_debuglink.c
--- a/make/solaris/makefiles/defs.make	Thu Aug 02 17:00:18 2012 +0100
+++ b/make/solaris/makefiles/defs.make	Fri Aug 03 20:23:25 2012 +0100
@@ -203,10 +203,18 @@
       EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.diz
       EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm_db.diz
       EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm_dtrace.diz
+      ifeq ($(ARCH_DATA_MODEL),32)
+        EXPORT_LIST += $(EXPORT_SERVER_DIR)/64/libjvm_db.diz
+        EXPORT_LIST += $(EXPORT_SERVER_DIR)/64/libjvm_dtrace.diz
+      endif
     else
       EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.debuginfo
       EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm_db.debuginfo
       EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm_dtrace.debuginfo
+      ifeq ($(ARCH_DATA_MODEL),32)
+        EXPORT_LIST += $(EXPORT_SERVER_DIR)/64/libjvm_db.debuginfo
+        EXPORT_LIST += $(EXPORT_SERVER_DIR)/64/libjvm_dtrace.debuginfo
+      endif
     endif
   endif
 endif
--- a/make/solaris/makefiles/dtrace.make	Thu Aug 02 17:00:18 2012 +0100
+++ b/make/solaris/makefiles/dtrace.make	Fri Aug 03 20:23:25 2012 +0100
@@ -94,23 +94,24 @@
 # Making 64/libjvm_db.so: 64-bit version of libjvm_db.so which handles 32-bit libjvm.so
 ifneq ("${ISA}","${BUILDARCH}")
 
-XLIBJVM_DB = 64/$(LIBJVM_DB)
-XLIBJVM_DB_G = 64/$(LIBJVM_DB_G)
-XLIBJVM_DTRACE = 64/$(LIBJVM_DTRACE)
-XLIBJVM_DTRACE_G = 64/$(LIBJVM_DTRACE_G)
+XLIBJVM_DIR = 64
+XLIBJVM_DB = $(XLIBJVM_DIR)/$(LIBJVM_DB)
+XLIBJVM_DB_G = $(XLIBJVM_DIR)/$(LIBJVM_DB_G)
+XLIBJVM_DTRACE = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE)
+XLIBJVM_DTRACE_G = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE_G)
 
-XLIBJVM_DB_DEBUGINFO       = 64/$(LIBJVM_DB_DEBUGINFO)
-XLIBJVM_DB_DIZ             = 64/$(LIBJVM_DB_DIZ)
-XLIBJVM_DB_G_DEBUGINFO     = 64/$(LIBJVM_DB_G_DEBUGINFO)
-XLIBJVM_DB_G_DIZ           = 64/$(LIBJVM_DB_G_DIZ)
-XLIBJVM_DTRACE_DEBUGINFO   = 64/$(LIBJVM_DTRACE_DEBUGINFO)
-XLIBJVM_DTRACE_DIZ         = 64/$(LIBJVM_DTRACE_DIZ)
-XLIBJVM_DTRACE_G_DEBUGINFO = 64/$(LIBJVM_DTRACE_G_DEBUGINFO)
-XLIBJVM_DTRACE_G_DIZ       = 64/$(LIBJVM_DTRACE_G_DIZ)
+XLIBJVM_DB_DEBUGINFO       = $(XLIBJVM_DIR)/$(LIBJVM_DB_DEBUGINFO)
+XLIBJVM_DB_DIZ             = $(XLIBJVM_DIR)/$(LIBJVM_DB_DIZ)
+XLIBJVM_DB_G_DEBUGINFO     = $(XLIBJVM_DIR)/$(LIBJVM_DB_G_DEBUGINFO)
+XLIBJVM_DB_G_DIZ           = $(XLIBJVM_DIR)/$(LIBJVM_DB_G_DIZ)
+XLIBJVM_DTRACE_DEBUGINFO   = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE_DEBUGINFO)
+XLIBJVM_DTRACE_DIZ         = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE_DIZ)
+XLIBJVM_DTRACE_G_DEBUGINFO = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE_G_DEBUGINFO)
+XLIBJVM_DTRACE_G_DIZ       = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE_G_DIZ)
 
 $(XLIBJVM_DB): $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) $(DTRACE_SRCDIR)/$(JVM_DB).c $(JVMOFFS).h $(LIBJVM_DB_MAPFILE)
 	@echo Making $@
-	$(QUIETLY) mkdir -p 64/ ; \
+	$(QUIETLY) mkdir -p $(XLIBJVM_DIR) ; \
 	$(CC) $(SYMFLAG) $(ARCHFLAG/$(ISA)) -D$(TYPE) -I. -I$(GENERATED) \
 		$(SHARED_FLAG) $(LFLAGS_JVM_DB) -o $@ $(DTRACE_SRCDIR)/$(JVM_DB).c -lc
 	[ -f $(XLIBJVM_DB_G) ] || { ln -s $(LIBJVM_DB) $(XLIBJVM_DB_G); }
@@ -124,8 +125,10 @@
 	$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(XLIBJVM_DB_DEBUGINFO)
 # $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
 # Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available.
-#	$(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(XLIBJVM_DB_DEBUGINFO) $@
-	$(QUIETLY) $(ADD_GNU_DEBUGLINK) $(XLIBJVM_DB_DEBUGINFO) $@
+#         $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DB_DEBUGINFO) $(LIBJVM_DB) ;
+# Do this part in the $(XLIBJVM_DIR) subdir so $(XLIBJVM_DIR) is not
+# in the link name:
+	( cd $(XLIBJVM_DIR) && $(ADD_GNU_DEBUGLINK) $(LIBJVM_DB_DEBUGINFO) $(LIBJVM_DB) )
   ifeq ($(STRIP_POLICY),all_strip)
 	$(QUIETLY) $(STRIP) $@
   else
@@ -134,17 +137,19 @@
     # implied else here is no stripping at all
     endif
   endif
-	[ -f $(XLIBJVM_DB_G_DEBUGINFO) ] || { ln -s $(XLIBJVM_DB_DEBUGINFO) $(XLIBJVM_DB_G_DEBUGINFO); }
+	[ -f $(XLIBJVM_DB_G_DEBUGINFO) ] || { cd $(XLIBJVM_DIR) && ln -s $(LIBJVM_DB_DEBUGINFO) $(LIBJVM_DB_G_DEBUGINFO); }
   ifeq ($(ZIP_DEBUGINFO_FILES),1)
-	$(ZIPEXE) -q -y $(XLIBJVM_DB_DIZ) $(XLIBJVM_DB_DEBUGINFO) $(XLIBJVM_DB_G_DEBUGINFO)
+# Do this part in the $(XLIBJVM_DIR) subdir so $(XLIBJVM_DIR) is not
+# in the archived name:
+	( cd $(XLIBJVM_DIR) && $(ZIPEXE) -q -y $(LIBJVM_DB_DIZ) $(LIBJVM_DB_DEBUGINFO) $(LIBJVM_DB_G_DEBUGINFO) )
 	$(RM) $(XLIBJVM_DB_DEBUGINFO) $(XLIBJVM_DB_G_DEBUGINFO)
-	[ -f $(XLIBJVM_DB_G_DIZ) ] || { ln -s $(XLIBJVM_DB_DIZ) $(XLIBJVM_DB_G_DIZ); }
+	[ -f $(XLIBJVM_DB_G_DIZ) ] || { cd $(XLIBJVM_DIR) && ln -s $(LIBJVM_DB_DIZ) $(LIBJVM_DB_G_DIZ); }
   endif
 endif
 
 $(XLIBJVM_DTRACE): $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) $(DTRACE_SRCDIR)/$(JVM_DTRACE).c $(DTRACE_SRCDIR)/$(JVM_DTRACE).h $(LIBJVM_DTRACE_MAPFILE)
 	@echo Making $@
-	$(QUIETLY) mkdir -p 64/ ; \
+	$(QUIETLY) mkdir -p $(XLIBJVM_DIR) ; \
 	$(CC) $(SYMFLAG) $(ARCHFLAG/$(ISA)) -D$(TYPE) -I. \
 		$(SHARED_FLAG) $(LFLAGS_JVM_DTRACE) -o $@ $(DTRACE_SRCDIR)/$(JVM_DTRACE).c -lc -lthread -ldoor
 	[ -f $(XLIBJVM_DTRACE_G) ] || { ln -s $(LIBJVM_DTRACE) $(XLIBJVM_DTRACE_G); }
@@ -153,8 +158,10 @@
 	$(QUIETLY) $(FIX_EMPTY_SEC_HDR_FLAGS) $@
 	$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(XLIBJVM_DTRACE_DEBUGINFO)
 # $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
-#	$(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(XLIBJVM_DTRACE_DEBUGINFO) $@
-	$(QUIETLY) $(ADD_GNU_DEBUGLINK) $(XLIBJVM_DTRACE_DEBUGINFO) $@
+#         $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DTRACE_DEBUGINFO) $(LIBJVM_DTRACE) ;
+# Do this part in the $(XLIBJVM_DIR) subdir so $(XLIBJVM_DIR) is not
+# in the link name:
+	( cd $(XLIBJVM_DIR) && $(ADD_GNU_DEBUGLINK) $(LIBJVM_DTRACE_DEBUGINFO) $(LIBJVM_DTRACE) )
   ifeq ($(STRIP_POLICY),all_strip)
 	$(QUIETLY) $(STRIP) $@
   else
@@ -163,11 +170,13 @@
     # implied else here is no stripping at all
     endif
   endif
-	[ -f $(XLIBJVM_DTRACE_G_DEBUGINFO) ] || { ln -s $(XLIBJVM_DTRACE_DEBUGINFO) $(XLIBJVM_DTRACE_G_DEBUGINFO); }
+	[ -f $(XLIBJVM_DTRACE_G_DEBUGINFO) ] || { cd $(XLIBJVM_DIR) && ln -s $(LIBJVM_DTRACE_DEBUGINFO) $(LIBJVM_DTRACE_G_DEBUGINFO); }
   ifeq ($(ZIP_DEBUGINFO_FILES),1)
-	$(ZIPEXE) -q -y $(XLIBJVM_DTRACE_DIZ) $(XLIBJVM_DTRACE_DEBUGINFO) $(XLIBJVM_DTRACE_G_DEBUGINFO)
+# Do this part in the $(XLIBJVM_DIR) subdir so $(XLIBJVM_DIR) is not
+# in the archived name:
+	( cd $(XLIBJVM_DIR) && $(ZIPEXE) -q -y $(LIBJVM_DTRACE_DIZ) $(LIBJVM_DTRACE_DEBUGINFO) $(LIBJVM_DTRACE_G_DEBUGINFO) )
 	$(RM) $(XLIBJVM_DTRACE_DEBUGINFO) $(XLIBJVM_DTRACE_G_DEBUGINFO)
-	[ -f $(XLIBJVM_DTRACE_G_DIZ) ] || { ln -s $(XLIBJVM_DTRACE_DIZ) $(XLIBJVM_DTRACE_G_DIZ); }
+	[ -f $(XLIBJVM_DTRACE_G_DIZ) ] || { cd $(XLIBJVM_DIR) && ln -s $(LIBJVM_DTRACE_DIZ) $(LIBJVM_DTRACE_G_DIZ); }
   endif
 endif
 
--- a/make/solaris/makefiles/fastdebug.make	Thu Aug 02 17:00:18 2012 +0100
+++ b/make/solaris/makefiles/fastdebug.make	Fri Aug 03 20:23:25 2012 +0100
@@ -36,6 +36,11 @@
 ifeq ("${Platform_compiler}", "sparcWorks")
 OPT_CFLAGS/SLOWER = -xO2
 
+ifeq ($(COMPILER_REV_NUMERIC), 510)
+# CC 5.10 has bug XXXXX with -xO4
+OPT_CFLAGS/jvmtiClassFileReconstituter.o = $(OPT_CFLAGS/SLOWER)
+endif # COMPILER_REV_NUMERIC == 510
+
 ifeq ($(COMPILER_REV_NUMERIC), 509)
 # To avoid jvm98 crash
 OPT_CFLAGS/instanceKlass.o = $(OPT_CFLAGS/SLOWER)
--- a/make/solaris/makefiles/fix_empty_sec_hdr_flags.make	Thu Aug 02 17:00:18 2012 +0100
+++ b/make/solaris/makefiles/fix_empty_sec_hdr_flags.make	Fri Aug 03 20:23:25 2012 +0100
@@ -24,8 +24,11 @@
 
 # Rules to build fix_empty_sec_hdr_flags, used by vm.make on Solaris
 
-GENERATED                       = ../generated
-FIX_EMPTY_SEC_HDR_FLAGS         = $(GENERATED)/fix_empty_sec_hdr_flags
+# Allow $(FIX_EMPTY_SEC_HDR_FLAGS) to be called from any directory.
+# We don't set or use the GENERATED macro to avoid affecting
+# other HotSpot Makefiles.
+TOPDIR                          = $(shell echo `pwd`)
+FIX_EMPTY_SEC_HDR_FLAGS         = $(TOPDIR)/../generated/fix_empty_sec_hdr_flags
 
 FIX_EMPTY_SEC_HDR_FLAGS_DIR     = $(GAMMADIR)/src/os/solaris/fix_empty_sec_hdr_flags
 FIX_EMPTY_SEC_HDR_FLAGS_SRC     = $(FIX_EMPTY_SEC_HDR_FLAGS_DIR)/fix_empty_sec_hdr_flags.c
--- a/make/solaris/makefiles/jvmg.make	Thu Aug 02 17:00:18 2012 +0100
+++ b/make/solaris/makefiles/jvmg.make	Fri Aug 03 20:23:25 2012 +0100
@@ -37,7 +37,8 @@
 endif
 endif
 
-CFLAGS += $(DEBUG_CFLAGS/BYFILE)
+# _NMT_NOINLINE_ informs NMT that no inlining by Compiler
+CFLAGS += $(DEBUG_CFLAGS/BYFILE) -D_NMT_NOINLINE_
 
 # Set the environment variable HOTSPARC_GENERIC to "true"
 # to inhibit the effect of the previous line on CFLAGS.
--- a/make/solaris/makefiles/optimized.make	Thu Aug 02 17:00:18 2012 +0100
+++ b/make/solaris/makefiles/optimized.make	Fri Aug 03 20:23:25 2012 +0100
@@ -32,6 +32,11 @@
 # (OPT_CFLAGS/SLOWER is also available, to alter compilation of buggy files)
 ifeq ("${Platform_compiler}", "sparcWorks")
 
+ifeq ($(COMPILER_REV_NUMERIC), 510)
+# CC 5.10 has bug XXXXX with -xO4
+OPT_CFLAGS/jvmtiClassFileReconstituter.o = $(OPT_CFLAGS/O2)
+endif # COMPILER_REV_NUMERIC == 510
+
 ifeq ($(shell expr $(COMPILER_REV_NUMERIC) \>= 509), 1)
 # dtrace cannot handle tail call optimization (6672627, 6693876)
 OPT_CFLAGS/jni.o = $(OPT_CFLAGS/DEFAULT) $(OPT_CCFLAGS/NO_TAIL_CALL_OPT)
--- a/make/solaris/makefiles/product.make	Thu Aug 02 17:00:18 2012 +0100
+++ b/make/solaris/makefiles/product.make	Fri Aug 03 20:23:25 2012 +0100
@@ -40,6 +40,11 @@
 # (OPT_CFLAGS/SLOWER is also available, to alter compilation of buggy files)
 ifeq ("${Platform_compiler}", "sparcWorks")
 
+ifeq ($(COMPILER_REV_NUMERIC), 510)
+# CC 5.10 has bug XXXXX with -xO4
+OPT_CFLAGS/jvmtiClassFileReconstituter.o = $(OPT_CFLAGS/O2)
+endif # COMPILER_REV_NUMERIC == 510
+
 ifeq ($(shell expr $(COMPILER_REV_NUMERIC) \>= 509), 1)
 # dtrace cannot handle tail call optimization (6672627, 6693876)
 OPT_CFLAGS/jni.o = $(OPT_CFLAGS/DEFAULT) $(OPT_CCFLAGS/NO_TAIL_CALL_OPT)
--- a/make/windows/makefiles/debug.make	Thu Aug 02 17:00:18 2012 +0100
+++ b/make/windows/makefiles/debug.make	Fri Aug 03 20:23:25 2012 +0100
@@ -38,7 +38,8 @@
 !include ../local.make
 !include compile.make
 
-CXX_FLAGS=$(CXX_FLAGS) $(DEBUG_OPT_OPTION)
+# _NMT_NOINLINE_ informs NMT that no inlining by Compiler
+CXX_FLAGS=$(CXX_FLAGS) $(DEBUG_OPT_OPTION) /D "_NMT_NOINLINE_"
 
 !include $(WorkSpace)/make/windows/makefiles/vm.make
 !include local.make
--- a/src/cpu/sparc/vm/sparc.ad	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/cpu/sparc/vm/sparc.ad	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+// Copyright (c) 1998, 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
@@ -678,18 +678,26 @@
 
 static inline jdouble replicate_immI(int con, int count, int width) {
   // Load a constant replicated "count" times with width "width"
+  assert(count*width == 8 && width <= 4, "sanity");
   int bit_width = width * 8;
-  jlong elt_val = con;
-  elt_val &= (((jlong) 1) << bit_width) - 1;  // mask off sign bits
-  jlong val = elt_val;
+  jlong val = con;
+  val &= (((jlong) 1) << bit_width) - 1;  // mask off sign bits
   for (int i = 0; i < count - 1; i++) {
-    val <<= bit_width;
-    val |= elt_val;
+    val |= (val << bit_width);
   }
   jdouble dval = *((jdouble*) &val);  // coerce to double type
   return dval;
 }
 
+static inline jdouble replicate_immF(float con) {
+  // Replicate float con 2 times and pack into vector.
+  int val = *((int*)&con);
+  jlong lval = val;
+  lval = (lval << 32) | (lval & 0xFFFFFFFFl);
+  jdouble dval = *((jdouble*) &lval);  // coerce to double type
+  return dval;
+}
+
 // Standard Sparc opcode form2 field breakdown
 static inline void emit2_19(CodeBuffer &cbuf, int f30, int f29, int f25, int f22, int f20, int f19, int f0 ) {
   f0 &= (1<<19)-1;     // Mask displacement to 19 bits
@@ -791,6 +799,7 @@
     case Assembler::stdf_op3: st_op = Op_StoreD; break;
 
     case Assembler::ldsb_op3: ld_op = Op_LoadB; break;
+    case Assembler::ldub_op3: ld_op = Op_LoadUB; break;
     case Assembler::lduh_op3: ld_op = Op_LoadUS; break;
     case Assembler::ldsh_op3: ld_op = Op_LoadS; break;
     case Assembler::ldx_op3:  // may become LoadP or stay LoadI
@@ -799,7 +808,6 @@
     case Assembler::ldd_op3:  ld_op = Op_LoadL; break;
     case Assembler::ldf_op3:  ld_op = Op_LoadF; break;
     case Assembler::lddf_op3: ld_op = Op_LoadD; break;
-    case Assembler::ldub_op3: ld_op = Op_LoadB; break;
     case Assembler::prefetch_op3: ld_op = Op_LoadI; break;
 
     default: ShouldNotReachHere();
@@ -840,10 +848,7 @@
           !(n->ideal_Opcode()==Op_PrefetchRead  && ld_op==Op_LoadI) &&
           !(n->ideal_Opcode()==Op_PrefetchWrite && ld_op==Op_LoadI) &&
           !(n->ideal_Opcode()==Op_PrefetchAllocation && ld_op==Op_LoadI) &&
-          !(n->ideal_Opcode()==Op_Load2I    && ld_op==Op_LoadD) &&
-          !(n->ideal_Opcode()==Op_Load4C    && ld_op==Op_LoadD) &&
-          !(n->ideal_Opcode()==Op_Load4S    && ld_op==Op_LoadD) &&
-          !(n->ideal_Opcode()==Op_Load8B    && ld_op==Op_LoadD) &&
+          !(n->ideal_Opcode()==Op_LoadVector && ld_op==Op_LoadD) &&
           !(n->rule() == loadUB_rule)) {
         verify_oops_warning(n, n->ideal_Opcode(), ld_op);
       }
@@ -855,9 +860,7 @@
           !(n->ideal_Opcode()==Op_StoreI && st_op==Op_StoreF) &&
           !(n->ideal_Opcode()==Op_StoreF && st_op==Op_StoreI) &&
           !(n->ideal_Opcode()==Op_StoreL && st_op==Op_StoreI) &&
-          !(n->ideal_Opcode()==Op_Store2I && st_op==Op_StoreD) &&
-          !(n->ideal_Opcode()==Op_Store4C && st_op==Op_StoreD) &&
-          !(n->ideal_Opcode()==Op_Store8B && st_op==Op_StoreD) &&
+          !(n->ideal_Opcode()==Op_StoreVector && st_op==Op_StoreD) &&
           !(n->ideal_Opcode()==Op_StoreD && st_op==Op_StoreI && n->rule() == storeD0_rule)) {
         verify_oops_warning(n, n->ideal_Opcode(), st_op);
       }
@@ -1849,16 +1852,45 @@
 address last_rethrow = NULL;  // debugging aid for Rethrow encoding
 #endif
 
+// Map Types to machine register types
+const int Matcher::base2reg[Type::lastype] = {
+  Node::NotAMachineReg,0,0, Op_RegI, Op_RegL, 0, Op_RegN,
+  Node::NotAMachineReg, Node::NotAMachineReg, /* tuple, array */
+  0, Op_RegD, 0, 0, /* Vectors */
+  Op_RegP, Op_RegP, Op_RegP, Op_RegP, Op_RegP, Op_RegP, /* the pointers */
+  0, 0/*abio*/,
+  Op_RegP /* Return address */, 0, /* the memories */
+  Op_RegF, Op_RegF, Op_RegF, Op_RegD, Op_RegD, Op_RegD,
+  0  /*bottom*/
+};
+
 // Vector width in bytes
-const uint Matcher::vector_width_in_bytes(void) {
+const int Matcher::vector_width_in_bytes(BasicType bt) {
+  assert(MaxVectorSize == 8, "");
   return 8;
 }
 
 // Vector ideal reg
-const uint Matcher::vector_ideal_reg(void) {
+const int Matcher::vector_ideal_reg(int size) {
+  assert(MaxVectorSize == 8, "");
   return Op_RegD;
 }
 
+// Limits on vector size (number of elements) loaded into vector.
+const int Matcher::max_vector_size(const BasicType bt) {
+  assert(is_java_primitive(bt), "only primitive type vectors");
+  return vector_width_in_bytes(bt)/type2aelembytes(bt);
+}
+
+const int Matcher::min_vector_size(const BasicType bt) {
+  return max_vector_size(bt); // Same as max.
+}
+
+// SPARC doesn't support misaligned vectors store/load.
+const bool Matcher::misaligned_vectors_ok() {
+  return false;
+}
+
 // USII supports fxtof through the whole range of number, USIII doesn't
 const bool Matcher::convL2FSupported(void) {
   return VM_Version::has_fast_fxtof();
@@ -3125,50 +3157,6 @@
     __ membar( Assembler::Membar_mask_bits(Assembler::StoreLoad) );
   %}
 
-  enc_class enc_repl8b( iRegI src, iRegL dst ) %{
-    MacroAssembler _masm(&cbuf);
-    Register src_reg = reg_to_register_object($src$$reg);
-    Register dst_reg = reg_to_register_object($dst$$reg);
-    __ sllx(src_reg, 56, dst_reg);
-    __ srlx(dst_reg,  8, O7);
-    __ or3 (dst_reg, O7, dst_reg);
-    __ srlx(dst_reg, 16, O7);
-    __ or3 (dst_reg, O7, dst_reg);
-    __ srlx(dst_reg, 32, O7);
-    __ or3 (dst_reg, O7, dst_reg);
-  %}
-
-  enc_class enc_repl4b( iRegI src, iRegL dst ) %{
-    MacroAssembler _masm(&cbuf);
-    Register src_reg = reg_to_register_object($src$$reg);
-    Register dst_reg = reg_to_register_object($dst$$reg);
-    __ sll(src_reg, 24, dst_reg);
-    __ srl(dst_reg,  8, O7);
-    __ or3(dst_reg, O7, dst_reg);
-    __ srl(dst_reg, 16, O7);
-    __ or3(dst_reg, O7, dst_reg);
-  %}
-
-  enc_class enc_repl4s( iRegI src, iRegL dst ) %{
-    MacroAssembler _masm(&cbuf);
-    Register src_reg = reg_to_register_object($src$$reg);
-    Register dst_reg = reg_to_register_object($dst$$reg);
-    __ sllx(src_reg, 48, dst_reg);
-    __ srlx(dst_reg, 16, O7);
-    __ or3 (dst_reg, O7, dst_reg);
-    __ srlx(dst_reg, 32, O7);
-    __ or3 (dst_reg, O7, dst_reg);
-  %}
-
-  enc_class enc_repl2i( iRegI src, iRegL dst ) %{
-    MacroAssembler _masm(&cbuf);
-    Register src_reg = reg_to_register_object($src$$reg);
-    Register dst_reg = reg_to_register_object($dst$$reg);
-    __ sllx(src_reg, 32, dst_reg);
-    __ srlx(dst_reg, 32, O7);
-    __ or3 (dst_reg, O7, dst_reg);
-  %}
-
 %}
 
 //----------FRAME--------------------------------------------------------------
@@ -5932,50 +5920,6 @@
   ins_pipe(iload_mem);
 %}
 
-// Load Aligned Packed Byte into a Double Register
-instruct loadA8B(regD dst, memory mem) %{
-  match(Set dst (Load8B mem));
-  ins_cost(MEMORY_REF_COST);
-  size(4);
-  format %{ "LDDF   $mem,$dst\t! packed8B" %}
-  opcode(Assembler::lddf_op3);
-  ins_encode(simple_form3_mem_reg( mem, dst ) );
-  ins_pipe(floadD_mem);
-%}
-
-// Load Aligned Packed Char into a Double Register
-instruct loadA4C(regD dst, memory mem) %{
-  match(Set dst (Load4C mem));
-  ins_cost(MEMORY_REF_COST);
-  size(4);
-  format %{ "LDDF   $mem,$dst\t! packed4C" %}
-  opcode(Assembler::lddf_op3);
-  ins_encode(simple_form3_mem_reg( mem, dst ) );
-  ins_pipe(floadD_mem);
-%}
-
-// Load Aligned Packed Short into a Double Register
-instruct loadA4S(regD dst, memory mem) %{
-  match(Set dst (Load4S mem));
-  ins_cost(MEMORY_REF_COST);
-  size(4);
-  format %{ "LDDF   $mem,$dst\t! packed4S" %}
-  opcode(Assembler::lddf_op3);
-  ins_encode(simple_form3_mem_reg( mem, dst ) );
-  ins_pipe(floadD_mem);
-%}
-
-// Load Aligned Packed Int into a Double Register
-instruct loadA2I(regD dst, memory mem) %{
-  match(Set dst (Load2I mem));
-  ins_cost(MEMORY_REF_COST);
-  size(4);
-  format %{ "LDDF   $mem,$dst\t! packed2I" %}
-  opcode(Assembler::lddf_op3);
-  ins_encode(simple_form3_mem_reg( mem, dst ) );
-  ins_pipe(floadD_mem);
-%}
-
 // Load Range
 instruct loadRange(iRegI dst, memory mem) %{
   match(Set dst (LoadRange mem));
@@ -6599,17 +6543,6 @@
   ins_pipe(fstoreF_mem_zero);
 %}
 
-// Store Aligned Packed Bytes in Double register to memory
-instruct storeA8B(memory mem, regD src) %{
-  match(Set mem (Store8B mem src));
-  ins_cost(MEMORY_REF_COST);
-  size(4);
-  format %{ "STDF   $src,$mem\t! packed8B" %}
-  opcode(Assembler::stdf_op3);
-  ins_encode(simple_form3_mem_reg( mem, src ) );
-  ins_pipe(fstoreD_mem_reg);
-%}
-
 // Convert oop pointer into compressed form
 instruct encodeHeapOop(iRegN dst, iRegP src) %{
   predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull);
@@ -6654,62 +6587,6 @@
 %}
 
 
-// Store Zero into Aligned Packed Bytes
-instruct storeA8B0(memory mem, immI0 zero) %{
-  match(Set mem (Store8B mem zero));
-  ins_cost(MEMORY_REF_COST);
-  size(4);
-  format %{ "STX    $zero,$mem\t! packed8B" %}
-  opcode(Assembler::stx_op3);
-  ins_encode(simple_form3_mem_reg( mem, R_G0 ) );
-  ins_pipe(fstoreD_mem_zero);
-%}
-
-// Store Aligned Packed Chars/Shorts in Double register to memory
-instruct storeA4C(memory mem, regD src) %{
-  match(Set mem (Store4C mem src));
-  ins_cost(MEMORY_REF_COST);
-  size(4);
-  format %{ "STDF   $src,$mem\t! packed4C" %}
-  opcode(Assembler::stdf_op3);
-  ins_encode(simple_form3_mem_reg( mem, src ) );
-  ins_pipe(fstoreD_mem_reg);
-%}
-
-// Store Zero into Aligned Packed Chars/Shorts
-instruct storeA4C0(memory mem, immI0 zero) %{
-  match(Set mem (Store4C mem (Replicate4C zero)));
-  ins_cost(MEMORY_REF_COST);
-  size(4);
-  format %{ "STX    $zero,$mem\t! packed4C" %}
-  opcode(Assembler::stx_op3);
-  ins_encode(simple_form3_mem_reg( mem, R_G0 ) );
-  ins_pipe(fstoreD_mem_zero);
-%}
-
-// Store Aligned Packed Ints in Double register to memory
-instruct storeA2I(memory mem, regD src) %{
-  match(Set mem (Store2I mem src));
-  ins_cost(MEMORY_REF_COST);
-  size(4);
-  format %{ "STDF   $src,$mem\t! packed2I" %}
-  opcode(Assembler::stdf_op3);
-  ins_encode(simple_form3_mem_reg( mem, src ) );
-  ins_pipe(fstoreD_mem_reg);
-%}
-
-// Store Zero into Aligned Packed Ints
-instruct storeA2I0(memory mem, immI0 zero) %{
-  match(Set mem (Store2I mem zero));
-  ins_cost(MEMORY_REF_COST);
-  size(4);
-  format %{ "STX    $zero,$mem\t! packed2I" %}
-  opcode(Assembler::stx_op3);
-  ins_encode(simple_form3_mem_reg( mem, R_G0 ) );
-  ins_pipe(fstoreD_mem_zero);
-%}
-
-
 //----------MemBar Instructions-----------------------------------------------
 // Memory barrier flavors
 
@@ -8880,150 +8757,6 @@
   ins_pipe(ialu_reg_imm);
 %}
 
-// Replicate scalar to packed byte values in Double register
-instruct Repl8B_reg_helper(iRegL dst, iRegI src) %{
-  effect(DEF dst, USE src);
-  format %{ "SLLX  $src,56,$dst\n\t"
-            "SRLX  $dst, 8,O7\n\t"
-            "OR    $dst,O7,$dst\n\t"
-            "SRLX  $dst,16,O7\n\t"
-            "OR    $dst,O7,$dst\n\t"
-            "SRLX  $dst,32,O7\n\t"
-            "OR    $dst,O7,$dst\t! replicate8B" %}
-  ins_encode( enc_repl8b(src, dst));
-  ins_pipe(ialu_reg);
-%}
-
-// Replicate scalar to packed byte values in Double register
-instruct Repl8B_reg(stackSlotD dst, iRegI src) %{
-  match(Set dst (Replicate8B src));
-  expand %{
-    iRegL tmp;
-    Repl8B_reg_helper(tmp, src);
-    regL_to_stkD(dst, tmp);
-  %}
-%}
-
-// Replicate scalar constant to packed byte values in Double register
-instruct Repl8B_immI(regD dst, immI13 con, o7RegI tmp) %{
-  match(Set dst (Replicate8B con));
-  effect(KILL tmp);
-  format %{ "LDDF   [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl8B($con)" %}
-  ins_encode %{
-    // XXX This is a quick fix for 6833573.
-    //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 8, 1)), $dst$$FloatRegister);
-    RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 8, 1)), $tmp$$Register);
-    __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
-  %}
-  ins_pipe(loadConFD);
-%}
-
-// Replicate scalar to packed char values into stack slot
-instruct Repl4C_reg_helper(iRegL dst, iRegI src) %{
-  effect(DEF dst, USE src);
-  format %{ "SLLX  $src,48,$dst\n\t"
-            "SRLX  $dst,16,O7\n\t"
-            "OR    $dst,O7,$dst\n\t"
-            "SRLX  $dst,32,O7\n\t"
-            "OR    $dst,O7,$dst\t! replicate4C" %}
-  ins_encode( enc_repl4s(src, dst) );
-  ins_pipe(ialu_reg);
-%}
-
-// Replicate scalar to packed char values into stack slot
-instruct Repl4C_reg(stackSlotD dst, iRegI src) %{
-  match(Set dst (Replicate4C src));
-  expand %{
-    iRegL tmp;
-    Repl4C_reg_helper(tmp, src);
-    regL_to_stkD(dst, tmp);
-  %}
-%}
-
-// Replicate scalar constant to packed char values in Double register
-instruct Repl4C_immI(regD dst, immI con, o7RegI tmp) %{
-  match(Set dst (Replicate4C con));
-  effect(KILL tmp);
-  format %{ "LDDF   [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl4C($con)" %}
-  ins_encode %{
-    // XXX This is a quick fix for 6833573.
-    //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 4, 2)), $dst$$FloatRegister);
-    RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 4, 2)), $tmp$$Register);
-    __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
-  %}
-  ins_pipe(loadConFD);
-%}
-
-// Replicate scalar to packed short values into stack slot
-instruct Repl4S_reg_helper(iRegL dst, iRegI src) %{
-  effect(DEF dst, USE src);
-  format %{ "SLLX  $src,48,$dst\n\t"
-            "SRLX  $dst,16,O7\n\t"
-            "OR    $dst,O7,$dst\n\t"
-            "SRLX  $dst,32,O7\n\t"
-            "OR    $dst,O7,$dst\t! replicate4S" %}
-  ins_encode( enc_repl4s(src, dst) );
-  ins_pipe(ialu_reg);
-%}
-
-// Replicate scalar to packed short values into stack slot
-instruct Repl4S_reg(stackSlotD dst, iRegI src) %{
-  match(Set dst (Replicate4S src));
-  expand %{
-    iRegL tmp;
-    Repl4S_reg_helper(tmp, src);
-    regL_to_stkD(dst, tmp);
-  %}
-%}
-
-// Replicate scalar constant to packed short values in Double register
-instruct Repl4S_immI(regD dst, immI con, o7RegI tmp) %{
-  match(Set dst (Replicate4S con));
-  effect(KILL tmp);
-  format %{ "LDDF   [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl4S($con)" %}
-  ins_encode %{
-    // XXX This is a quick fix for 6833573.
-    //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 4, 2)), $dst$$FloatRegister);
-    RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 4, 2)), $tmp$$Register);
-    __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
-  %}
-  ins_pipe(loadConFD);
-%}
-
-// Replicate scalar to packed int values in Double register
-instruct Repl2I_reg_helper(iRegL dst, iRegI src) %{
-  effect(DEF dst, USE src);
-  format %{ "SLLX  $src,32,$dst\n\t"
-            "SRLX  $dst,32,O7\n\t"
-            "OR    $dst,O7,$dst\t! replicate2I" %}
-  ins_encode( enc_repl2i(src, dst));
-  ins_pipe(ialu_reg);
-%}
-
-// Replicate scalar to packed int values in Double register
-instruct Repl2I_reg(stackSlotD dst, iRegI src) %{
-  match(Set dst (Replicate2I src));
-  expand %{
-    iRegL tmp;
-    Repl2I_reg_helper(tmp, src);
-    regL_to_stkD(dst, tmp);
-  %}
-%}
-
-// Replicate scalar zero constant to packed int values in Double register
-instruct Repl2I_immI(regD dst, immI con, o7RegI tmp) %{
-  match(Set dst (Replicate2I con));
-  effect(KILL tmp);
-  format %{ "LDDF   [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl2I($con)" %}
-  ins_encode %{
-    // XXX This is a quick fix for 6833573.
-    //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 2, 4)), $dst$$FloatRegister);
-    RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 2, 4)), $tmp$$Register);
-    __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
-  %}
-  ins_pipe(loadConFD);
-%}
-
 //----------Control Flow Instructions------------------------------------------
 // Compare Instructions
 // Compare Integers
@@ -10742,6 +10475,308 @@
   ins_pipe(istore_mem_reg);
 %}
 
+// ====================VECTOR INSTRUCTIONS=====================================
+
+// Load Aligned Packed values into a Double Register
+instruct loadV8(regD dst, memory mem) %{
+  predicate(n->as_LoadVector()->memory_size() == 8);
+  match(Set dst (LoadVector mem));
+  ins_cost(MEMORY_REF_COST);
+  size(4);
+  format %{ "LDDF   $mem,$dst\t! load vector (8 bytes)" %}
+  ins_encode %{
+    __ ldf(FloatRegisterImpl::D, $mem$$Address, as_DoubleFloatRegister($dst$$reg));
+  %}
+  ins_pipe(floadD_mem);
+%}
+
+// Store Vector in Double register to memory
+instruct storeV8(memory mem, regD src) %{
+  predicate(n->as_StoreVector()->memory_size() == 8);
+  match(Set mem (StoreVector mem src));
+  ins_cost(MEMORY_REF_COST);
+  size(4);
+  format %{ "STDF   $src,$mem\t! store vector (8 bytes)" %}
+  ins_encode %{
+    __ stf(FloatRegisterImpl::D, as_DoubleFloatRegister($src$$reg), $mem$$Address);
+  %}
+  ins_pipe(fstoreD_mem_reg);
+%}
+
+// Store Zero into vector in memory
+instruct storeV8B_zero(memory mem, immI0 zero) %{
+  predicate(n->as_StoreVector()->memory_size() == 8);
+  match(Set mem (StoreVector mem (ReplicateB zero)));
+  ins_cost(MEMORY_REF_COST);
+  size(4);
+  format %{ "STX    $zero,$mem\t! store zero vector (8 bytes)" %}
+  ins_encode %{
+    __ stx(G0, $mem$$Address);
+  %}
+  ins_pipe(fstoreD_mem_zero);
+%}
+
+instruct storeV4S_zero(memory mem, immI0 zero) %{
+  predicate(n->as_StoreVector()->memory_size() == 8);
+  match(Set mem (StoreVector mem (ReplicateS zero)));
+  ins_cost(MEMORY_REF_COST);
+  size(4);
+  format %{ "STX    $zero,$mem\t! store zero vector (4 shorts)" %}
+  ins_encode %{
+    __ stx(G0, $mem$$Address);
+  %}
+  ins_pipe(fstoreD_mem_zero);
+%}
+
+instruct storeV2I_zero(memory mem, immI0 zero) %{
+  predicate(n->as_StoreVector()->memory_size() == 8);
+  match(Set mem (StoreVector mem (ReplicateI zero)));
+  ins_cost(MEMORY_REF_COST);
+  size(4);
+  format %{ "STX    $zero,$mem\t! store zero vector (2 ints)" %}
+  ins_encode %{
+    __ stx(G0, $mem$$Address);
+  %}
+  ins_pipe(fstoreD_mem_zero);
+%}
+
+instruct storeV2F_zero(memory mem, immF0 zero) %{
+  predicate(n->as_StoreVector()->memory_size() == 8);
+  match(Set mem (StoreVector mem (ReplicateF zero)));
+  ins_cost(MEMORY_REF_COST);
+  size(4);
+  format %{ "STX    $zero,$mem\t! store zero vector (2 floats)" %}
+  ins_encode %{
+    __ stx(G0, $mem$$Address);
+  %}
+  ins_pipe(fstoreD_mem_zero);
+%}
+
+// Replicate scalar to packed byte values into Double register
+instruct Repl8B_reg(regD dst, iRegI src, iRegL tmp, o7RegL tmp2) %{
+  predicate(n->as_Vector()->length() == 8 && UseVIS >= 3);
+  match(Set dst (ReplicateB src));
+  effect(DEF dst, USE src, TEMP tmp, KILL tmp2);
+  format %{ "SLLX  $src,56,$tmp\n\t"
+            "SRLX  $tmp, 8,$tmp2\n\t"
+            "OR    $tmp,$tmp2,$tmp\n\t"
+            "SRLX  $tmp,16,$tmp2\n\t"
+            "OR    $tmp,$tmp2,$tmp\n\t"
+            "SRLX  $tmp,32,$tmp2\n\t"
+            "OR    $tmp,$tmp2,$tmp\t! replicate8B\n\t"
+            "MOVXTOD $tmp,$dst\t! MoveL2D" %}
+  ins_encode %{
+    Register Rsrc = $src$$Register;
+    Register Rtmp = $tmp$$Register;
+    Register Rtmp2 = $tmp2$$Register;
+    __ sllx(Rsrc,    56, Rtmp);
+    __ srlx(Rtmp,     8, Rtmp2);
+    __ or3 (Rtmp, Rtmp2, Rtmp);
+    __ srlx(Rtmp,    16, Rtmp2);
+    __ or3 (Rtmp, Rtmp2, Rtmp);
+    __ srlx(Rtmp,    32, Rtmp2);
+    __ or3 (Rtmp, Rtmp2, Rtmp);
+    __ movxtod(Rtmp, as_DoubleFloatRegister($dst$$reg));
+  %}
+  ins_pipe(ialu_reg);
+%}
+
+// Replicate scalar to packed byte values into Double stack
+instruct Repl8B_stk(stackSlotD dst, iRegI src, iRegL tmp, o7RegL tmp2) %{
+  predicate(n->as_Vector()->length() == 8 && UseVIS < 3);
+  match(Set dst (ReplicateB src));
+  effect(DEF dst, USE src, TEMP tmp, KILL tmp2);
+  format %{ "SLLX  $src,56,$tmp\n\t"
+            "SRLX  $tmp, 8,$tmp2\n\t"
+            "OR    $tmp,$tmp2,$tmp\n\t"
+            "SRLX  $tmp,16,$tmp2\n\t"
+            "OR    $tmp,$tmp2,$tmp\n\t"
+            "SRLX  $tmp,32,$tmp2\n\t"
+            "OR    $tmp,$tmp2,$tmp\t! replicate8B\n\t"
+            "STX   $tmp,$dst\t! regL to stkD" %}
+  ins_encode %{
+    Register Rsrc = $src$$Register;
+    Register Rtmp = $tmp$$Register;
+    Register Rtmp2 = $tmp2$$Register;
+    __ sllx(Rsrc,    56, Rtmp);
+    __ srlx(Rtmp,     8, Rtmp2);
+    __ or3 (Rtmp, Rtmp2, Rtmp);
+    __ srlx(Rtmp,    16, Rtmp2);
+    __ or3 (Rtmp, Rtmp2, Rtmp);
+    __ srlx(Rtmp,    32, Rtmp2);
+    __ or3 (Rtmp, Rtmp2, Rtmp);
+    __ set ($dst$$disp + STACK_BIAS, Rtmp2);
+    __ stx (Rtmp, Rtmp2, $dst$$base$$Register);
+  %}
+  ins_pipe(ialu_reg);
+%}
+
+// Replicate scalar constant to packed byte values in Double register
+instruct Repl8B_immI(regD dst, immI13 con, o7RegI tmp) %{
+  predicate(n->as_Vector()->length() == 8);
+  match(Set dst (ReplicateB con));
+  effect(KILL tmp);
+  format %{ "LDDF   [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl8B($con)" %}
+  ins_encode %{
+    // XXX This is a quick fix for 6833573.
+    //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 8, 1)), $dst$$FloatRegister);
+    RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 8, 1)), $tmp$$Register);
+    __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
+  %}
+  ins_pipe(loadConFD);
+%}
+
+// Replicate scalar to packed char/short values into Double register
+instruct Repl4S_reg(regD dst, iRegI src, iRegL tmp, o7RegL tmp2) %{
+  predicate(n->as_Vector()->length() == 4 && UseVIS >= 3);
+  match(Set dst (ReplicateS src));
+  effect(DEF dst, USE src, TEMP tmp, KILL tmp2);
+  format %{ "SLLX  $src,48,$tmp\n\t"
+            "SRLX  $tmp,16,$tmp2\n\t"
+            "OR    $tmp,$tmp2,$tmp\n\t"
+            "SRLX  $tmp,32,$tmp2\n\t"
+            "OR    $tmp,$tmp2,$tmp\t! replicate4S\n\t"
+            "MOVXTOD $tmp,$dst\t! MoveL2D" %}
+  ins_encode %{
+    Register Rsrc = $src$$Register;
+    Register Rtmp = $tmp$$Register;
+    Register Rtmp2 = $tmp2$$Register;
+    __ sllx(Rsrc,    48, Rtmp);
+    __ srlx(Rtmp,    16, Rtmp2);
+    __ or3 (Rtmp, Rtmp2, Rtmp);
+    __ srlx(Rtmp,    32, Rtmp2);
+    __ or3 (Rtmp, Rtmp2, Rtmp);
+    __ movxtod(Rtmp, as_DoubleFloatRegister($dst$$reg));
+  %}
+  ins_pipe(ialu_reg);
+%}
+
+// Replicate scalar to packed char/short values into Double stack
+instruct Repl4S_stk(stackSlotD dst, iRegI src, iRegL tmp, o7RegL tmp2) %{
+  predicate(n->as_Vector()->length() == 4 && UseVIS < 3);
+  match(Set dst (ReplicateS src));
+  effect(DEF dst, USE src, TEMP tmp, KILL tmp2);
+  format %{ "SLLX  $src,48,$tmp\n\t"
+            "SRLX  $tmp,16,$tmp2\n\t"
+            "OR    $tmp,$tmp2,$tmp\n\t"
+            "SRLX  $tmp,32,$tmp2\n\t"
+            "OR    $tmp,$tmp2,$tmp\t! replicate4S\n\t"
+            "STX   $tmp,$dst\t! regL to stkD" %}
+  ins_encode %{
+    Register Rsrc = $src$$Register;
+    Register Rtmp = $tmp$$Register;
+    Register Rtmp2 = $tmp2$$Register;
+    __ sllx(Rsrc,    48, Rtmp);
+    __ srlx(Rtmp,    16, Rtmp2);
+    __ or3 (Rtmp, Rtmp2, Rtmp);
+    __ srlx(Rtmp,    32, Rtmp2);
+    __ or3 (Rtmp, Rtmp2, Rtmp);
+    __ set ($dst$$disp + STACK_BIAS, Rtmp2);
+    __ stx (Rtmp, Rtmp2, $dst$$base$$Register);
+  %}
+  ins_pipe(ialu_reg);
+%}
+
+// Replicate scalar constant to packed char/short values in Double register
+instruct Repl4S_immI(regD dst, immI con, o7RegI tmp) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateS con));
+  effect(KILL tmp);
+  format %{ "LDDF   [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl4S($con)" %}
+  ins_encode %{
+    // XXX This is a quick fix for 6833573.
+    //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 4, 2)), $dst$$FloatRegister);
+    RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 4, 2)), $tmp$$Register);
+    __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
+  %}
+  ins_pipe(loadConFD);
+%}
+
+// Replicate scalar to packed int values into Double register
+instruct Repl2I_reg(regD dst, iRegI src, iRegL tmp, o7RegL tmp2) %{
+  predicate(n->as_Vector()->length() == 2 && UseVIS >= 3);
+  match(Set dst (ReplicateI src));
+  effect(DEF dst, USE src, TEMP tmp, KILL tmp2);
+  format %{ "SLLX  $src,32,$tmp\n\t"
+            "SRLX  $tmp,32,$tmp2\n\t"
+            "OR    $tmp,$tmp2,$tmp\t! replicate2I\n\t"
+            "MOVXTOD $tmp,$dst\t! MoveL2D" %}
+  ins_encode %{
+    Register Rsrc = $src$$Register;
+    Register Rtmp = $tmp$$Register;
+    Register Rtmp2 = $tmp2$$Register;
+    __ sllx(Rsrc,    32, Rtmp);
+    __ srlx(Rtmp,    32, Rtmp2);
+    __ or3 (Rtmp, Rtmp2, Rtmp);
+    __ movxtod(Rtmp, as_DoubleFloatRegister($dst$$reg));
+  %}
+  ins_pipe(ialu_reg);
+%}
+
+// Replicate scalar to packed int values into Double stack
+instruct Repl2I_stk(stackSlotD dst, iRegI src, iRegL tmp, o7RegL tmp2) %{
+  predicate(n->as_Vector()->length() == 2 && UseVIS < 3);
+  match(Set dst (ReplicateI src));
+  effect(DEF dst, USE src, TEMP tmp, KILL tmp2);
+  format %{ "SLLX  $src,32,$tmp\n\t"
+            "SRLX  $tmp,32,$tmp2\n\t"
+            "OR    $tmp,$tmp2,$tmp\t! replicate2I\n\t"
+            "STX   $tmp,$dst\t! regL to stkD" %}
+  ins_encode %{
+    Register Rsrc = $src$$Register;
+    Register Rtmp = $tmp$$Register;
+    Register Rtmp2 = $tmp2$$Register;
+    __ sllx(Rsrc,    32, Rtmp);
+    __ srlx(Rtmp,    32, Rtmp2);
+    __ or3 (Rtmp, Rtmp2, Rtmp);
+    __ set ($dst$$disp + STACK_BIAS, Rtmp2);
+    __ stx (Rtmp, Rtmp2, $dst$$base$$Register);
+  %}
+  ins_pipe(ialu_reg);
+%}
+
+// Replicate scalar zero constant to packed int values in Double register
+instruct Repl2I_immI(regD dst, immI con, o7RegI tmp) %{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (ReplicateI con));
+  effect(KILL tmp);
+  format %{ "LDDF   [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl2I($con)" %}
+  ins_encode %{
+    // XXX This is a quick fix for 6833573.
+    //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 2, 4)), $dst$$FloatRegister);
+    RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 2, 4)), $tmp$$Register);
+    __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
+  %}
+  ins_pipe(loadConFD);
+%}
+
+// Replicate scalar to packed float values into Double stack
+instruct Repl2F_stk(stackSlotD dst, regF src) %{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (ReplicateF src));
+  ins_cost(MEMORY_REF_COST*2);
+  format %{ "STF    $src,$dst.hi\t! packed2F\n\t"
+            "STF    $src,$dst.lo" %}
+  opcode(Assembler::stf_op3);
+  ins_encode(simple_form3_mem_reg(dst, src), form3_mem_plus_4_reg(dst, src));
+  ins_pipe(fstoreF_stk_reg);
+%}
+
+// Replicate scalar zero constant to packed float values in Double register
+instruct Repl2F_immF(regD dst, immF con, o7RegI tmp) %{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (ReplicateF con));
+  effect(KILL tmp);
+  format %{ "LDDF   [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl2F($con)" %}
+  ins_encode %{
+    // XXX This is a quick fix for 6833573.
+    //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immF($con$$constant)), $dst$$FloatRegister);
+    RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immF($con$$constant)), $tmp$$Register);
+    __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
+  %}
+  ins_pipe(loadConFD);
+%}
+
 //----------PEEPHOLE RULES-----------------------------------------------------
 // These must follow all instruction definitions as they use the names
 // defined in the instructions definitions.
--- a/src/cpu/sparc/vm/vm_version_sparc.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/cpu/sparc/vm/vm_version_sparc.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -217,6 +217,8 @@
   // Currently not supported anywhere.
   FLAG_SET_DEFAULT(UseFPUForSpilling, false);
 
+  MaxVectorSize = 8;
+
   assert((InteriorEntryAlignment % relocInfo::addr_unit()) == 0, "alignment is not a multiple of NOP size");
 #endif
 
--- a/src/cpu/x86/vm/assembler_x86.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/cpu/x86/vm/assembler_x86.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1637,6 +1637,13 @@
   emit_byte(0xC0 | encode);
 }
 
+void Assembler::movlhps(XMMRegister dst, XMMRegister src) {
+  NOT_LP64(assert(VM_Version::supports_sse(), ""));
+  int encode = simd_prefix_and_encode(dst, src, src, VEX_SIMD_NONE);
+  emit_byte(0x16);
+  emit_byte(0xC0 | encode);
+}
+
 void Assembler::movb(Register dst, Address src) {
   NOT_LP64(assert(dst->has_byte_register(), "must have byte register"));
   InstructionMark im(this);
@@ -1686,6 +1693,14 @@
   emit_operand(dst, src);
 }
 
+void Assembler::movdl(Address dst, XMMRegister src) {
+  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
+  InstructionMark im(this);
+  simd_prefix(dst, src, VEX_SIMD_66);
+  emit_byte(0x7E);
+  emit_operand(src, dst);
+}
+
 void Assembler::movdqa(XMMRegister dst, XMMRegister src) {
   NOT_LP64(assert(VM_Version::supports_sse2(), ""));
   int encode = simd_prefix_and_encode(dst, src, VEX_SIMD_66);
@@ -1716,6 +1731,35 @@
   emit_operand(src, dst);
 }
 
+// Move Unaligned 256bit Vector
+void Assembler::vmovdqu(XMMRegister dst, XMMRegister src) {
+  assert(UseAVX, "");
+  bool vector256 = true;
+  int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_F3, vector256);
+  emit_byte(0x6F);
+  emit_byte(0xC0 | encode);
+}
+
+void Assembler::vmovdqu(XMMRegister dst, Address src) {
+  assert(UseAVX, "");
+  InstructionMark im(this);
+  bool vector256 = true;
+  vex_prefix(dst, xnoreg, src, VEX_SIMD_F3, vector256);
+  emit_byte(0x6F);
+  emit_operand(dst, src);
+}
+
+void Assembler::vmovdqu(Address dst, XMMRegister src) {
+  assert(UseAVX, "");
+  InstructionMark im(this);
+  bool vector256 = true;
+  // swap src<->dst for encoding
+  assert(src != xnoreg, "sanity");
+  vex_prefix(src, xnoreg, dst, VEX_SIMD_F3, vector256);
+  emit_byte(0x7F);
+  emit_operand(src, dst);
+}
+
 // Uses zero extension on 64bit
 
 void Assembler::movl(Register dst, int32_t imm32) {
@@ -2529,6 +2573,13 @@
   emit_byte(0xC0 | encode);
 }
 
+void Assembler::punpcklqdq(XMMRegister dst, XMMRegister src) {
+  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
+  int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66);
+  emit_byte(0x6C);
+  emit_byte(0xC0 | encode);
+}
+
 void Assembler::push(int32_t imm32) {
   // in 64bits we push 64bits onto the stack but only
   // take a 32bit immediate
@@ -3112,6 +3163,13 @@
   emit_operand(dst, src);
 }
 
+void Assembler::vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {
+  assert(VM_Version::supports_avx(), "");
+  int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector256);
+  emit_byte(0x57);
+  emit_byte(0xC0 | encode);
+}
+
 void Assembler::vxorps(XMMRegister dst, XMMRegister nds, Address src) {
   assert(VM_Version::supports_avx(), "");
   InstructionMark im(this);
@@ -3120,6 +3178,48 @@
   emit_operand(dst, src);
 }
 
+void Assembler::vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {
+  assert(VM_Version::supports_avx(), "");
+  int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_NONE, vector256);
+  emit_byte(0x57);
+  emit_byte(0xC0 | encode);
+}
+
+void Assembler::vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {
+  assert(VM_Version::supports_avx2() || (!vector256) && VM_Version::supports_avx(), "");
+  int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector256);
+  emit_byte(0xEF);
+  emit_byte(0xC0 | encode);
+}
+
+void Assembler::vinsertf128h(XMMRegister dst, XMMRegister nds, XMMRegister src) {
+  assert(VM_Version::supports_avx(), "");
+  bool vector256 = true;
+  int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector256, VEX_OPCODE_0F_3A);
+  emit_byte(0x18);
+  emit_byte(0xC0 | encode);
+  // 0x00 - insert into lower 128 bits
+  // 0x01 - insert into upper 128 bits
+  emit_byte(0x01);
+}
+
+void Assembler::vinserti128h(XMMRegister dst, XMMRegister nds, XMMRegister src) {
+  assert(VM_Version::supports_avx2(), "");
+  bool vector256 = true;
+  int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector256, VEX_OPCODE_0F_3A);
+  emit_byte(0x38);
+  emit_byte(0xC0 | encode);
+  // 0x00 - insert into lower 128 bits
+  // 0x01 - insert into upper 128 bits
+  emit_byte(0x01);
+}
+
+void Assembler::vzeroupper() {
+  assert(VM_Version::supports_avx(), "");
+  (void)vex_prefix_and_encode(xmm0, xmm0, xmm0, VEX_SIMD_NONE);
+  emit_byte(0x77);
+}
+
 
 #ifndef _LP64
 // 32bit only pieces of the assembler
@@ -7405,6 +7505,24 @@
   movb(as_Address(dst), src);
 }
 
+void MacroAssembler::movdl(XMMRegister dst, AddressLiteral src) {
+  if (reachable(src)) {
+    movdl(dst, as_Address(src));
+  } else {
+    lea(rscratch1, src);
+    movdl(dst, Address(rscratch1, 0));
+  }
+}
+
+void MacroAssembler::movq(XMMRegister dst, AddressLiteral src) {
+  if (reachable(src)) {
+    movq(dst, as_Address(src));
+  } else {
+    lea(rscratch1, src);
+    movq(dst, Address(rscratch1, 0));
+  }
+}
+
 void MacroAssembler::movdbl(XMMRegister dst, AddressLiteral src) {
   if (reachable(src)) {
     if (UseXmmLoadAndClearUpper) {
--- a/src/cpu/x86/vm/assembler_x86.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/cpu/x86/vm/assembler_x86.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -591,8 +591,9 @@
 
   void vex_prefix(XMMRegister dst, XMMRegister nds, Address src,
                   VexSimdPrefix pre, bool vector256 = false) {
-     vex_prefix(src, nds->encoding(), dst->encoding(),
-                pre, VEX_OPCODE_0F, false, vector256);
+    int dst_enc = dst->encoding();
+    int nds_enc = nds->is_valid() ? nds->encoding() : 0;
+    vex_prefix(src, nds_enc, dst_enc, pre, VEX_OPCODE_0F, false, vector256);
   }
 
   int  vex_prefix_and_encode(int dst_enc, int nds_enc, int src_enc,
@@ -600,9 +601,12 @@
                              bool vex_w, bool vector256);
 
   int  vex_prefix_and_encode(XMMRegister dst, XMMRegister nds, XMMRegister src,
-                             VexSimdPrefix pre, bool vector256 = false) {
-     return vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(),
-                                  pre, VEX_OPCODE_0F, false, vector256);
+                             VexSimdPrefix pre, bool vector256 = false,
+                             VexOpcode opc = VEX_OPCODE_0F) {
+    int src_enc = src->encoding();
+    int dst_enc = dst->encoding();
+    int nds_enc = nds->is_valid() ? nds->encoding() : 0;
+    return vex_prefix_and_encode(dst_enc, nds_enc, src_enc, pre, opc, false, vector256);
   }
 
   void simd_prefix(XMMRegister xreg, XMMRegister nds, Address adr,
@@ -1261,6 +1265,7 @@
   void movdl(XMMRegister dst, Register src);
   void movdl(Register dst, XMMRegister src);
   void movdl(XMMRegister dst, Address src);
+  void movdl(Address dst, XMMRegister src);
 
   // Move Double Quadword
   void movdq(XMMRegister dst, Register src);
@@ -1274,6 +1279,14 @@
   void movdqu(XMMRegister dst, Address src);
   void movdqu(XMMRegister dst, XMMRegister src);
 
+  // Move Unaligned 256bit Vector
+  void vmovdqu(Address dst, XMMRegister src);
+  void vmovdqu(XMMRegister dst, Address src);
+  void vmovdqu(XMMRegister dst, XMMRegister src);
+
+  // Move lower 64bit to high 64bit in 128bit register
+  void movlhps(XMMRegister dst, XMMRegister src);
+
   void movl(Register dst, int32_t imm32);
   void movl(Address dst, int32_t imm32);
   void movl(Register dst, Register src);
@@ -1453,6 +1466,9 @@
   void punpckldq(XMMRegister dst, XMMRegister src);
   void punpckldq(XMMRegister dst, Address src);
 
+  // Interleave Low Quadwords
+  void punpcklqdq(XMMRegister dst, XMMRegister src);
+
 #ifndef _LP64 // no 32bit push/pop on amd64
   void pushl(Address src);
 #endif
@@ -1593,13 +1609,11 @@
 
   void set_byte_if_not_zero(Register dst); // sets reg to 1 if not zero, otherwise 0
 
-  // AVX 3-operands instructions (encoded with VEX prefix)
+  // AVX 3-operands scalar instructions (encoded with VEX prefix)
   void vaddsd(XMMRegister dst, XMMRegister nds, Address src);
   void vaddsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
   void vaddss(XMMRegister dst, XMMRegister nds, Address src);
   void vaddss(XMMRegister dst, XMMRegister nds, XMMRegister src);
-  void vandpd(XMMRegister dst, XMMRegister nds, Address src);
-  void vandps(XMMRegister dst, XMMRegister nds, Address src);
   void vdivsd(XMMRegister dst, XMMRegister nds, Address src);
   void vdivsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
   void vdivss(XMMRegister dst, XMMRegister nds, Address src);
@@ -1612,9 +1626,24 @@
   void vsubsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
   void vsubss(XMMRegister dst, XMMRegister nds, Address src);
   void vsubss(XMMRegister dst, XMMRegister nds, XMMRegister src);
+
+  // AVX Vector instrucitons.
+  void vandpd(XMMRegister dst, XMMRegister nds, Address src);
+  void vandps(XMMRegister dst, XMMRegister nds, Address src);
   void vxorpd(XMMRegister dst, XMMRegister nds, Address src);
   void vxorps(XMMRegister dst, XMMRegister nds, Address src);
-
+  void vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
+  void vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
+  void vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
+  void vinsertf128h(XMMRegister dst, XMMRegister nds, XMMRegister src);
+  void vinserti128h(XMMRegister dst, XMMRegister nds, XMMRegister src);
+
+  // AVX instruction which is used to clear upper 128 bits of YMM registers and
+  // to avoid transaction penalty between AVX and SSE states. There is no
+  // penalty if legacy SSE instructions are encoded using VEX prefix because
+  // they always clear upper 128 bits. It should be used before calling
+  // runtime code and native libraries.
+  void vzeroupper();
 
  protected:
   // Next instructions require address alignment 16 bytes SSE mode.
@@ -2529,12 +2558,30 @@
   void vsubss(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vsubss(dst, nds, src); }
   void vsubss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
 
+  // AVX Vector instructions
+
+  void vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) { Assembler::vxorpd(dst, nds, src, vector256); }
   void vxorpd(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vxorpd(dst, nds, src); }
   void vxorpd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
 
+  void vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) { Assembler::vxorps(dst, nds, src, vector256); }
   void vxorps(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vxorps(dst, nds, src); }
   void vxorps(XMMRegister dst, XMMRegister nds, AddressLiteral src);
 
+  void vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {
+    if (UseAVX > 1 || !vector256) // vpxor 256 bit is available only in AVX2
+      Assembler::vpxor(dst, nds, src, vector256);
+    else
+      Assembler::vxorpd(dst, nds, src, vector256);
+  }
+
+  // Move packed integer values from low 128 bit to hign 128 bit in 256 bit vector.
+  void vinserti128h(XMMRegister dst, XMMRegister nds, XMMRegister src) {
+    if (UseAVX > 1) // vinserti128h is available only in AVX2
+      Assembler::vinserti128h(dst, nds, src);
+    else
+      Assembler::vinsertf128h(dst, nds, src);
+  }
 
   // Data
 
@@ -2587,6 +2634,13 @@
   // to avoid hiding movb
   void movbyte(ArrayAddress dst, int src);
 
+  // Import other mov() methods from the parent class or else
+  // they will be hidden by the following overriding declaration.
+  using Assembler::movdl;
+  using Assembler::movq;
+  void movdl(XMMRegister dst, AddressLiteral src);
+  void movq(XMMRegister dst, AddressLiteral src);
+
   // Can push value or effective address
   void pushptr(AddressLiteral src);
 
--- a/src/cpu/x86/vm/register_x86.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/cpu/x86/vm/register_x86.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -35,7 +35,7 @@
 const int ConcreteRegisterImpl::max_fpr = ConcreteRegisterImpl::max_gpr +
                                                                  2 * FloatRegisterImpl::number_of_registers;
 const int ConcreteRegisterImpl::max_xmm = ConcreteRegisterImpl::max_fpr +
-                                                                 2 * XMMRegisterImpl::number_of_registers;
+                                                                 8 * XMMRegisterImpl::number_of_registers;
 const char* RegisterImpl::name() const {
   const char* names[number_of_registers] = {
 #ifndef AMD64
--- a/src/cpu/x86/vm/register_x86.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/cpu/x86/vm/register_x86.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -158,7 +158,7 @@
   XMMRegister successor() const                          { return as_XMMRegister(encoding() + 1); }
 
   // accessors
-  int   encoding() const                          { assert(is_valid(), "invalid register"); return (intptr_t)this; }
+  int   encoding() const                          { assert(is_valid(), err_msg("invalid register (%d)", (int)(intptr_t)this )); return (intptr_t)this; }
   bool  is_valid() const                          { return 0 <= (intptr_t)this && (intptr_t)this < number_of_registers; }
   const char* name() const;
 };
@@ -216,7 +216,7 @@
                                RegisterImpl::number_of_registers +  // "H" half of a 64bit register
 #endif // AMD64
                            2 * FloatRegisterImpl::number_of_registers +
-                           2 * XMMRegisterImpl::number_of_registers +
+                           8 * XMMRegisterImpl::number_of_registers +
                            1 // eflags
   };
 
--- a/src/cpu/x86/vm/vm_version_x86.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/cpu/x86/vm/vm_version_x86.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -467,6 +467,32 @@
   if (!supports_avx ()) // Drop to 0 if no AVX  support
     UseAVX = 0;
 
+#ifdef COMPILER2
+  if (UseFPUForSpilling) {
+    if (UseSSE < 2) {
+      // Only supported with SSE2+
+      FLAG_SET_DEFAULT(UseFPUForSpilling, false);
+    }
+  }
+  if (MaxVectorSize > 0) {
+    if (!is_power_of_2(MaxVectorSize)) {
+      warning("MaxVectorSize must be a power of 2");
+      FLAG_SET_DEFAULT(MaxVectorSize, 32);
+    }
+    if (MaxVectorSize > 32) {
+      FLAG_SET_DEFAULT(MaxVectorSize, 32);
+    }
+    if (MaxVectorSize > 16 && UseAVX == 0) {
+      // Only supported with AVX+
+      FLAG_SET_DEFAULT(MaxVectorSize, 16);
+    }
+    if (UseSSE < 2) {
+      // Only supported with SSE2+
+      FLAG_SET_DEFAULT(MaxVectorSize, 0);
+    }
+  }
+#endif
+
   // On new cpus instructions which update whole XMM register should be used
   // to prevent partial register stall due to dependencies on high half.
   //
@@ -536,7 +562,7 @@
         AllocatePrefetchInstr = 3;
       }
       // On family 15h processors use XMM and UnalignedLoadStores for Array Copy
-      if( FLAG_IS_DEFAULT(UseXMMForArrayCopy) ) {
+      if( supports_sse2() && FLAG_IS_DEFAULT(UseXMMForArrayCopy) ) {
         UseXMMForArrayCopy = true;
       }
       if( FLAG_IS_DEFAULT(UseUnalignedLoadStores) && UseXMMForArrayCopy ) {
@@ -544,6 +570,12 @@
       }
     }
 
+#ifdef COMPILER2
+    if (MaxVectorSize > 16) {
+      // Limit vectors size to 16 bytes on current AMD cpus.
+      FLAG_SET_DEFAULT(MaxVectorSize, 16);
+    }
+#endif // COMPILER2
   }
 
   if( is_intel() ) { // Intel cpus specific settings
@@ -606,15 +638,6 @@
     FLAG_SET_DEFAULT(UsePopCountInstruction, false);
   }
 
-#ifdef COMPILER2
-  if (UseFPUForSpilling) {
-    if (UseSSE < 2) {
-      // Only supported with SSE2+
-      FLAG_SET_DEFAULT(UseFPUForSpilling, false);
-    }
-  }
-#endif
-
   assert(0 <= ReadPrefetchInstr && ReadPrefetchInstr <= 3, "invalid value");
   assert(0 <= AllocatePrefetchInstr && AllocatePrefetchInstr <= 3, "invalid value");
 
--- a/src/cpu/x86/vm/vmreg_x86.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/cpu/x86/vm/vmreg_x86.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -48,8 +48,9 @@
 
   XMMRegister xreg = ::as_XMMRegister(0);
   for ( ; i < ConcreteRegisterImpl::max_xmm ; ) {
-    regName[i++] = xreg->name();
-    regName[i++] = xreg->name();
+    for (int j = 0 ; j < 8 ; j++) {
+      regName[i++] = xreg->name();
+    }
     xreg = xreg->successor();
   }
   for ( ; i < ConcreteRegisterImpl::number_of_registers ; i ++ ) {
--- a/src/cpu/x86/vm/vmreg_x86.inline.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/cpu/x86/vm/vmreg_x86.inline.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -39,7 +39,7 @@
 }
 
 inline VMReg XMMRegisterImpl::as_VMReg() {
-  return VMRegImpl::as_VMReg((encoding() << 1) + ConcreteRegisterImpl::max_fpr);
+  return VMRegImpl::as_VMReg((encoding() << 3) + ConcreteRegisterImpl::max_fpr);
 }
 
 
@@ -75,7 +75,7 @@
 inline XMMRegister VMRegImpl::as_XMMRegister() {
   assert( is_XMMRegister() && is_even(value()), "must be" );
   // Yuk
-  return ::as_XMMRegister((value() - ConcreteRegisterImpl::max_fpr) >> 1);
+  return ::as_XMMRegister((value() - ConcreteRegisterImpl::max_fpr) >> 3);
 }
 
 inline   bool VMRegImpl::is_concrete() {
--- a/src/cpu/x86/vm/x86.ad	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/cpu/x86/vm/x86.ad	Fri Aug 03 20:23:25 2012 +0100
@@ -24,6 +24,456 @@
 
 // X86 Common Architecture Description File
 
+//----------REGISTER DEFINITION BLOCK------------------------------------------
+// This information is used by the matcher and the register allocator to
+// describe individual registers and classes of registers within the target
+// archtecture.
+
+register %{
+//----------Architecture Description Register Definitions----------------------
+// General Registers
+// "reg_def"  name ( register save type, C convention save type,
+//                   ideal register type, encoding );
+// Register Save Types:
+//
+// NS  = No-Save:       The register allocator assumes that these registers
+//                      can be used without saving upon entry to the method, &
+//                      that they do not need to be saved at call sites.
+//
+// SOC = Save-On-Call:  The register allocator assumes that these registers
+//                      can be used without saving upon entry to the method,
+//                      but that they must be saved at call sites.
+//
+// SOE = Save-On-Entry: The register allocator assumes that these registers
+//                      must be saved before using them upon entry to the
+//                      method, but they do not need to be saved at call
+//                      sites.
+//
+// AS  = Always-Save:   The register allocator assumes that these registers
+//                      must be saved before using them upon entry to the
+//                      method, & that they must be saved at call sites.
+//
+// Ideal Register Type is used to determine how to save & restore a
+// register.  Op_RegI will get spilled with LoadI/StoreI, Op_RegP will get
+// spilled with LoadP/StoreP.  If the register supports both, use Op_RegI.
+//
+// The encoding number is the actual bit-pattern placed into the opcodes.
+
+// XMM registers.  256-bit registers or 8 words each, labeled (a)-h.
+// Word a in each register holds a Float, words ab hold a Double.
+// The whole registers are used in SSE4.2 version intrinsics,
+// array copy stubs and superword operations (see UseSSE42Intrinsics,
+// UseXMMForArrayCopy and UseSuperword flags).
+// XMM8-XMM15 must be encoded with REX (VEX for UseAVX).
+// Linux ABI:   No register preserved across function calls
+//              XMM0-XMM7 might hold parameters
+// Windows ABI: XMM6-XMM15 preserved across function calls
+//              XMM0-XMM3 might hold parameters
+
+reg_def XMM0 ( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg());
+reg_def XMM0b( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(1));
+reg_def XMM0c( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(2));
+reg_def XMM0d( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(3));
+reg_def XMM0e( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(4));
+reg_def XMM0f( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(5));
+reg_def XMM0g( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(6));
+reg_def XMM0h( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(7));
+
+reg_def XMM1 ( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg());
+reg_def XMM1b( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(1));
+reg_def XMM1c( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(2));
+reg_def XMM1d( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(3));
+reg_def XMM1e( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(4));
+reg_def XMM1f( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(5));
+reg_def XMM1g( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(6));
+reg_def XMM1h( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(7));
+
+reg_def XMM2 ( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg());
+reg_def XMM2b( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(1));
+reg_def XMM2c( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(2));
+reg_def XMM2d( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(3));
+reg_def XMM2e( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(4));
+reg_def XMM2f( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(5));
+reg_def XMM2g( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(6));
+reg_def XMM2h( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(7));
+
+reg_def XMM3 ( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg());
+reg_def XMM3b( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(1));
+reg_def XMM3c( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(2));
+reg_def XMM3d( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(3));
+reg_def XMM3e( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(4));
+reg_def XMM3f( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(5));
+reg_def XMM3g( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(6));
+reg_def XMM3h( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(7));
+
+reg_def XMM4 ( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg());
+reg_def XMM4b( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(1));
+reg_def XMM4c( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(2));
+reg_def XMM4d( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(3));
+reg_def XMM4e( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(4));
+reg_def XMM4f( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(5));
+reg_def XMM4g( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(6));
+reg_def XMM4h( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(7));
+
+reg_def XMM5 ( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg());
+reg_def XMM5b( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(1));
+reg_def XMM5c( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(2));
+reg_def XMM5d( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(3));
+reg_def XMM5e( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(4));
+reg_def XMM5f( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(5));
+reg_def XMM5g( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(6));
+reg_def XMM5h( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(7));
+
+#ifdef _WIN64
+
+reg_def XMM6 ( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg());
+reg_def XMM6b( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(1));
+reg_def XMM6c( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(2));
+reg_def XMM6d( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(3));
+reg_def XMM6e( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(4));
+reg_def XMM6f( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(5));
+reg_def XMM6g( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(6));
+reg_def XMM6h( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(7));
+
+reg_def XMM7 ( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg());
+reg_def XMM7b( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(1));
+reg_def XMM7c( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(2));
+reg_def XMM7d( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(3));
+reg_def XMM7e( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(4));
+reg_def XMM7f( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(5));
+reg_def XMM7g( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(6));
+reg_def XMM7h( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(7));
+
+reg_def XMM8 ( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg());
+reg_def XMM8b( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(1));
+reg_def XMM8c( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(2));
+reg_def XMM8d( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(3));
+reg_def XMM8e( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(4));
+reg_def XMM8f( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(5));
+reg_def XMM8g( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(6));
+reg_def XMM8h( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(7));
+
+reg_def XMM9 ( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg());
+reg_def XMM9b( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(1));
+reg_def XMM9c( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(2));
+reg_def XMM9d( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(3));
+reg_def XMM9e( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(4));
+reg_def XMM9f( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(5));
+reg_def XMM9g( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(6));
+reg_def XMM9h( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(7));
+
+reg_def XMM10 ( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg());
+reg_def XMM10b( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(1));
+reg_def XMM10c( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(2));
+reg_def XMM10d( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(3));
+reg_def XMM10e( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(4));
+reg_def XMM10f( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(5));
+reg_def XMM10g( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(6));
+reg_def XMM10h( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(7));
+
+reg_def XMM11 ( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg());
+reg_def XMM11b( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(1));
+reg_def XMM11c( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(2));
+reg_def XMM11d( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(3));
+reg_def XMM11e( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(4));
+reg_def XMM11f( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(5));
+reg_def XMM11g( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(6));
+reg_def XMM11h( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(7));
+
+reg_def XMM12 ( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg());
+reg_def XMM12b( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(1));
+reg_def XMM12c( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(2));
+reg_def XMM12d( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(3));
+reg_def XMM12e( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(4));
+reg_def XMM12f( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(5));
+reg_def XMM12g( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(6));
+reg_def XMM12h( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(7));
+
+reg_def XMM13 ( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg());
+reg_def XMM13b( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(1));
+reg_def XMM13c( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(2));
+reg_def XMM13d( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(3));
+reg_def XMM13e( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(4));
+reg_def XMM13f( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(5));
+reg_def XMM13g( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(6));
+reg_def XMM13h( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(7));
+
+reg_def XMM14 ( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg());
+reg_def XMM14b( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(1));
+reg_def XMM14c( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(2));
+reg_def XMM14d( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(3));
+reg_def XMM14e( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(4));
+reg_def XMM14f( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(5));
+reg_def XMM14g( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(6));
+reg_def XMM14h( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(7));
+
+reg_def XMM15 ( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg());
+reg_def XMM15b( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(1));
+reg_def XMM15c( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(2));
+reg_def XMM15d( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(3));
+reg_def XMM15e( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(4));
+reg_def XMM15f( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(5));
+reg_def XMM15g( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(6));
+reg_def XMM15h( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(7));
+
+#else // _WIN64
+
+reg_def XMM6 ( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg());
+reg_def XMM6b( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(1));
+reg_def XMM6c( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(2));
+reg_def XMM6d( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(3));
+reg_def XMM6e( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(4));
+reg_def XMM6f( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(5));
+reg_def XMM6g( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(6));
+reg_def XMM6h( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(7));
+
+reg_def XMM7 ( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg());
+reg_def XMM7b( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(1));
+reg_def XMM7c( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(2));
+reg_def XMM7d( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(3));
+reg_def XMM7e( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(4));
+reg_def XMM7f( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(5));
+reg_def XMM7g( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(6));
+reg_def XMM7h( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(7));
+
+#ifdef _LP64
+
+reg_def XMM8 ( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg());
+reg_def XMM8b( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(1));
+reg_def XMM8c( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(2));
+reg_def XMM8d( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(3));
+reg_def XMM8e( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(4));
+reg_def XMM8f( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(5));
+reg_def XMM8g( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(6));
+reg_def XMM8h( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(7));
+
+reg_def XMM9 ( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg());
+reg_def XMM9b( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(1));
+reg_def XMM9c( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(2));
+reg_def XMM9d( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(3));
+reg_def XMM9e( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(4));
+reg_def XMM9f( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(5));
+reg_def XMM9g( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(6));
+reg_def XMM9h( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(7));
+
+reg_def XMM10 ( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg());
+reg_def XMM10b( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(1));
+reg_def XMM10c( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(2));
+reg_def XMM10d( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(3));
+reg_def XMM10e( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(4));
+reg_def XMM10f( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(5));
+reg_def XMM10g( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(6));
+reg_def XMM10h( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(7));
+
+reg_def XMM11 ( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg());
+reg_def XMM11b( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(1));
+reg_def XMM11c( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(2));
+reg_def XMM11d( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(3));
+reg_def XMM11e( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(4));
+reg_def XMM11f( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(5));
+reg_def XMM11g( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(6));
+reg_def XMM11h( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(7));
+
+reg_def XMM12 ( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg());
+reg_def XMM12b( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(1));
+reg_def XMM12c( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(2));
+reg_def XMM12d( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(3));
+reg_def XMM12e( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(4));
+reg_def XMM12f( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(5));
+reg_def XMM12g( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(6));
+reg_def XMM12h( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(7));
+
+reg_def XMM13 ( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg());
+reg_def XMM13b( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(1));
+reg_def XMM13c( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(2));
+reg_def XMM13d( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(3));
+reg_def XMM13e( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(4));
+reg_def XMM13f( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(5));
+reg_def XMM13g( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(6));
+reg_def XMM13h( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(7));
+
+reg_def XMM14 ( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg());
+reg_def XMM14b( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(1));
+reg_def XMM14c( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(2));
+reg_def XMM14d( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(3));
+reg_def XMM14e( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(4));
+reg_def XMM14f( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(5));
+reg_def XMM14g( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(6));
+reg_def XMM14h( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(7));
+
+reg_def XMM15 ( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg());
+reg_def XMM15b( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(1));
+reg_def XMM15c( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(2));
+reg_def XMM15d( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(3));
+reg_def XMM15e( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(4));
+reg_def XMM15f( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(5));
+reg_def XMM15g( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(6));
+reg_def XMM15h( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(7));
+
+#endif // _LP64
+
+#endif // _WIN64
+
+#ifdef _LP64
+reg_def RFLAGS(SOC, SOC, 0, 16, VMRegImpl::Bad());
+#else
+reg_def RFLAGS(SOC, SOC, 0, 8, VMRegImpl::Bad());
+#endif // _LP64
+
+alloc_class chunk1(XMM0,  XMM0b,  XMM0c,  XMM0d,  XMM0e,  XMM0f,  XMM0g,  XMM0h,
+                   XMM1,  XMM1b,  XMM1c,  XMM1d,  XMM1e,  XMM1f,  XMM1g,  XMM1h,
+                   XMM2,  XMM2b,  XMM2c,  XMM2d,  XMM2e,  XMM2f,  XMM2g,  XMM2h,
+                   XMM3,  XMM3b,  XMM3c,  XMM3d,  XMM3e,  XMM3f,  XMM3g,  XMM3h,
+                   XMM4,  XMM4b,  XMM4c,  XMM4d,  XMM4e,  XMM4f,  XMM4g,  XMM4h,
+                   XMM5,  XMM5b,  XMM5c,  XMM5d,  XMM5e,  XMM5f,  XMM5g,  XMM5h,
+                   XMM6,  XMM6b,  XMM6c,  XMM6d,  XMM6e,  XMM6f,  XMM6g,  XMM6h,
+                   XMM7,  XMM7b,  XMM7c,  XMM7d,  XMM7e,  XMM7f,  XMM7g,  XMM7h
+#ifdef _LP64
+                  ,XMM8,  XMM8b,  XMM8c,  XMM8d,  XMM8e,  XMM8f,  XMM8g,  XMM8h,
+                   XMM9,  XMM9b,  XMM9c,  XMM9d,  XMM9e,  XMM9f,  XMM9g,  XMM9h,
+                   XMM10, XMM10b, XMM10c, XMM10d, XMM10e, XMM10f, XMM10g, XMM10h,
+                   XMM11, XMM11b, XMM11c, XMM11d, XMM11e, XMM11f, XMM11g, XMM11h,
+                   XMM12, XMM12b, XMM12c, XMM12d, XMM12e, XMM12f, XMM12g, XMM12h,
+                   XMM13, XMM13b, XMM13c, XMM13d, XMM13e, XMM13f, XMM13g, XMM13h,
+                   XMM14, XMM14b, XMM14c, XMM14d, XMM14e, XMM14f, XMM14g, XMM14h,
+                   XMM15, XMM15b, XMM15c, XMM15d, XMM15e, XMM15f, XMM15g, XMM15h
+#endif
+                   );
+
+// flags allocation class should be last.
+alloc_class chunk2(RFLAGS);
+
+// Singleton class for condition codes
+reg_class int_flags(RFLAGS);
+
+// Class for all float registers
+reg_class float_reg(XMM0,
+                    XMM1,
+                    XMM2,
+                    XMM3,
+                    XMM4,
+                    XMM5,
+                    XMM6,
+                    XMM7
+#ifdef _LP64
+                   ,XMM8,
+                    XMM9,
+                    XMM10,
+                    XMM11,
+                    XMM12,
+                    XMM13,
+                    XMM14,
+                    XMM15
+#endif
+                    );
+
+// Class for all double registers
+reg_class double_reg(XMM0,  XMM0b,
+                     XMM1,  XMM1b,
+                     XMM2,  XMM2b,
+                     XMM3,  XMM3b,
+                     XMM4,  XMM4b,
+                     XMM5,  XMM5b,
+                     XMM6,  XMM6b,
+                     XMM7,  XMM7b
+#ifdef _LP64
+                    ,XMM8,  XMM8b,
+                     XMM9,  XMM9b,
+                     XMM10, XMM10b,
+                     XMM11, XMM11b,
+                     XMM12, XMM12b,
+                     XMM13, XMM13b,
+                     XMM14, XMM14b,
+                     XMM15, XMM15b
+#endif
+                     );
+
+// Class for all 32bit vector registers
+reg_class vectors_reg(XMM0,
+                      XMM1,
+                      XMM2,
+                      XMM3,
+                      XMM4,
+                      XMM5,
+                      XMM6,
+                      XMM7
+#ifdef _LP64
+                     ,XMM8,
+                      XMM9,
+                      XMM10,
+                      XMM11,
+                      XMM12,
+                      XMM13,
+                      XMM14,
+                      XMM15
+#endif
+                      );
+
+// Class for all 64bit vector registers
+reg_class vectord_reg(XMM0,  XMM0b,
+                      XMM1,  XMM1b,
+                      XMM2,  XMM2b,
+                      XMM3,  XMM3b,
+                      XMM4,  XMM4b,
+                      XMM5,  XMM5b,
+                      XMM6,  XMM6b,
+                      XMM7,  XMM7b
+#ifdef _LP64
+                     ,XMM8,  XMM8b,
+                      XMM9,  XMM9b,
+                      XMM10, XMM10b,
+                      XMM11, XMM11b,
+                      XMM12, XMM12b,
+                      XMM13, XMM13b,
+                      XMM14, XMM14b,
+                      XMM15, XMM15b
+#endif
+                      );
+
+// Class for all 128bit vector registers
+reg_class vectorx_reg(XMM0,  XMM0b,  XMM0c,  XMM0d,
+                      XMM1,  XMM1b,  XMM1c,  XMM1d,
+                      XMM2,  XMM2b,  XMM2c,  XMM2d,
+                      XMM3,  XMM3b,  XMM3c,  XMM3d,
+                      XMM4,  XMM4b,  XMM4c,  XMM4d,
+                      XMM5,  XMM5b,  XMM5c,  XMM5d,
+                      XMM6,  XMM6b,  XMM6c,  XMM6d,
+                      XMM7,  XMM7b,  XMM7c,  XMM7d
+#ifdef _LP64
+                     ,XMM8,  XMM8b,  XMM8c,  XMM8d,
+                      XMM9,  XMM9b,  XMM9c,  XMM9d,
+                      XMM10, XMM10b, XMM10c, XMM10d,
+                      XMM11, XMM11b, XMM11c, XMM11d,
+                      XMM12, XMM12b, XMM12c, XMM12d,
+                      XMM13, XMM13b, XMM13c, XMM13d,
+                      XMM14, XMM14b, XMM14c, XMM14d,
+                      XMM15, XMM15b, XMM15c, XMM15d
+#endif
+                      );
+
+// Class for all 256bit vector registers
+reg_class vectory_reg(XMM0,  XMM0b,  XMM0c,  XMM0d,  XMM0e,  XMM0f,  XMM0g,  XMM0h,
+                      XMM1,  XMM1b,  XMM1c,  XMM1d,  XMM1e,  XMM1f,  XMM1g,  XMM1h,
+                      XMM2,  XMM2b,  XMM2c,  XMM2d,  XMM2e,  XMM2f,  XMM2g,  XMM2h,
+                      XMM3,  XMM3b,  XMM3c,  XMM3d,  XMM3e,  XMM3f,  XMM3g,  XMM3h,
+                      XMM4,  XMM4b,  XMM4c,  XMM4d,  XMM4e,  XMM4f,  XMM4g,  XMM4h,
+                      XMM5,  XMM5b,  XMM5c,  XMM5d,  XMM5e,  XMM5f,  XMM5g,  XMM5h,
+                      XMM6,  XMM6b,  XMM6c,  XMM6d,  XMM6e,  XMM6f,  XMM6g,  XMM6h,
+                      XMM7,  XMM7b,  XMM7c,  XMM7d,  XMM7e,  XMM7f,  XMM7g,  XMM7h
+#ifdef _LP64
+                     ,XMM8,  XMM8b,  XMM8c,  XMM8d,  XMM8e,  XMM8f,  XMM8g,  XMM8h,
+                      XMM9,  XMM9b,  XMM9c,  XMM9d,  XMM9e,  XMM9f,  XMM9g,  XMM9h,
+                      XMM10, XMM10b, XMM10c, XMM10d, XMM10e, XMM10f, XMM10g, XMM10h,
+                      XMM11, XMM11b, XMM11c, XMM11d, XMM11e, XMM11f, XMM11g, XMM11h,
+                      XMM12, XMM12b, XMM12c, XMM12d, XMM12e, XMM12f, XMM12g, XMM12h,
+                      XMM13, XMM13b, XMM13c, XMM13d, XMM13e, XMM13f, XMM13g, XMM13h,
+                      XMM14, XMM14b, XMM14c, XMM14d, XMM14e, XMM14f, XMM14g, XMM14h,
+                      XMM15, XMM15b, XMM15c, XMM15d, XMM15e, XMM15f, XMM15g, XMM15h
+#endif
+                      );
+
+%}
+
 source %{
   // Float masks come from different places depending on platform.
 #ifdef _LP64
@@ -38,6 +488,252 @@
   static address double_signflip() { return (address)double_signflip_pool; }
 #endif
 
+// Map Types to machine register types
+const int Matcher::base2reg[Type::lastype] = {
+  Node::NotAMachineReg,0,0, Op_RegI, Op_RegL, 0, Op_RegN,
+  Node::NotAMachineReg, Node::NotAMachineReg, /* tuple, array */
+  Op_VecS, Op_VecD, Op_VecX, Op_VecY, /* Vectors */
+  Op_RegP, Op_RegP, Op_RegP, Op_RegP, Op_RegP, Op_RegP, /* the pointers */
+  0, 0/*abio*/,
+  Op_RegP /* Return address */, 0, /* the memories */
+  Op_RegF, Op_RegF, Op_RegF, Op_RegD, Op_RegD, Op_RegD,
+  0  /*bottom*/
+};
+
+// Max vector size in bytes. 0 if not supported.
+const int Matcher::vector_width_in_bytes(BasicType bt) {
+  assert(is_java_primitive(bt), "only primitive type vectors");
+  if (UseSSE < 2) return 0;
+  // SSE2 supports 128bit vectors for all types.
+  // AVX2 supports 256bit vectors for all types.
+  int size = (UseAVX > 1) ? 32 : 16;
+  // AVX1 supports 256bit vectors only for FLOAT and DOUBLE.
+  if (UseAVX > 0 && (bt == T_FLOAT || bt == T_DOUBLE))
+    size = 32;
+  // Use flag to limit vector size.
+  size = MIN2(size,(int)MaxVectorSize);
+  // Minimum 2 values in vector (or 4 for bytes).
+  switch (bt) {
+  case T_DOUBLE:
+  case T_LONG:
+    if (size < 16) return 0;
+  case T_FLOAT:
+  case T_INT:
+    if (size < 8) return 0;
+  case T_BOOLEAN:
+  case T_BYTE:
+  case T_CHAR:
+  case T_SHORT:
+    if (size < 4) return 0;
+    break;
+  default:
+    ShouldNotReachHere();
+  }
+  return size;
+}
+
+// Limits on vector size (number of elements) loaded into vector.
+const int Matcher::max_vector_size(const BasicType bt) {
+  return vector_width_in_bytes(bt)/type2aelembytes(bt);
+}
+const int Matcher::min_vector_size(const BasicType bt) {
+  int max_size = max_vector_size(bt);
+  // Min size which can be loaded into vector is 4 bytes.
+  int size = (type2aelembytes(bt) == 1) ? 4 : 2;
+  return MIN2(size,max_size);
+}
+
+// Vector ideal reg corresponding to specidied size in bytes
+const int Matcher::vector_ideal_reg(int size) {
+  assert(MaxVectorSize >= size, "");
+  switch(size) {
+    case  4: return Op_VecS;
+    case  8: return Op_VecD;
+    case 16: return Op_VecX;
+    case 32: return Op_VecY;
+  }
+  ShouldNotReachHere();
+  return 0;
+}
+
+// x86 supports misaligned vectors store/load.
+const bool Matcher::misaligned_vectors_ok() {
+  return !AlignVector; // can be changed by flag
+}
+
+// Helper methods for MachSpillCopyNode::implementation().
+static int vec_mov_helper(CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo,
+                          int src_hi, int dst_hi, uint ireg, outputStream* st) {
+  // In 64-bit VM size calculation is very complex. Emitting instructions
+  // into scratch buffer is used to get size in 64-bit VM.
+  LP64_ONLY( assert(!do_size, "this method calculates size only for 32-bit VM"); )
+  assert(ireg == Op_VecS || // 32bit vector
+         (src_lo & 1) == 0 && (src_lo + 1) == src_hi &&
+         (dst_lo & 1) == 0 && (dst_lo + 1) == dst_hi,
+         "no non-adjacent vector moves" );
+  if (cbuf) {
+    MacroAssembler _masm(cbuf);
+    int offset = __ offset();
+    switch (ireg) {
+    case Op_VecS: // copy whole register
+    case Op_VecD:
+    case Op_VecX:
+      __ movdqu(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]));
+      break;
+    case Op_VecY:
+      __ vmovdqu(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]));
+      break;
+    default:
+      ShouldNotReachHere();
+    }
+    int size = __ offset() - offset;
+#ifdef ASSERT
+    // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix.
+    assert(!do_size || size == 4, "incorrect size calculattion");
+#endif
+    return size;
+#ifndef PRODUCT
+  } else if (!do_size) {
+    switch (ireg) {
+    case Op_VecS:
+    case Op_VecD:
+    case Op_VecX:
+      st->print("movdqu  %s,%s\t# spill",Matcher::regName[dst_lo],Matcher::regName[src_lo]);
+      break;
+    case Op_VecY:
+      st->print("vmovdqu %s,%s\t# spill",Matcher::regName[dst_lo],Matcher::regName[src_lo]);
+      break;
+    default:
+      ShouldNotReachHere();
+    }
+#endif
+  }
+  // VEX_2bytes prefix is used if UseAVX > 0, and it takes the same 2 bytes as SIMD prefix.
+  return 4;
+}
+
+static int vec_spill_helper(CodeBuffer *cbuf, bool do_size, bool is_load,
+                            int stack_offset, int reg, uint ireg, outputStream* st) {
+  // In 64-bit VM size calculation is very complex. Emitting instructions
+  // into scratch buffer is used to get size in 64-bit VM.
+  LP64_ONLY( assert(!do_size, "this method calculates size only for 32-bit VM"); )
+  if (cbuf) {
+    MacroAssembler _masm(cbuf);
+    int offset = __ offset();
+    if (is_load) {
+      switch (ireg) {
+      case Op_VecS:
+        __ movdl(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
+        break;
+      case Op_VecD:
+        __ movq(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
+        break;
+      case Op_VecX:
+        __ movdqu(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
+        break;
+      case Op_VecY:
+        __ vmovdqu(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
+        break;
+      default:
+        ShouldNotReachHere();
+      }
+    } else { // store
+      switch (ireg) {
+      case Op_VecS:
+        __ movdl(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
+        break;
+      case Op_VecD:
+        __ movq(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
+        break;
+      case Op_VecX:
+        __ movdqu(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
+        break;
+      case Op_VecY:
+        __ vmovdqu(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
+        break;
+      default:
+        ShouldNotReachHere();
+      }
+    }
+    int size = __ offset() - offset;
+#ifdef ASSERT
+    int offset_size = (stack_offset == 0) ? 0 : ((stack_offset < 0x80) ? 1 : 4);
+    // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix.
+    assert(!do_size || size == (5+offset_size), "incorrect size calculattion");
+#endif
+    return size;
+#ifndef PRODUCT
+  } else if (!do_size) {
+    if (is_load) {
+      switch (ireg) {
+      case Op_VecS:
+        st->print("movd    %s,[rsp + %d]\t# spill", Matcher::regName[reg], stack_offset);
+        break;
+      case Op_VecD:
+        st->print("movq    %s,[rsp + %d]\t# spill", Matcher::regName[reg], stack_offset);
+        break;
+       case Op_VecX:
+        st->print("movdqu  %s,[rsp + %d]\t# spill", Matcher::regName[reg], stack_offset);
+        break;
+      case Op_VecY:
+        st->print("vmovdqu %s,[rsp + %d]\t# spill", Matcher::regName[reg], stack_offset);
+        break;
+      default:
+        ShouldNotReachHere();
+      }
+    } else { // store
+      switch (ireg) {
+      case Op_VecS:
+        st->print("movd    [rsp + %d],%s\t# spill", stack_offset, Matcher::regName[reg]);
+        break;
+      case Op_VecD:
+        st->print("movq    [rsp + %d],%s\t# spill", stack_offset, Matcher::regName[reg]);
+        break;
+       case Op_VecX:
+        st->print("movdqu  [rsp + %d],%s\t# spill", stack_offset, Matcher::regName[reg]);
+        break;
+      case Op_VecY:
+        st->print("vmovdqu [rsp + %d],%s\t# spill", stack_offset, Matcher::regName[reg]);
+        break;
+      default:
+        ShouldNotReachHere();
+      }
+    }
+#endif
+  }
+  int offset_size = (stack_offset == 0) ? 0 : ((stack_offset < 0x80) ? 1 : 4);
+  // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix.
+  return 5+offset_size;
+}
+
+static inline jfloat replicate4_imm(int con, int width) {
+  // Load a constant of "width" (in bytes) and replicate it to fill 32bit.
+  assert(width == 1 || width == 2, "only byte or short types here");
+  int bit_width = width * 8;
+  jint val = con;
+  val &= (1 << bit_width) - 1;  // mask off sign bits
+  while(bit_width < 32) {
+    val |= (val << bit_width);
+    bit_width <<= 1;
+  }
+  jfloat fval = *((jfloat*) &val);  // coerce to float type
+  return fval;
+}
+
+static inline jdouble replicate8_imm(int con, int width) {
+  // Load a constant of "width" (in bytes) and replicate it to fill 64bit.
+  assert(width == 1 || width == 2 || width == 4, "only byte, short or int types here");
+  int bit_width = width * 8;
+  jlong val = con;
+  val &= (((jlong) 1) << bit_width) - 1;  // mask off sign bits
+  while(bit_width < 64) {
+    val |= (val << bit_width);
+    bit_width <<= 1;
+  }
+  jdouble dval = *((jdouble*) &val);  // coerce to double type
+  return dval;
+}
+
 #ifndef PRODUCT
   void MachNopNode::format(PhaseRegAlloc*, outputStream* st) const {
     st->print("nop \t# %d bytes pad for loops and calls", _count);
@@ -103,6 +799,46 @@
 
 %}
 
+
+//----------OPERANDS-----------------------------------------------------------
+// Operand definitions must precede instruction definitions for correct parsing
+// in the ADLC because operands constitute user defined types which are used in
+// instruction definitions.
+
+// Vectors
+operand vecS() %{
+  constraint(ALLOC_IN_RC(vectors_reg));
+  match(VecS);
+
+  format %{ %}
+  interface(REG_INTER);
+%}
+
+operand vecD() %{
+  constraint(ALLOC_IN_RC(vectord_reg));
+  match(VecD);
+
+  format %{ %}
+  interface(REG_INTER);
+%}
+
+operand vecX() %{
+  constraint(ALLOC_IN_RC(vectorx_reg));
+  match(VecX);
+
+  format %{ %}
+  interface(REG_INTER);
+%}
+
+operand vecY() %{
+  constraint(ALLOC_IN_RC(vectory_reg));
+  match(VecY);
+
+  format %{ %}
+  interface(REG_INTER);
+%}
+
+
 // INSTRUCTIONS -- Platform independent definitions (same for 32- and 64-bit)
 
 // ============================================================================
@@ -153,7 +889,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vaddF_reg(regF dst, regF src1, regF src2) %{
+instruct addF_reg_reg(regF dst, regF src1, regF src2) %{
   predicate(UseAVX > 0);
   match(Set dst (AddF src1 src2));
 
@@ -165,7 +901,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vaddF_mem(regF dst, regF src1, memory src2) %{
+instruct addF_reg_mem(regF dst, regF src1, memory src2) %{
   predicate(UseAVX > 0);
   match(Set dst (AddF src1 (LoadF src2)));
 
@@ -177,7 +913,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vaddF_imm(regF dst, regF src, immF con) %{
+instruct addF_reg_imm(regF dst, regF src, immF con) %{
   predicate(UseAVX > 0);
   match(Set dst (AddF src con));
 
@@ -224,7 +960,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vaddD_reg(regD dst, regD src1, regD src2) %{
+instruct addD_reg_reg(regD dst, regD src1, regD src2) %{
   predicate(UseAVX > 0);
   match(Set dst (AddD src1 src2));
 
@@ -236,7 +972,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vaddD_mem(regD dst, regD src1, memory src2) %{
+instruct addD_reg_mem(regD dst, regD src1, memory src2) %{
   predicate(UseAVX > 0);
   match(Set dst (AddD src1 (LoadD src2)));
 
@@ -248,7 +984,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vaddD_imm(regD dst, regD src, immD con) %{
+instruct addD_reg_imm(regD dst, regD src, immD con) %{
   predicate(UseAVX > 0);
   match(Set dst (AddD src con));
 
@@ -295,7 +1031,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vsubF_reg(regF dst, regF src1, regF src2) %{
+instruct subF_reg_reg(regF dst, regF src1, regF src2) %{
   predicate(UseAVX > 0);
   match(Set dst (SubF src1 src2));
 
@@ -307,7 +1043,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vsubF_mem(regF dst, regF src1, memory src2) %{
+instruct subF_reg_mem(regF dst, regF src1, memory src2) %{
   predicate(UseAVX > 0);
   match(Set dst (SubF src1 (LoadF src2)));
 
@@ -319,7 +1055,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vsubF_imm(regF dst, regF src, immF con) %{
+instruct subF_reg_imm(regF dst, regF src, immF con) %{
   predicate(UseAVX > 0);
   match(Set dst (SubF src con));
 
@@ -366,7 +1102,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vsubD_reg(regD dst, regD src1, regD src2) %{
+instruct subD_reg_reg(regD dst, regD src1, regD src2) %{
   predicate(UseAVX > 0);
   match(Set dst (SubD src1 src2));
 
@@ -378,7 +1114,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vsubD_mem(regD dst, regD src1, memory src2) %{
+instruct subD_reg_mem(regD dst, regD src1, memory src2) %{
   predicate(UseAVX > 0);
   match(Set dst (SubD src1 (LoadD src2)));
 
@@ -390,7 +1126,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vsubD_imm(regD dst, regD src, immD con) %{
+instruct subD_reg_imm(regD dst, regD src, immD con) %{
   predicate(UseAVX > 0);
   match(Set dst (SubD src con));
 
@@ -437,7 +1173,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vmulF_reg(regF dst, regF src1, regF src2) %{
+instruct mulF_reg_reg(regF dst, regF src1, regF src2) %{
   predicate(UseAVX > 0);
   match(Set dst (MulF src1 src2));
 
@@ -449,7 +1185,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vmulF_mem(regF dst, regF src1, memory src2) %{
+instruct mulF_reg_mem(regF dst, regF src1, memory src2) %{
   predicate(UseAVX > 0);
   match(Set dst (MulF src1 (LoadF src2)));
 
@@ -461,7 +1197,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vmulF_imm(regF dst, regF src, immF con) %{
+instruct mulF_reg_imm(regF dst, regF src, immF con) %{
   predicate(UseAVX > 0);
   match(Set dst (MulF src con));
 
@@ -508,7 +1244,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vmulD_reg(regD dst, regD src1, regD src2) %{
+instruct mulD_reg_reg(regD dst, regD src1, regD src2) %{
   predicate(UseAVX > 0);
   match(Set dst (MulD src1 src2));
 
@@ -520,7 +1256,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vmulD_mem(regD dst, regD src1, memory src2) %{
+instruct mulD_reg_mem(regD dst, regD src1, memory src2) %{
   predicate(UseAVX > 0);
   match(Set dst (MulD src1 (LoadD src2)));
 
@@ -532,7 +1268,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vmulD_imm(regD dst, regD src, immD con) %{
+instruct mulD_reg_imm(regD dst, regD src, immD con) %{
   predicate(UseAVX > 0);
   match(Set dst (MulD src con));
 
@@ -579,7 +1315,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vdivF_reg(regF dst, regF src1, regF src2) %{
+instruct divF_reg_reg(regF dst, regF src1, regF src2) %{
   predicate(UseAVX > 0);
   match(Set dst (DivF src1 src2));
 
@@ -591,7 +1327,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vdivF_mem(regF dst, regF src1, memory src2) %{
+instruct divF_reg_mem(regF dst, regF src1, memory src2) %{
   predicate(UseAVX > 0);
   match(Set dst (DivF src1 (LoadF src2)));
 
@@ -603,7 +1339,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vdivF_imm(regF dst, regF src, immF con) %{
+instruct divF_reg_imm(regF dst, regF src, immF con) %{
   predicate(UseAVX > 0);
   match(Set dst (DivF src con));
 
@@ -650,7 +1386,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vdivD_reg(regD dst, regD src1, regD src2) %{
+instruct divD_reg_reg(regD dst, regD src1, regD src2) %{
   predicate(UseAVX > 0);
   match(Set dst (DivD src1 src2));
 
@@ -662,7 +1398,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vdivD_mem(regD dst, regD src1, memory src2) %{
+instruct divD_reg_mem(regD dst, regD src1, memory src2) %{
   predicate(UseAVX > 0);
   match(Set dst (DivD src1 (LoadD src2)));
 
@@ -674,7 +1410,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vdivD_imm(regD dst, regD src, immD con) %{
+instruct divD_reg_imm(regD dst, regD src, immD con) %{
   predicate(UseAVX > 0);
   match(Set dst (DivD src con));
 
@@ -697,7 +1433,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vabsF_reg(regF dst, regF src) %{
+instruct absF_reg_reg(regF dst, regF src) %{
   predicate(UseAVX > 0);
   match(Set dst (AbsF src));
   ins_cost(150);
@@ -721,7 +1457,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vabsD_reg(regD dst, regD src) %{
+instruct absD_reg_reg(regD dst, regD src) %{
   predicate(UseAVX > 0);
   match(Set dst (AbsD src));
   ins_cost(150);
@@ -745,7 +1481,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vnegF_reg(regF dst, regF src) %{
+instruct negF_reg_reg(regF dst, regF src) %{
   predicate(UseAVX > 0);
   match(Set dst (NegF src));
   ins_cost(150);
@@ -769,7 +1505,7 @@
   ins_pipe(pipe_slow);
 %}
 
-instruct vnegD_reg(regD dst, regD src) %{
+instruct negD_reg_reg(regD dst, regD src) %{
   predicate(UseAVX > 0);
   match(Set dst (NegD src));
   ins_cost(150);
@@ -852,3 +1588,797 @@
   ins_pipe(pipe_slow);
 %}
 
+
+// ====================VECTOR INSTRUCTIONS=====================================
+
+// Load vectors (4 bytes long)
+instruct loadV4(vecS dst, memory mem) %{
+  predicate(n->as_LoadVector()->memory_size() == 4);
+  match(Set dst (LoadVector mem));
+  ins_cost(125);
+  format %{ "movd    $dst,$mem\t! load vector (4 bytes)" %}
+  ins_encode %{
+    __ movdl($dst$$XMMRegister, $mem$$Address);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+// Load vectors (8 bytes long)
+instruct loadV8(vecD dst, memory mem) %{
+  predicate(n->as_LoadVector()->memory_size() == 8);
+  match(Set dst (LoadVector mem));
+  ins_cost(125);
+  format %{ "movq    $dst,$mem\t! load vector (8 bytes)" %}
+  ins_encode %{
+    __ movq($dst$$XMMRegister, $mem$$Address);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+// Load vectors (16 bytes long)
+instruct loadV16(vecX dst, memory mem) %{
+  predicate(n->as_LoadVector()->memory_size() == 16);
+  match(Set dst (LoadVector mem));
+  ins_cost(125);
+  format %{ "movdqu  $dst,$mem\t! load vector (16 bytes)" %}
+  ins_encode %{
+    __ movdqu($dst$$XMMRegister, $mem$$Address);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+// Load vectors (32 bytes long)
+instruct loadV32(vecY dst, memory mem) %{
+  predicate(n->as_LoadVector()->memory_size() == 32);
+  match(Set dst (LoadVector mem));
+  ins_cost(125);
+  format %{ "vmovdqu $dst,$mem\t! load vector (32 bytes)" %}
+  ins_encode %{
+    __ vmovdqu($dst$$XMMRegister, $mem$$Address);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+// Store vectors
+instruct storeV4(memory mem, vecS src) %{
+  predicate(n->as_StoreVector()->memory_size() == 4);
+  match(Set mem (StoreVector mem src));
+  ins_cost(145);
+  format %{ "movd    $mem,$src\t! store vector (4 bytes)" %}
+  ins_encode %{
+    __ movdl($mem$$Address, $src$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct storeV8(memory mem, vecD src) %{
+  predicate(n->as_StoreVector()->memory_size() == 8);
+  match(Set mem (StoreVector mem src));
+  ins_cost(145);
+  format %{ "movq    $mem,$src\t! store vector (8 bytes)" %}
+  ins_encode %{
+    __ movq($mem$$Address, $src$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct storeV16(memory mem, vecX src) %{
+  predicate(n->as_StoreVector()->memory_size() == 16);
+  match(Set mem (StoreVector mem src));
+  ins_cost(145);
+  format %{ "movdqu  $mem,$src\t! store vector (16 bytes)" %}
+  ins_encode %{
+    __ movdqu($mem$$Address, $src$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct storeV32(memory mem, vecY src) %{
+  predicate(n->as_StoreVector()->memory_size() == 32);
+  match(Set mem (StoreVector mem src));
+  ins_cost(145);
+  format %{ "vmovdqu $mem,$src\t! store vector (32 bytes)" %}
+  ins_encode %{
+    __ vmovdqu($mem$$Address, $src$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+// Replicate byte scalar to be vector
+instruct Repl4B(vecS dst, rRegI src) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateB src));
+  format %{ "movd    $dst,$src\n\t"
+            "punpcklbw $dst,$dst\n\t"
+            "pshuflw $dst,$dst,0x00\t! replicate4B" %}
+  ins_encode %{
+    __ movdl($dst$$XMMRegister, $src$$Register);
+    __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
+    __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct Repl8B(vecD dst, rRegI src) %{
+  predicate(n->as_Vector()->length() == 8);
+  match(Set dst (ReplicateB src));
+  format %{ "movd    $dst,$src\n\t"
+            "punpcklbw $dst,$dst\n\t"
+            "pshuflw $dst,$dst,0x00\t! replicate8B" %}
+  ins_encode %{
+    __ movdl($dst$$XMMRegister, $src$$Register);
+    __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
+    __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct Repl16B(vecX dst, rRegI src) %{
+  predicate(n->as_Vector()->length() == 16);
+  match(Set dst (ReplicateB src));
+  format %{ "movd    $dst,$src\n\t"
+            "punpcklbw $dst,$dst\n\t"
+            "pshuflw $dst,$dst,0x00\n\t"
+            "punpcklqdq $dst,$dst\t! replicate16B" %}
+  ins_encode %{
+    __ movdl($dst$$XMMRegister, $src$$Register);
+    __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
+    __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+    __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct Repl32B(vecY dst, rRegI src) %{
+  predicate(n->as_Vector()->length() == 32);
+  match(Set dst (ReplicateB src));
+  format %{ "movd    $dst,$src\n\t"
+            "punpcklbw $dst,$dst\n\t"
+            "pshuflw $dst,$dst,0x00\n\t"
+            "punpcklqdq $dst,$dst\n\t"
+            "vinserti128h $dst,$dst,$dst\t! replicate32B" %}
+  ins_encode %{
+    __ movdl($dst$$XMMRegister, $src$$Register);
+    __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
+    __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+    __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+    __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+// Replicate byte scalar immediate to be vector by loading from const table.
+instruct Repl4B_imm(vecS dst, immI con) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateB con));
+  format %{ "movdl   $dst,[$constantaddress]\t! replicate4B($con)" %}
+  ins_encode %{
+    __ movdl($dst$$XMMRegister, $constantaddress(replicate4_imm($con$$constant, 1)));
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct Repl8B_imm(vecD dst, immI con) %{
+  predicate(n->as_Vector()->length() == 8);
+  match(Set dst (ReplicateB con));
+  format %{ "movq    $dst,[$constantaddress]\t! replicate8B($con)" %}
+  ins_encode %{
+    __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 1)));
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct Repl16B_imm(vecX dst, immI con) %{
+  predicate(n->as_Vector()->length() == 16);
+  match(Set dst (ReplicateB con));
+  format %{ "movq    $dst,[$constantaddress]\n\t"
+            "punpcklqdq $dst,$dst\t! replicate16B($con)" %}
+  ins_encode %{
+    __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 1)));
+    __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct Repl32B_imm(vecY dst, immI con) %{
+  predicate(n->as_Vector()->length() == 32);
+  match(Set dst (ReplicateB con));
+  format %{ "movq    $dst,[$constantaddress]\n\t"
+            "punpcklqdq $dst,$dst\n\t"
+            "vinserti128h $dst,$dst,$dst\t! lreplicate32B($con)" %}
+  ins_encode %{
+    __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 1)));
+    __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+    __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+// Replicate byte scalar zero to be vector
+instruct Repl4B_zero(vecS dst, immI0 zero) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateB zero));
+  format %{ "pxor    $dst,$dst\t! replicate4B zero" %}
+  ins_encode %{
+    __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl8B_zero(vecD dst, immI0 zero) %{
+  predicate(n->as_Vector()->length() == 8);
+  match(Set dst (ReplicateB zero));
+  format %{ "pxor    $dst,$dst\t! replicate8B zero" %}
+  ins_encode %{
+    __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl16B_zero(vecX dst, immI0 zero) %{
+  predicate(n->as_Vector()->length() == 16);
+  match(Set dst (ReplicateB zero));
+  format %{ "pxor    $dst,$dst\t! replicate16B zero" %}
+  ins_encode %{
+    __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl32B_zero(vecY dst, immI0 zero) %{
+  predicate(n->as_Vector()->length() == 32);
+  match(Set dst (ReplicateB zero));
+  format %{ "vpxor   $dst,$dst,$dst\t! replicate32B zero" %}
+  ins_encode %{
+    // Use vxorpd since AVX does not have vpxor for 256-bit (AVX2 will have it).
+    bool vector256 = true;
+    __ vpxor($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+// Replicate char/short (2 byte) scalar to be vector
+instruct Repl2S(vecS dst, rRegI src) %{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (ReplicateS src));
+  format %{ "movd    $dst,$src\n\t"
+            "pshuflw $dst,$dst,0x00\t! replicate2S" %}
+  ins_encode %{
+    __ movdl($dst$$XMMRegister, $src$$Register);
+    __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4S(vecD dst, rRegI src) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateS src));
+  format %{ "movd    $dst,$src\n\t"
+            "pshuflw $dst,$dst,0x00\t! replicate4S" %}
+  ins_encode %{
+    __ movdl($dst$$XMMRegister, $src$$Register);
+    __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl8S(vecX dst, rRegI src) %{
+  predicate(n->as_Vector()->length() == 8);
+  match(Set dst (ReplicateS src));
+  format %{ "movd    $dst,$src\n\t"
+            "pshuflw $dst,$dst,0x00\n\t"
+            "punpcklqdq $dst,$dst\t! replicate8S" %}
+  ins_encode %{
+    __ movdl($dst$$XMMRegister, $src$$Register);
+    __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+    __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct Repl16S(vecY dst, rRegI src) %{
+  predicate(n->as_Vector()->length() == 16);
+  match(Set dst (ReplicateS src));
+  format %{ "movd    $dst,$src\n\t"
+            "pshuflw $dst,$dst,0x00\n\t"
+            "punpcklqdq $dst,$dst\n\t"
+            "vinserti128h $dst,$dst,$dst\t! replicate16S" %}
+  ins_encode %{
+    __ movdl($dst$$XMMRegister, $src$$Register);
+    __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+    __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+    __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+// Replicate char/short (2 byte) scalar immediate to be vector by loading from const table.
+instruct Repl2S_imm(vecS dst, immI con) %{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (ReplicateS con));
+  format %{ "movdl   $dst,[$constantaddress]\t! replicate2S($con)" %}
+  ins_encode %{
+    __ movdl($dst$$XMMRegister, $constantaddress(replicate4_imm($con$$constant, 2)));
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4S_imm(vecD dst, immI con) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateS con));
+  format %{ "movq    $dst,[$constantaddress]\t! replicate4S($con)" %}
+  ins_encode %{
+    __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 2)));
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl8S_imm(vecX dst, immI con) %{
+  predicate(n->as_Vector()->length() == 8);
+  match(Set dst (ReplicateS con));
+  format %{ "movq    $dst,[$constantaddress]\n\t"
+            "punpcklqdq $dst,$dst\t! replicate8S($con)" %}
+  ins_encode %{
+    __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 2)));
+    __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct Repl16S_imm(vecY dst, immI con) %{
+  predicate(n->as_Vector()->length() == 16);
+  match(Set dst (ReplicateS con));
+  format %{ "movq    $dst,[$constantaddress]\n\t"
+            "punpcklqdq $dst,$dst\n\t"
+            "vinserti128h $dst,$dst,$dst\t! replicate16S($con)" %}
+  ins_encode %{
+    __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 2)));
+    __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+    __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+// Replicate char/short (2 byte) scalar zero to be vector
+instruct Repl2S_zero(vecS dst, immI0 zero) %{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (ReplicateS zero));
+  format %{ "pxor    $dst,$dst\t! replicate2S zero" %}
+  ins_encode %{
+    __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4S_zero(vecD dst, immI0 zero) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateS zero));
+  format %{ "pxor    $dst,$dst\t! replicate4S zero" %}
+  ins_encode %{
+    __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl8S_zero(vecX dst, immI0 zero) %{
+  predicate(n->as_Vector()->length() == 8);
+  match(Set dst (ReplicateS zero));
+  format %{ "pxor    $dst,$dst\t! replicate8S zero" %}
+  ins_encode %{
+    __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl16S_zero(vecY dst, immI0 zero) %{
+  predicate(n->as_Vector()->length() == 16);
+  match(Set dst (ReplicateS zero));
+  format %{ "vpxor   $dst,$dst,$dst\t! replicate16S zero" %}
+  ins_encode %{
+    // Use vxorpd since AVX does not have vpxor for 256-bit (AVX2 will have it).
+    bool vector256 = true;
+    __ vpxor($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+// Replicate integer (4 byte) scalar to be vector
+instruct Repl2I(vecD dst, rRegI src) %{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (ReplicateI src));
+  format %{ "movd    $dst,$src\n\t"
+            "pshufd  $dst,$dst,0x00\t! replicate2I" %}
+  ins_encode %{
+    __ movdl($dst$$XMMRegister, $src$$Register);
+    __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4I(vecX dst, rRegI src) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateI src));
+  format %{ "movd    $dst,$src\n\t"
+            "pshufd  $dst,$dst,0x00\t! replicate4I" %}
+  ins_encode %{
+    __ movdl($dst$$XMMRegister, $src$$Register);
+    __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct Repl8I(vecY dst, rRegI src) %{
+  predicate(n->as_Vector()->length() == 8);
+  match(Set dst (ReplicateI src));
+  format %{ "movd    $dst,$src\n\t"
+            "pshufd  $dst,$dst,0x00\n\t"
+            "vinserti128h $dst,$dst,$dst\t! replicate8I" %}
+  ins_encode %{
+    __ movdl($dst$$XMMRegister, $src$$Register);
+    __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+    __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+// Replicate integer (4 byte) scalar immediate to be vector by loading from const table.
+instruct Repl2I_imm(vecD dst, immI con) %{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (ReplicateI con));
+  format %{ "movq    $dst,[$constantaddress]\t! replicate2I($con)" %}
+  ins_encode %{
+    __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 4)));
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4I_imm(vecX dst, immI con) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateI con));
+  format %{ "movq    $dst,[$constantaddress]\t! replicate4I($con)\n\t"
+            "punpcklqdq $dst,$dst" %}
+  ins_encode %{
+    __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 4)));
+    __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct Repl8I_imm(vecY dst, immI con) %{
+  predicate(n->as_Vector()->length() == 8);
+  match(Set dst (ReplicateI con));
+  format %{ "movq    $dst,[$constantaddress]\t! replicate8I($con)\n\t"
+            "punpcklqdq $dst,$dst\n\t"
+            "vinserti128h $dst,$dst,$dst" %}
+  ins_encode %{
+    __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 4)));
+    __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+    __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+// Integer could be loaded into xmm register directly from memory.
+instruct Repl2I_mem(vecD dst, memory mem) %{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (ReplicateI (LoadI mem)));
+  format %{ "movd    $dst,$mem\n\t"
+            "pshufd  $dst,$dst,0x00\t! replicate2I" %}
+  ins_encode %{
+    __ movdl($dst$$XMMRegister, $mem$$Address);
+    __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4I_mem(vecX dst, memory mem) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateI (LoadI mem)));
+  format %{ "movd    $dst,$mem\n\t"
+            "pshufd  $dst,$dst,0x00\t! replicate4I" %}
+  ins_encode %{
+    __ movdl($dst$$XMMRegister, $mem$$Address);
+    __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct Repl8I_mem(vecY dst, memory mem) %{
+  predicate(n->as_Vector()->length() == 8);
+  match(Set dst (ReplicateI (LoadI mem)));
+  format %{ "movd    $dst,$mem\n\t"
+            "pshufd  $dst,$dst,0x00\n\t"
+            "vinserti128h $dst,$dst,$dst\t! replicate8I" %}
+  ins_encode %{
+    __ movdl($dst$$XMMRegister, $mem$$Address);
+    __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+    __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+// Replicate integer (4 byte) scalar zero to be vector
+instruct Repl2I_zero(vecD dst, immI0 zero) %{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (ReplicateI zero));
+  format %{ "pxor    $dst,$dst\t! replicate2I" %}
+  ins_encode %{
+    __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4I_zero(vecX dst, immI0 zero) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateI zero));
+  format %{ "pxor    $dst,$dst\t! replicate4I zero)" %}
+  ins_encode %{
+    __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl8I_zero(vecY dst, immI0 zero) %{
+  predicate(n->as_Vector()->length() == 8);
+  match(Set dst (ReplicateI zero));
+  format %{ "vpxor   $dst,$dst,$dst\t! replicate8I zero" %}
+  ins_encode %{
+    // Use vxorpd since AVX does not have vpxor for 256-bit (AVX2 will have it).
+    bool vector256 = true;
+    __ vpxor($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+// Replicate long (8 byte) scalar to be vector
+#ifdef _LP64
+instruct Repl2L(vecX dst, rRegL src) %{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (ReplicateL src));
+  format %{ "movdq   $dst,$src\n\t"
+            "punpcklqdq $dst,$dst\t! replicate2L" %}
+  ins_encode %{
+    __ movdq($dst$$XMMRegister, $src$$Register);
+    __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct Repl4L(vecY dst, rRegL src) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateL src));
+  format %{ "movdq   $dst,$src\n\t"
+            "punpcklqdq $dst,$dst\n\t"
+            "vinserti128h $dst,$dst,$dst\t! replicate4L" %}
+  ins_encode %{
+    __ movdq($dst$$XMMRegister, $src$$Register);
+    __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+    __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+#else // _LP64
+instruct Repl2L(vecX dst, eRegL src, regD tmp) %{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (ReplicateL src));
+  effect(TEMP dst, USE src, TEMP tmp);
+  format %{ "movdl   $dst,$src.lo\n\t"
+            "movdl   $tmp,$src.hi\n\t"
+            "punpckldq $dst,$tmp\n\t"
+            "punpcklqdq $dst,$dst\t! replicate2L"%}
+  ins_encode %{
+    __ movdl($dst$$XMMRegister, $src$$Register);
+    __ movdl($tmp$$XMMRegister, HIGH_FROM_LOW($src$$Register));
+    __ punpckldq($dst$$XMMRegister, $tmp$$XMMRegister);
+    __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct Repl4L(vecY dst, eRegL src, regD tmp) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateL src));
+  effect(TEMP dst, USE src, TEMP tmp);
+  format %{ "movdl   $dst,$src.lo\n\t"
+            "movdl   $tmp,$src.hi\n\t"
+            "punpckldq $dst,$tmp\n\t"
+            "punpcklqdq $dst,$dst\n\t"
+            "vinserti128h $dst,$dst,$dst\t! replicate4L" %}
+  ins_encode %{
+    __ movdl($dst$$XMMRegister, $src$$Register);
+    __ movdl($tmp$$XMMRegister, HIGH_FROM_LOW($src$$Register));
+    __ punpckldq($dst$$XMMRegister, $tmp$$XMMRegister);
+    __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+    __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+#endif // _LP64
+
+// Replicate long (8 byte) scalar immediate to be vector by loading from const table.
+instruct Repl2L_imm(vecX dst, immL con) %{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (ReplicateL con));
+  format %{ "movq    $dst,[$constantaddress]\n\t"
+            "punpcklqdq $dst,$dst\t! replicate2L($con)" %}
+  ins_encode %{
+    __ movq($dst$$XMMRegister, $constantaddress($con));
+    __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct Repl4L_imm(vecY dst, immL con) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateL con));
+  format %{ "movq    $dst,[$constantaddress]\n\t"
+            "punpcklqdq $dst,$dst\n\t"
+            "vinserti128h $dst,$dst,$dst\t! replicate4L($con)" %}
+  ins_encode %{
+    __ movq($dst$$XMMRegister, $constantaddress($con));
+    __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+    __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+// Long could be loaded into xmm register directly from memory.
+instruct Repl2L_mem(vecX dst, memory mem) %{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (ReplicateL (LoadL mem)));
+  format %{ "movq    $dst,$mem\n\t"
+            "punpcklqdq $dst,$dst\t! replicate2L" %}
+  ins_encode %{
+    __ movq($dst$$XMMRegister, $mem$$Address);
+    __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct Repl4L_mem(vecY dst, memory mem) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateL (LoadL mem)));
+  format %{ "movq    $dst,$mem\n\t"
+            "punpcklqdq $dst,$dst\n\t"
+            "vinserti128h $dst,$dst,$dst\t! replicate4L" %}
+  ins_encode %{
+    __ movq($dst$$XMMRegister, $mem$$Address);
+    __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+    __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+// Replicate long (8 byte) scalar zero to be vector
+instruct Repl2L_zero(vecX dst, immL0 zero) %{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (ReplicateL zero));
+  format %{ "pxor    $dst,$dst\t! replicate2L zero" %}
+  ins_encode %{
+    __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4L_zero(vecY dst, immL0 zero) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateL zero));
+  format %{ "vpxor   $dst,$dst,$dst\t! replicate4L zero" %}
+  ins_encode %{
+    // Use vxorpd since AVX does not have vpxor for 256-bit (AVX2 will have it).
+    bool vector256 = true;
+    __ vpxor($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+// Replicate float (4 byte) scalar to be vector
+instruct Repl2F(vecD dst, regF src) %{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (ReplicateF src));
+  format %{ "pshufd  $dst,$dst,0x00\t! replicate2F" %}
+  ins_encode %{
+    __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x00);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4F(vecX dst, regF src) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateF src));
+  format %{ "pshufd  $dst,$dst,0x00\t! replicate4F" %}
+  ins_encode %{
+    __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x00);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct Repl8F(vecY dst, regF src) %{
+  predicate(n->as_Vector()->length() == 8);
+  match(Set dst (ReplicateF src));
+  format %{ "pshufd  $dst,$src,0x00\n\t"
+            "vinsertf128h $dst,$dst,$dst\t! replicate8F" %}
+  ins_encode %{
+    __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x00);
+    __ vinsertf128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+// Replicate float (4 byte) scalar zero to be vector
+instruct Repl2F_zero(vecD dst, immF0 zero) %{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (ReplicateF zero));
+  format %{ "xorps   $dst,$dst\t! replicate2F zero" %}
+  ins_encode %{
+    __ xorps($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4F_zero(vecX dst, immF0 zero) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateF zero));
+  format %{ "xorps   $dst,$dst\t! replicate4F zero" %}
+  ins_encode %{
+    __ xorps($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl8F_zero(vecY dst, immF0 zero) %{
+  predicate(n->as_Vector()->length() == 8);
+  match(Set dst (ReplicateF zero));
+  format %{ "vxorps  $dst,$dst,$dst\t! replicate8F zero" %}
+  ins_encode %{
+    bool vector256 = true;
+    __ vxorps($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+// Replicate double (8 bytes) scalar to be vector
+instruct Repl2D(vecX dst, regD src) %{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (ReplicateD src));
+  format %{ "pshufd  $dst,$src,0x44\t! replicate2D" %}
+  ins_encode %{
+    __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x44);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+instruct Repl4D(vecY dst, regD src) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateD src));
+  format %{ "pshufd  $dst,$src,0x44\n\t"
+            "vinsertf128h $dst,$dst,$dst\t! replicate4D" %}
+  ins_encode %{
+    __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x44);
+    __ vinsertf128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( pipe_slow );
+%}
+
+// Replicate double (8 byte) scalar zero to be vector
+instruct Repl2D_zero(vecX dst, immD0 zero) %{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (ReplicateD zero));
+  format %{ "xorpd   $dst,$dst\t! replicate2D zero" %}
+  ins_encode %{
+    __ xorpd($dst$$XMMRegister, $dst$$XMMRegister);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4D_zero(vecY dst, immD0 zero) %{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (ReplicateD zero));
+  format %{ "vxorpd  $dst,$dst,$dst,vect256\t! replicate4D zero" %}
+  ins_encode %{
+    bool vector256 = true;
+    __ vxorpd($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256);
+  %}
+  ins_pipe( fpu_reg_reg );
+%}
+
--- a/src/cpu/x86/vm/x86_32.ad	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/cpu/x86/vm/x86_32.ad	Fri Aug 03 20:23:25 2012 +0100
@@ -74,9 +74,6 @@
 reg_def EAX(SOC, SOC, Op_RegI, 0, rax->as_VMReg());
 reg_def ESP( NS,  NS, Op_RegI, 4, rsp->as_VMReg());
 
-// Special Registers
-reg_def EFLAGS(SOC, SOC, 0, 8, VMRegImpl::Bad());
-
 // Float registers.  We treat TOS/FPR0 special.  It is invisible to the
 // allocator, and only shows up in the encodings.
 reg_def FPR0L( SOC, SOC, Op_RegF, 0, VMRegImpl::Bad());
@@ -105,27 +102,6 @@
 reg_def FPR7L( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg());
 reg_def FPR7H( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next());
 
-// XMM registers.  128-bit registers or 4 words each, labeled a-d.
-// Word a in each register holds a Float, words ab hold a Double.
-// We currently do not use the SIMD capabilities, so registers cd
-// are unused at the moment.
-reg_def XMM0a( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg());
-reg_def XMM0b( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next());
-reg_def XMM1a( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg());
-reg_def XMM1b( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next());
-reg_def XMM2a( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg());
-reg_def XMM2b( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next());
-reg_def XMM3a( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg());
-reg_def XMM3b( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next());
-reg_def XMM4a( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg());
-reg_def XMM4b( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next());
-reg_def XMM5a( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg());
-reg_def XMM5b( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next());
-reg_def XMM6a( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg());
-reg_def XMM6b( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next());
-reg_def XMM7a( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg());
-reg_def XMM7b( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next());
-
 // Specify priority of register selection within phases of register
 // allocation.  Highest priority is first.  A useful heuristic is to
 // give registers a low priority when they are required by machine
@@ -138,15 +114,6 @@
                     FPR3L, FPR3H, FPR4L, FPR4H, FPR5L, FPR5H,
                     FPR6L, FPR6H, FPR7L, FPR7H );
 
-alloc_class chunk1( XMM0a, XMM0b,
-                    XMM1a, XMM1b,
-                    XMM2a, XMM2b,
-                    XMM3a, XMM3b,
-                    XMM4a, XMM4b,
-                    XMM5a, XMM5b,
-                    XMM6a, XMM6b,
-                    XMM7a, XMM7b, EFLAGS);
-
 
 //----------Architecture Description Register Classes--------------------------
 // Several register classes are automatically defined based upon information in
@@ -159,12 +126,12 @@
 // Class for all registers
 reg_class any_reg(EAX, EDX, EBP, EDI, ESI, ECX, EBX, ESP);
 // Class for general registers
-reg_class e_reg(EAX, EDX, EBP, EDI, ESI, ECX, EBX);
+reg_class int_reg(EAX, EDX, EBP, EDI, ESI, ECX, EBX);
 // Class for general registers which may be used for implicit null checks on win95
 // Also safe for use by tailjump. We don't want to allocate in rbp,
-reg_class e_reg_no_rbp(EAX, EDX, EDI, ESI, ECX, EBX);
+reg_class int_reg_no_rbp(EAX, EDX, EDI, ESI, ECX, EBX);
 // Class of "X" registers
-reg_class x_reg(EBX, ECX, EDX, EAX);
+reg_class int_x_reg(EBX, ECX, EDX, EAX);
 // Class of registers that can appear in an address with no offset.
 // EBP and ESP require an extra instruction byte for zero offset.
 // Used in fast-unlock
@@ -193,8 +160,6 @@
 reg_class sp_reg(ESP);
 // Singleton class for instruction pointer
 // reg_class ip_reg(EIP);
-// Singleton class for condition codes
-reg_class int_flags(EFLAGS);
 // Class of integer register pairs
 reg_class long_reg( EAX,EDX, ECX,EBX, EBP,EDI );
 // Class of integer register pairs that aligns with calling convention
@@ -206,29 +171,18 @@
 // Floating point registers.  Notice FPR0 is not a choice.
 // FPR0 is not ever allocated; we use clever encodings to fake
 // a 2-address instructions out of Intels FP stack.
-reg_class flt_reg( FPR1L,FPR2L,FPR3L,FPR4L,FPR5L,FPR6L,FPR7L );
-
-// make a register class for SSE registers
-reg_class xmm_reg(XMM0a, XMM1a, XMM2a, XMM3a, XMM4a, XMM5a, XMM6a, XMM7a);
-
-// make a double register class for SSE2 registers
-reg_class xdb_reg(XMM0a,XMM0b, XMM1a,XMM1b, XMM2a,XMM2b, XMM3a,XMM3b,
-                  XMM4a,XMM4b, XMM5a,XMM5b, XMM6a,XMM6b, XMM7a,XMM7b );
-
-reg_class dbl_reg( FPR1L,FPR1H, FPR2L,FPR2H, FPR3L,FPR3H,
-                   FPR4L,FPR4H, FPR5L,FPR5H, FPR6L,FPR6H,
-                   FPR7L,FPR7H );
-
-reg_class flt_reg0( FPR1L );
-reg_class dbl_reg0( FPR1L,FPR1H );
-reg_class dbl_reg1( FPR2L,FPR2H );
-reg_class dbl_notreg0( FPR2L,FPR2H, FPR3L,FPR3H, FPR4L,FPR4H,
-                       FPR5L,FPR5H, FPR6L,FPR6H, FPR7L,FPR7H );
-
-// XMM6 and XMM7 could be used as temporary registers for long, float and
-// double values for SSE2.
-reg_class xdb_reg6( XMM6a,XMM6b );
-reg_class xdb_reg7( XMM7a,XMM7b );
+reg_class fp_flt_reg( FPR1L,FPR2L,FPR3L,FPR4L,FPR5L,FPR6L,FPR7L );
+
+reg_class fp_dbl_reg( FPR1L,FPR1H, FPR2L,FPR2H, FPR3L,FPR3H,
+                      FPR4L,FPR4H, FPR5L,FPR5H, FPR6L,FPR6H,
+                      FPR7L,FPR7H );
+
+reg_class fp_flt_reg0( FPR1L );
+reg_class fp_dbl_reg0( FPR1L,FPR1H );
+reg_class fp_dbl_reg1( FPR2L,FPR2H );
+reg_class fp_dbl_notreg0( FPR2L,FPR2H, FPR3L,FPR3H, FPR4L,FPR4H,
+                          FPR5L,FPR5H, FPR6L,FPR6H, FPR7L,FPR7H );
+
 %}
 
 
@@ -412,7 +366,7 @@
   }
 }
 
-   // eRegI ereg, memory mem) %{    // emit_reg_mem
+   // rRegI ereg, memory mem) %{    // emit_reg_mem
 void encode_RegMem( CodeBuffer &cbuf, int reg_encoding, int base, int index, int scale, int displace, bool displace_is_oop ) {
   // There is no index & no scale, use form without SIB byte
   if ((index == 0x4) &&
@@ -787,7 +741,7 @@
 #endif
   }
   int offset_size = (offset == 0) ? 0 : ((offset <= 127) ? 1 : 4);
-  // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes.
+  // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix.
   return size+5+offset_size;
 }
 
@@ -821,7 +775,7 @@
     }
 #endif
   }
-  // VEX_2bytes prefix is used if UseAVX > 0, and it takes the same 2 bytes.
+  // VEX_2bytes prefix is used if UseAVX > 0, and it takes the same 2 bytes as SIMD prefix.
   // Only MOVAPS SSE prefix uses 1 byte.
   int sz = 4;
   if (!(src_lo+1 == src_hi && dst_lo+1 == dst_hi) &&
@@ -903,6 +857,108 @@
   return impl_helper(cbuf,do_size,false,offset,st_op,op,op_str,size, st);
 }
 
+// Next two methods are shared by 32- and 64-bit VM. They are defined in x86.ad.
+static int vec_mov_helper(CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo,
+                          int src_hi, int dst_hi, uint ireg, outputStream* st);
+
+static int vec_spill_helper(CodeBuffer *cbuf, bool do_size, bool is_load,
+                            int stack_offset, int reg, uint ireg, outputStream* st);
+
+static int vec_stack_to_stack_helper(CodeBuffer *cbuf, bool do_size, int src_offset,
+                                     int dst_offset, uint ireg, outputStream* st) {
+  int calc_size = 0;
+  int src_offset_size = (src_offset == 0) ? 0 : ((src_offset < 0x80) ? 1 : 4);
+  int dst_offset_size = (dst_offset == 0) ? 0 : ((dst_offset < 0x80) ? 1 : 4);
+  switch (ireg) {
+  case Op_VecS:
+    calc_size = 3+src_offset_size + 3+dst_offset_size;
+    break;
+  case Op_VecD:
+    calc_size = 3+src_offset_size + 3+dst_offset_size;
+    src_offset += 4;
+    dst_offset += 4;
+    src_offset_size = (src_offset == 0) ? 0 : ((src_offset < 0x80) ? 1 : 4);
+    dst_offset_size = (dst_offset == 0) ? 0 : ((dst_offset < 0x80) ? 1 : 4);
+    calc_size += 3+src_offset_size + 3+dst_offset_size;
+    break;
+  case Op_VecX:
+    calc_size = 6 + 6 + 5+src_offset_size + 5+dst_offset_size;
+    break;
+  case Op_VecY:
+    calc_size = 6 + 6 + 5+src_offset_size + 5+dst_offset_size;
+    break;
+  default:
+    ShouldNotReachHere();
+  }
+  if (cbuf) {
+    MacroAssembler _masm(cbuf);
+    int offset = __ offset();
+    switch (ireg) {
+    case Op_VecS:
+      __ pushl(Address(rsp, src_offset));
+      __ popl (Address(rsp, dst_offset));
+      break;
+    case Op_VecD:
+      __ pushl(Address(rsp, src_offset));
+      __ popl (Address(rsp, dst_offset));
+      __ pushl(Address(rsp, src_offset+4));
+      __ popl (Address(rsp, dst_offset+4));
+      break;
+    case Op_VecX:
+      __ movdqu(Address(rsp, -16), xmm0);
+      __ movdqu(xmm0, Address(rsp, src_offset));
+      __ movdqu(Address(rsp, dst_offset), xmm0);
+      __ movdqu(xmm0, Address(rsp, -16));
+      break;
+    case Op_VecY:
+      __ vmovdqu(Address(rsp, -32), xmm0);
+      __ vmovdqu(xmm0, Address(rsp, src_offset));
+      __ vmovdqu(Address(rsp, dst_offset), xmm0);
+      __ vmovdqu(xmm0, Address(rsp, -32));
+      break;
+    default:
+      ShouldNotReachHere();
+    }
+    int size = __ offset() - offset;
+    assert(size == calc_size, "incorrect size calculattion");
+    return size;
+#ifndef PRODUCT
+  } else if (!do_size) {
+    switch (ireg) {
+    case Op_VecS:
+      st->print("pushl   [rsp + #%d]\t# 32-bit mem-mem spill\n\t"
+                "popl    [rsp + #%d]",
+                src_offset, dst_offset);
+      break;
+    case Op_VecD:
+      st->print("pushl   [rsp + #%d]\t# 64-bit mem-mem spill\n\t"
+                "popq    [rsp + #%d]\n\t"
+                "pushl   [rsp + #%d]\n\t"
+                "popq    [rsp + #%d]",
+                src_offset, dst_offset, src_offset+4, dst_offset+4);
+      break;
+     case Op_VecX:
+      st->print("movdqu  [rsp - #16], xmm0\t# 128-bit mem-mem spill\n\t"
+                "movdqu  xmm0, [rsp + #%d]\n\t"
+                "movdqu  [rsp + #%d], xmm0\n\t"
+                "movdqu  xmm0, [rsp - #16]",
+                src_offset, dst_offset);
+      break;
+    case Op_VecY:
+      st->print("vmovdqu [rsp - #32], xmm0\t# 256-bit mem-mem spill\n\t"
+                "vmovdqu xmm0, [rsp + #%d]\n\t"
+                "vmovdqu [rsp + #%d], xmm0\n\t"
+                "vmovdqu xmm0, [rsp - #32]",
+                src_offset, dst_offset);
+      break;
+    default:
+      ShouldNotReachHere();
+    }
+#endif
+  }
+  return calc_size;
+}
+
 uint MachSpillCopyNode::implementation( CodeBuffer *cbuf, PhaseRegAlloc *ra_, bool do_size, outputStream* st ) const {
   // Get registers to move
   OptoReg::Name src_second = ra_->get_reg_second(in(1));
@@ -923,6 +979,29 @@
   if( src_first == dst_first && src_second == dst_second )
     return size;            // Self copy, no move
 
+  if (bottom_type()->isa_vect() != NULL) {
+    uint ireg = ideal_reg();
+    assert((src_first_rc != rc_int && dst_first_rc != rc_int), "sanity");
+    assert((src_first_rc != rc_float && dst_first_rc != rc_float), "sanity");
+    assert((ireg == Op_VecS || ireg == Op_VecD || ireg == Op_VecX || ireg == Op_VecY), "sanity");
+    if( src_first_rc == rc_stack && dst_first_rc == rc_stack ) {
+      // mem -> mem
+      int src_offset = ra_->reg2offset(src_first);
+      int dst_offset = ra_->reg2offset(dst_first);
+      return vec_stack_to_stack_helper(cbuf, do_size, src_offset, dst_offset, ireg, st);
+    } else if (src_first_rc == rc_xmm && dst_first_rc == rc_xmm ) {
+      return vec_mov_helper(cbuf, do_size, src_first, dst_first, src_second, dst_second, ireg, st);
+    } else if (src_first_rc == rc_xmm && dst_first_rc == rc_stack ) {
+      int stack_offset = ra_->reg2offset(dst_first);
+      return vec_spill_helper(cbuf, do_size, false, stack_offset, src_first, ireg, st);
+    } else if (src_first_rc == rc_stack && dst_first_rc == rc_xmm ) {
+      int stack_offset = ra_->reg2offset(src_first);
+      return vec_spill_helper(cbuf, do_size, true,  stack_offset, dst_first, ireg, st);
+    } else {
+      ShouldNotReachHere();
+    }
+  }
+
   // --------------------------------------
   // Check for mem-mem move.  push/pop to move.
   if( src_first_rc == rc_stack && dst_first_rc == rc_stack ) {
@@ -1313,16 +1392,6 @@
   return true;
 }
 
-// Vector width in bytes
-const uint Matcher::vector_width_in_bytes(void) {
-  return UseSSE >= 2 ? 8 : 0;
-}
-
-// Vector ideal reg
-const uint Matcher::vector_ideal_reg(void) {
-  return Op_RegD;
-}
-
 // Is this branch offset short enough that a short branch can be used?
 //
 // NOTE: If the platform does not provide any short branch variants, then
@@ -1452,7 +1521,7 @@
 // arguments in those registers not be available to the callee.
 bool Matcher::can_be_java_arg( int reg ) {
   if(  reg == ECX_num   || reg == EDX_num   ) return true;
-  if( (reg == XMM0a_num || reg == XMM1a_num) && UseSSE>=1 ) return true;
+  if( (reg == XMM0_num  || reg == XMM1_num ) && UseSSE>=1 ) return true;
   if( (reg == XMM0b_num || reg == XMM1b_num) && UseSSE>=2 ) return true;
   return false;
 }
@@ -1565,16 +1634,16 @@
     emit_opcode(cbuf,0x66);
   %}
 
-  enc_class RegReg (eRegI dst, eRegI src) %{    // RegReg(Many)
+  enc_class RegReg (rRegI dst, rRegI src) %{    // RegReg(Many)
     emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
   %}
 
-  enc_class OpcRegReg (immI opcode, eRegI dst, eRegI src) %{    // OpcRegReg(Many)
+  enc_class OpcRegReg (immI opcode, rRegI dst, rRegI src) %{    // OpcRegReg(Many)
     emit_opcode(cbuf,$opcode$$constant);
     emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
   %}
 
-  enc_class mov_r32_imm0( eRegI dst ) %{
+  enc_class mov_r32_imm0( rRegI dst ) %{
     emit_opcode( cbuf, 0xB8 + $dst$$reg ); // 0xB8+ rd   -- MOV r32  ,imm32
     emit_d32   ( cbuf, 0x0  );             //                         imm32==0x0
   %}
@@ -1621,7 +1690,7 @@
   %}
 
   // Dense encoding for older common ops
-  enc_class Opc_plus(immI opcode, eRegI reg) %{
+  enc_class Opc_plus(immI opcode, rRegI reg) %{
     emit_opcode(cbuf, $opcode$$constant + $reg$$reg);
   %}
 
@@ -1637,7 +1706,7 @@
     }
   %}
 
-  enc_class OpcSErm (eRegI dst, immI imm) %{    // OpcSEr/m
+  enc_class OpcSErm (rRegI dst, immI imm) %{    // OpcSEr/m
     // Emit primary opcode and set sign-extend bit
     // Check for 8-bit immediate, and set sign extend bit in opcode
     if (($imm$$constant >= -128) && ($imm$$constant <= 127)) {
@@ -1682,7 +1751,7 @@
     else                               emit_d32(cbuf,con);
   %}
 
-  enc_class OpcSReg (eRegI dst) %{    // BSWAP
+  enc_class OpcSReg (rRegI dst) %{    // BSWAP
     emit_cc(cbuf, $secondary, $dst$$reg );
   %}
 
@@ -1700,7 +1769,7 @@
     emit_rm(cbuf, 0x3, destlo, desthi);
   %}
 
-  enc_class RegOpc (eRegI div) %{    // IDIV, IMOD, JMP indirect, ...
+  enc_class RegOpc (rRegI div) %{    // IDIV, IMOD, JMP indirect, ...
     emit_rm(cbuf, 0x3, $secondary, $div$$reg );
   %}
 
@@ -1891,20 +1960,20 @@
 //                 runtime_call_Relocation::spec(), RELOC_IMM32 );
 //   %}
 
-  enc_class RegOpcImm (eRegI dst, immI8 shift) %{    // SHL, SAR, SHR
+  enc_class RegOpcImm (rRegI dst, immI8 shift) %{    // SHL, SAR, SHR
     $$$emit8$primary;
     emit_rm(cbuf, 0x3, $secondary, $dst$$reg);
     $$$emit8$shift$$constant;
   %}
 
-  enc_class LdImmI (eRegI dst, immI src) %{    // Load Immediate
+  enc_class LdImmI (rRegI dst, immI src) %{    // Load Immediate
     // Load immediate does not have a zero or sign extended version
     // for 8-bit immediates
     emit_opcode(cbuf, 0xB8 + $dst$$reg);
     $$$emit32$src$$constant;
   %}
 
-  enc_class LdImmP (eRegI dst, immI src) %{    // Load Immediate
+  enc_class LdImmP (rRegI dst, immI src) %{    // Load Immediate
     // Load immediate does not have a zero or sign extended version
     // for 8-bit immediates
     emit_opcode(cbuf, $primary + $dst$$reg);
@@ -1943,15 +2012,15 @@
 
 
   // Encode a reg-reg copy.  If it is useless, then empty encoding.
-  enc_class enc_Copy( eRegI dst, eRegI src ) %{
+  enc_class enc_Copy( rRegI dst, rRegI src ) %{
     encode_Copy( cbuf, $dst$$reg, $src$$reg );
   %}
 
-  enc_class enc_CopyL_Lo( eRegI dst, eRegL src ) %{
+  enc_class enc_CopyL_Lo( rRegI dst, eRegL src ) %{
     encode_Copy( cbuf, $dst$$reg, $src$$reg );
   %}
 
-  enc_class RegReg (eRegI dst, eRegI src) %{    // RegReg(Many)
+  enc_class RegReg (rRegI dst, rRegI src) %{    // RegReg(Many)
     emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
   %}
 
@@ -1973,7 +2042,7 @@
     emit_rm(cbuf, 0x3, HIGH_FROM_LOW($dst$$reg), HIGH_FROM_LOW($src$$reg));
   %}
 
-  enc_class RegReg_HiLo( eRegL src, eRegI dst ) %{
+  enc_class RegReg_HiLo( eRegL src, rRegI dst ) %{
     emit_rm(cbuf, 0x3, $dst$$reg, HIGH_FROM_LOW($src$$reg));
   %}
 
@@ -2068,7 +2137,7 @@
     cbuf.set_insts_mark();            // Mark start of opcode for reloc info in mem operand
   %}
 
-  enc_class RegMem (eRegI ereg, memory mem) %{    // emit_reg_mem
+  enc_class RegMem (rRegI ereg, memory mem) %{    // emit_reg_mem
     int reg_encoding = $ereg$$reg;
     int base  = $mem$$base;
     int index = $mem$$index;
@@ -2132,7 +2201,7 @@
 
   // Clone of RegMem but accepts an extra parameter to access each
   // half of a double in memory; it never needs relocation info.
-  enc_class Mov_MemD_half_to_Reg (immI opcode, memory mem, immI disp_for_half, eRegI rm_reg) %{
+  enc_class Mov_MemD_half_to_Reg (immI opcode, memory mem, immI disp_for_half, rRegI rm_reg) %{
     emit_opcode(cbuf,$opcode$$constant);
     int reg_encoding = $rm_reg$$reg;
     int base     = $mem$$base;
@@ -2168,7 +2237,7 @@
     encode_RegMem(cbuf, rm_byte_opcode, base, index, scale, displace, disp_is_oop);
   %}
 
-  enc_class RegLea (eRegI dst, eRegI src0, immI src1 ) %{    // emit_reg_lea
+  enc_class RegLea (rRegI dst, rRegI src0, immI src1 ) %{    // emit_reg_lea
     int reg_encoding = $dst$$reg;
     int base         = $src0$$reg;      // 0xFFFFFFFF indicates no base
     int index        = 0x04;            // 0x04 indicates no index
@@ -2178,7 +2247,7 @@
     encode_RegMem(cbuf, reg_encoding, base, index, scale, displace, disp_is_oop);
   %}
 
-  enc_class min_enc (eRegI dst, eRegI src) %{    // MIN
+  enc_class min_enc (rRegI dst, rRegI src) %{    // MIN
     // Compare dst,src
     emit_opcode(cbuf,0x3B);
     emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
@@ -2190,7 +2259,7 @@
     emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
   %}
 
-  enc_class max_enc (eRegI dst, eRegI src) %{    // MAX
+  enc_class max_enc (rRegI dst, rRegI src) %{    // MAX
     // Compare dst,src
     emit_opcode(cbuf,0x3B);
     emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
@@ -2221,7 +2290,7 @@
     encode_RegMem(cbuf, reg_encoding, base, index, scale, displace, disp_is_oop);
   %}
 
-  enc_class neg_reg(eRegI dst) %{
+  enc_class neg_reg(rRegI dst) %{
     // NEG $dst
     emit_opcode(cbuf,0xF7);
     emit_rm(cbuf, 0x3, 0x03, $dst$$reg );
@@ -2251,7 +2320,7 @@
     emit_rm(cbuf, 0x3, $p$$reg, tmpReg);
   %}
 
-  enc_class enc_cmpLTP_mem(eRegI p, eRegI q, memory mem, eCXRegI tmp) %{    // cadd_cmpLT
+  enc_class enc_cmpLTP_mem(rRegI p, rRegI q, memory mem, eCXRegI tmp) %{    // cadd_cmpLT
     int tmpReg = $tmp$$reg;
 
     // SUB $p,$q
@@ -2390,12 +2459,12 @@
   %}
 
   // Special case for moving an integer register to a stack slot.
-  enc_class OpcPRegSS( stackSlotI dst, eRegI src ) %{ // RegSS
+  enc_class OpcPRegSS( stackSlotI dst, rRegI src ) %{ // RegSS
     store_to_stackslot( cbuf, $primary, $src$$reg, $dst$$disp );
   %}
 
   // Special case for moving a register to a stack slot.
-  enc_class RegSS( stackSlotI dst, eRegI src ) %{ // RegSS
+  enc_class RegSS( stackSlotI dst, rRegI src ) %{ // RegSS
     // Opcode already emitted
     emit_rm( cbuf, 0x02, $src$$reg, ESP_enc );   // R/M byte
     emit_rm( cbuf, 0x00, ESP_enc, ESP_enc);          // SIB byte
@@ -2640,7 +2709,7 @@
 // equal_result    = 0;
 // nan_result      = -1;
 
-  enc_class CmpF_Result(eRegI dst) %{
+  enc_class CmpF_Result(rRegI dst) %{
     // fnstsw_ax();
     emit_opcode( cbuf, 0xDF);
     emit_opcode( cbuf, 0xE0);
@@ -2685,7 +2754,7 @@
 // done:
   %}
 
-  enc_class convert_int_long( regL dst, eRegI src ) %{
+  enc_class convert_int_long( regL dst, rRegI src ) %{
     // mov $dst.lo,$src
     int dst_encoding = $dst$$reg;
     int src_encoding = $src$$reg;
@@ -2754,7 +2823,7 @@
     emit_rm( cbuf, 0x3, 0x4, $src$$reg);
   %}
 
-  enc_class long_multiply( eADXRegL dst, eRegL src, eRegI tmp ) %{
+  enc_class long_multiply( eADXRegL dst, eRegL src, rRegI tmp ) %{
     // Basic idea: lo(result) = lo(x_lo * y_lo)
     //             hi(result) = hi(x_lo * y_lo) + lo(x_hi * y_lo) + lo(x_lo * y_hi)
     // MOV    $tmp,$src.lo
@@ -2780,7 +2849,7 @@
     emit_rm( cbuf, 0x3, HIGH_FROM_LOW($dst$$reg), $tmp$$reg );
   %}
 
-  enc_class long_multiply_con( eADXRegL dst, immL_127 src, eRegI tmp ) %{
+  enc_class long_multiply_con( eADXRegL dst, immL_127 src, rRegI tmp ) %{
     // Basic idea: lo(result) = lo(src * y_lo)
     //             hi(result) = hi(src * y_lo) + lo(src * y_hi)
     // IMUL   $tmp,EDX,$src
@@ -2836,7 +2905,7 @@
     emit_d8(cbuf, 4*4);
   %}
 
-  enc_class long_cmp_flags0( eRegL src, eRegI tmp ) %{
+  enc_class long_cmp_flags0( eRegL src, rRegI tmp ) %{
     // MOV   $tmp,$src.lo
     emit_opcode(cbuf, 0x8B);
     emit_rm(cbuf, 0x3, $tmp$$reg, $src$$reg);
@@ -2857,7 +2926,7 @@
     emit_rm(cbuf, 0x3, HIGH_FROM_LOW($src1$$reg), HIGH_FROM_LOW($src2$$reg) );
   %}
 
-  enc_class long_cmp_flags2( eRegL src1, eRegL src2, eRegI tmp ) %{
+  enc_class long_cmp_flags2( eRegL src1, eRegL src2, rRegI tmp ) %{
     // CMP    $src1.lo,$src2.lo\t! Long compare; set flags for low bits
     emit_opcode( cbuf, 0x3B );
     emit_rm(cbuf, 0x3, $src1$$reg, $src2$$reg );
@@ -2869,7 +2938,7 @@
     emit_rm(cbuf, 0x3, $tmp$$reg, HIGH_FROM_LOW($src2$$reg) );
   %}
 
-  enc_class long_cmp_flags3( eRegL src, eRegI tmp ) %{
+  enc_class long_cmp_flags3( eRegL src, rRegI tmp ) %{
     // XOR    $tmp,$tmp
     emit_opcode(cbuf,0x33);  // XOR
     emit_rm(cbuf,0x3, $tmp$$reg, $tmp$$reg);
@@ -3762,9 +3831,9 @@
     // in SSE2+ mode we want to keep the FPU stack clean so pretend
     // that C functions return float and double results in XMM0.
     if( ideal_reg == Op_RegD && UseSSE>=2 )
-      return OptoRegPair(XMM0b_num,XMM0a_num);
+      return OptoRegPair(XMM0b_num,XMM0_num);
     if( ideal_reg == Op_RegF && UseSSE>=2 )
-      return OptoRegPair(OptoReg::Bad,XMM0a_num);
+      return OptoRegPair(OptoReg::Bad,XMM0_num);
 
     return OptoRegPair(hi[ideal_reg],lo[ideal_reg]);
   %}
@@ -3775,9 +3844,9 @@
     static int lo[Op_RegL+1] = { 0, 0, OptoReg::Bad, EAX_num,      EAX_num,      FPR1L_num,    FPR1L_num, EAX_num };
     static int hi[Op_RegL+1] = { 0, 0, OptoReg::Bad, OptoReg::Bad, OptoReg::Bad, OptoReg::Bad, FPR1H_num, EDX_num };
     if( ideal_reg == Op_RegD && UseSSE>=2 )
-      return OptoRegPair(XMM0b_num,XMM0a_num);
+      return OptoRegPair(XMM0b_num,XMM0_num);
     if( ideal_reg == Op_RegF && UseSSE>=1 )
-      return OptoRegPair(OptoReg::Bad,XMM0a_num);
+      return OptoRegPair(OptoReg::Bad,XMM0_num);
     return OptoRegPair(hi[ideal_reg],lo[ideal_reg]);
   %}
 
@@ -4147,8 +4216,8 @@
 
 // Register Operands
 // Integer Register
-operand eRegI() %{
-  constraint(ALLOC_IN_RC(e_reg));
+operand rRegI() %{
+  constraint(ALLOC_IN_RC(int_reg));
   match(RegI);
   match(xRegI);
   match(eAXRegI);
@@ -4163,8 +4232,8 @@
 %}
 
 // Subset of Integer Register
-operand xRegI(eRegI reg) %{
-  constraint(ALLOC_IN_RC(x_reg));
+operand xRegI(rRegI reg) %{
+  constraint(ALLOC_IN_RC(int_x_reg));
   match(reg);
   match(eAXRegI);
   match(eBXRegI);
@@ -4179,7 +4248,7 @@
 operand eAXRegI(xRegI reg) %{
   constraint(ALLOC_IN_RC(eax_reg));
   match(reg);
-  match(eRegI);
+  match(rRegI);
 
   format %{ "EAX" %}
   interface(REG_INTER);
@@ -4189,7 +4258,7 @@
 operand eBXRegI(xRegI reg) %{
   constraint(ALLOC_IN_RC(ebx_reg));
   match(reg);
-  match(eRegI);
+  match(rRegI);
 
   format %{ "EBX" %}
   interface(REG_INTER);
@@ -4198,7 +4267,7 @@
 operand eCXRegI(xRegI reg) %{
   constraint(ALLOC_IN_RC(ecx_reg));
   match(reg);
-  match(eRegI);
+  match(rRegI);
 
   format %{ "ECX" %}
   interface(REG_INTER);
@@ -4207,7 +4276,7 @@
 operand eDXRegI(xRegI reg) %{
   constraint(ALLOC_IN_RC(edx_reg));
   match(reg);
-  match(eRegI);
+  match(rRegI);
 
   format %{ "EDX" %}
   interface(REG_INTER);
@@ -4216,7 +4285,7 @@
 operand eDIRegI(xRegI reg) %{
   constraint(ALLOC_IN_RC(edi_reg));
   match(reg);
-  match(eRegI);
+  match(rRegI);
 
   format %{ "EDI" %}
   interface(REG_INTER);
@@ -4263,7 +4332,7 @@
 operand eSIRegI(xRegI reg) %{
    constraint(ALLOC_IN_RC(esi_reg));
    match(reg);
-   match(eRegI);
+   match(rRegI);
 
    format %{ "ESI" %}
    interface(REG_INTER);
@@ -4284,7 +4353,7 @@
 %}
 
 operand eRegP() %{
-  constraint(ALLOC_IN_RC(e_reg));
+  constraint(ALLOC_IN_RC(int_reg));
   match(RegP);
   match(eAXRegP);
   match(eBXRegP);
@@ -4297,7 +4366,7 @@
 
 // On windows95, EBP is not safe to use for implicit null tests.
 operand eRegP_no_EBP() %{
-  constraint(ALLOC_IN_RC(e_reg_no_rbp));
+  constraint(ALLOC_IN_RC(int_reg_no_rbp));
   match(RegP);
   match(eAXRegP);
   match(eBXRegP);
@@ -4477,7 +4546,7 @@
 // Float register operands
 operand regDPR() %{
   predicate( UseSSE < 2 );
-  constraint(ALLOC_IN_RC(dbl_reg));
+  constraint(ALLOC_IN_RC(fp_dbl_reg));
   match(RegD);
   match(regDPR1);
   match(regDPR2);
@@ -4487,7 +4556,7 @@
 
 operand regDPR1(regDPR reg) %{
   predicate( UseSSE < 2 );
-  constraint(ALLOC_IN_RC(dbl_reg0));
+  constraint(ALLOC_IN_RC(fp_dbl_reg0));
   match(reg);
   format %{ "FPR1" %}
   interface(REG_INTER);
@@ -4495,7 +4564,7 @@
 
 operand regDPR2(regDPR reg) %{
   predicate( UseSSE < 2 );
-  constraint(ALLOC_IN_RC(dbl_reg1));
+  constraint(ALLOC_IN_RC(fp_dbl_reg1));
   match(reg);
   format %{ "FPR2" %}
   interface(REG_INTER);
@@ -4503,45 +4572,16 @@
 
 operand regnotDPR1(regDPR reg) %{
   predicate( UseSSE < 2 );
-  constraint(ALLOC_IN_RC(dbl_notreg0));
+  constraint(ALLOC_IN_RC(fp_dbl_notreg0));
   match(reg);
   format %{ %}
   interface(REG_INTER);
 %}
 
-// XMM Double register operands
-operand regD() %{
-  predicate( UseSSE>=2 );
-  constraint(ALLOC_IN_RC(xdb_reg));
-  match(RegD);
-  match(regD6);
-  match(regD7);
-  format %{ %}
-  interface(REG_INTER);
-%}
-
-// XMM6 double register operands
-operand regD6(regD reg) %{
-  predicate( UseSSE>=2 );
-  constraint(ALLOC_IN_RC(xdb_reg6));
-  match(reg);
-  format %{ "XMM6" %}
-  interface(REG_INTER);
-%}
-
-// XMM7 double register operands
-operand regD7(regD reg) %{
-  predicate( UseSSE>=2 );
-  constraint(ALLOC_IN_RC(xdb_reg7));
-  match(reg);
-  format %{ "XMM7" %}
-  interface(REG_INTER);
-%}
-
 // Float register operands
 operand regFPR() %{
   predicate( UseSSE < 2 );
-  constraint(ALLOC_IN_RC(flt_reg));
+  constraint(ALLOC_IN_RC(fp_flt_reg));
   match(RegF);
   match(regFPR1);
   format %{ %}
@@ -4551,21 +4591,30 @@
 // Float register operands
 operand regFPR1(regFPR reg) %{
   predicate( UseSSE < 2 );
-  constraint(ALLOC_IN_RC(flt_reg0));
+  constraint(ALLOC_IN_RC(fp_flt_reg0));
   match(reg);
   format %{ "FPR1" %}
   interface(REG_INTER);
 %}
 
-// XMM register operands
+// XMM Float register operands
 operand regF() %{
   predicate( UseSSE>=1 );
-  constraint(ALLOC_IN_RC(xmm_reg));
+  constraint(ALLOC_IN_RC(float_reg));
   match(RegF);
   format %{ %}
   interface(REG_INTER);
 %}
 
+// XMM Double register operands
+operand regD() %{
+  predicate( UseSSE>=2 );
+  constraint(ALLOC_IN_RC(double_reg));
+  match(RegD);
+  format %{ %}
+  interface(REG_INTER);
+%}
+
 
 //----------Memory Operands----------------------------------------------------
 // Direct Memory Operand
@@ -4583,7 +4632,7 @@
 
 // Indirect Memory Operand
 operand indirect(eRegP reg) %{
-  constraint(ALLOC_IN_RC(e_reg));
+  constraint(ALLOC_IN_RC(int_reg));
   match(reg);
 
   format %{ "[$reg]" %}
@@ -4622,7 +4671,7 @@
 %}
 
 // Indirect Memory Plus Long Offset Operand
-operand indOffset32X(eRegI reg, immP off) %{
+operand indOffset32X(rRegI reg, immP off) %{
   match(AddP off reg);
 
   format %{ "[$reg + $off]" %}
@@ -4635,7 +4684,7 @@
 %}
 
 // Indirect Memory Plus Index Register Plus Offset Operand
-operand indIndexOffset(eRegP reg, eRegI ireg, immI off) %{
+operand indIndexOffset(eRegP reg, rRegI ireg, immI off) %{
   match(AddP (AddP reg ireg) off);
 
   op_cost(10);
@@ -4649,7 +4698,7 @@
 %}
 
 // Indirect Memory Plus Index Register Plus Offset Operand
-operand indIndex(eRegP reg, eRegI ireg) %{
+operand indIndex(eRegP reg, rRegI ireg) %{
   match(AddP reg ireg);
 
   op_cost(10);
@@ -4667,7 +4716,7 @@
 // // -------------------------------------------------------------------------
 // // Scaled Memory Operands
 // // Indirect Memory Times Scale Plus Offset Operand
-// operand indScaleOffset(immP off, eRegI ireg, immI2 scale) %{
+// operand indScaleOffset(immP off, rRegI ireg, immI2 scale) %{
 //   match(AddP off (LShiftI ireg scale));
 //
 //   op_cost(10);
@@ -4681,7 +4730,7 @@
 // %}
 
 // Indirect Memory Times Scale Plus Index Register
-operand indIndexScale(eRegP reg, eRegI ireg, immI2 scale) %{
+operand indIndexScale(eRegP reg, rRegI ireg, immI2 scale) %{
   match(AddP reg (LShiftI ireg scale));
 
   op_cost(10);
@@ -4695,7 +4744,7 @@
 %}
 
 // Indirect Memory Times Scale Plus Index Register Plus Offset Operand
-operand indIndexScaleOffset(eRegP reg, immI off, eRegI ireg, immI2 scale) %{
+operand indIndexScaleOffset(eRegP reg, immI off, rRegI ireg, immI2 scale) %{
   match(AddP (AddP reg (LShiftI ireg scale)) off);
 
   op_cost(10);
@@ -4823,7 +4872,7 @@
 // Indirect Memory Operand
 operand indirect_win95_safe(eRegP_no_EBP reg)
 %{
-  constraint(ALLOC_IN_RC(e_reg));
+  constraint(ALLOC_IN_RC(int_reg));
   match(reg);
 
   op_cost(100);
@@ -4867,7 +4916,7 @@
 %}
 
 // Indirect Memory Plus Index Register Plus Offset Operand
-operand indIndexOffset_win95_safe(eRegP_no_EBP reg, eRegI ireg, immI off)
+operand indIndexOffset_win95_safe(eRegP_no_EBP reg, rRegI ireg, immI off)
 %{
   match(AddP (AddP reg ireg) off);
 
@@ -4882,7 +4931,7 @@
 %}
 
 // Indirect Memory Times Scale Plus Index Register
-operand indIndexScale_win95_safe(eRegP_no_EBP reg, eRegI ireg, immI2 scale)
+operand indIndexScale_win95_safe(eRegP_no_EBP reg, rRegI ireg, immI2 scale)
 %{
   match(AddP reg (LShiftI ireg scale));
 
@@ -4897,7 +4946,7 @@
 %}
 
 // Indirect Memory Times Scale Plus Index Register Plus Offset Operand
-operand indIndexScaleOffset_win95_safe(eRegP_no_EBP reg, immI off, eRegI ireg, immI2 scale)
+operand indIndexScaleOffset_win95_safe(eRegP_no_EBP reg, immI off, rRegI ireg, immI2 scale)
 %{
   match(AddP (AddP reg (LShiftI ireg scale)) off);
 
@@ -5086,7 +5135,7 @@
 //   Or: _mem if it requires the big decoder and a memory unit.
 
 // Integer ALU reg operation
-pipe_class ialu_reg(eRegI dst) %{
+pipe_class ialu_reg(rRegI dst) %{
     single_instruction;
     dst    : S4(write);
     dst    : S3(read);
@@ -5104,7 +5153,7 @@
 %}
 
 // Integer ALU reg operation using big decoder
-pipe_class ialu_reg_fat(eRegI dst) %{
+pipe_class ialu_reg_fat(rRegI dst) %{
     single_instruction;
     dst    : S4(write);
     dst    : S3(read);
@@ -5122,7 +5171,7 @@
 %}
 
 // Integer ALU reg-reg operation
-pipe_class ialu_reg_reg(eRegI dst, eRegI src) %{
+pipe_class ialu_reg_reg(rRegI dst, rRegI src) %{
     single_instruction;
     dst    : S4(write);
     src    : S3(read);
@@ -5140,7 +5189,7 @@
 %}
 
 // Integer ALU reg-reg operation
-pipe_class ialu_reg_reg_fat(eRegI dst, memory src) %{
+pipe_class ialu_reg_reg_fat(rRegI dst, memory src) %{
     single_instruction;
     dst    : S4(write);
     src    : S3(read);
@@ -5158,7 +5207,7 @@
 %}
 
 // Integer ALU reg-mem operation
-pipe_class ialu_reg_mem(eRegI dst, memory mem) %{
+pipe_class ialu_reg_mem(rRegI dst, memory mem) %{
     single_instruction;
     dst    : S5(write);
     mem    : S3(read);
@@ -5187,7 +5236,7 @@
 %}
 
 // Integer Store to Memory
-pipe_class ialu_mem_reg(memory mem, eRegI src) %{
+pipe_class ialu_mem_reg(memory mem, rRegI src) %{
     single_instruction;
     mem    : S3(read);
     src    : S5(read);
@@ -5216,7 +5265,7 @@
 %}
 
 // Integer ALU0 reg-reg operation
-pipe_class ialu_reg_reg_alu0(eRegI dst, eRegI src) %{
+pipe_class ialu_reg_reg_alu0(rRegI dst, rRegI src) %{
     single_instruction;
     dst    : S4(write);
     src    : S3(read);
@@ -5225,7 +5274,7 @@
 %}
 
 // Integer ALU0 reg-mem operation
-pipe_class ialu_reg_mem_alu0(eRegI dst, memory mem) %{
+pipe_class ialu_reg_mem_alu0(rRegI dst, memory mem) %{
     single_instruction;
     dst    : S5(write);
     mem    : S3(read);
@@ -5235,7 +5284,7 @@
 %}
 
 // Integer ALU reg-reg operation
-pipe_class ialu_cr_reg_reg(eFlagsReg cr, eRegI src1, eRegI src2) %{
+pipe_class ialu_cr_reg_reg(eFlagsReg cr, rRegI src1, rRegI src2) %{
     single_instruction;
     cr     : S4(write);
     src1   : S3(read);
@@ -5245,7 +5294,7 @@
 %}
 
 // Integer ALU reg-imm operation
-pipe_class ialu_cr_reg_imm(eFlagsReg cr, eRegI src1) %{
+pipe_class ialu_cr_reg_imm(eFlagsReg cr, rRegI src1) %{
     single_instruction;
     cr     : S4(write);
     src1   : S3(read);
@@ -5254,7 +5303,7 @@
 %}
 
 // Integer ALU reg-mem operation
-pipe_class ialu_cr_reg_mem(eFlagsReg cr, eRegI src1, memory src2) %{
+pipe_class ialu_cr_reg_mem(eFlagsReg cr, rRegI src1, memory src2) %{
     single_instruction;
     cr     : S4(write);
     src1   : S3(read);
@@ -5265,7 +5314,7 @@
 %}
 
 // Conditional move reg-reg
-pipe_class pipe_cmplt( eRegI p, eRegI q, eRegI y ) %{
+pipe_class pipe_cmplt( rRegI p, rRegI q, rRegI y ) %{
     instruction_count(4);
     y      : S4(read);
     q      : S3(read);
@@ -5274,7 +5323,7 @@
 %}
 
 // Conditional move reg-reg
-pipe_class pipe_cmov_reg( eRegI dst, eRegI src, eFlagsReg cr ) %{
+pipe_class pipe_cmov_reg( rRegI dst, rRegI src, eFlagsReg cr ) %{
     single_instruction;
     dst    : S4(write);
     src    : S3(read);
@@ -5283,7 +5332,7 @@
 %}
 
 // Conditional move reg-mem
-pipe_class pipe_cmov_mem( eFlagsReg cr, eRegI dst, memory src) %{
+pipe_class pipe_cmov_mem( eFlagsReg cr, rRegI dst, memory src) %{
     single_instruction;
     dst    : S4(write);
     src    : S3(read);
@@ -5534,7 +5583,7 @@
 //               in the encode section of the architecture description.
 
 //----------BSWAP-Instruction--------------------------------------------------
-instruct bytes_reverse_int(eRegI dst) %{
+instruct bytes_reverse_int(rRegI dst) %{
   match(Set dst (ReverseBytesI dst));
 
   format %{ "BSWAP  $dst" %}
@@ -5555,7 +5604,7 @@
   ins_pipe( ialu_reg_reg);
 %}
 
-instruct bytes_reverse_unsigned_short(eRegI dst, eFlagsReg cr) %{
+instruct bytes_reverse_unsigned_short(rRegI dst, eFlagsReg cr) %{
   match(Set dst (ReverseBytesUS dst));
   effect(KILL cr);
 
@@ -5568,7 +5617,7 @@
   ins_pipe( ialu_reg );
 %}
 
-instruct bytes_reverse_short(eRegI dst, eFlagsReg cr) %{
+instruct bytes_reverse_short(rRegI dst, eFlagsReg cr) %{
   match(Set dst (ReverseBytesS dst));
   effect(KILL cr);
 
@@ -5584,7 +5633,7 @@
 
 //---------- Zeros Count Instructions ------------------------------------------
 
-instruct countLeadingZerosI(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct countLeadingZerosI(rRegI dst, rRegI src, eFlagsReg cr) %{
   predicate(UseCountLeadingZerosInstruction);
   match(Set dst (CountLeadingZerosI src));
   effect(KILL cr);
@@ -5596,7 +5645,7 @@
   ins_pipe(ialu_reg);
 %}
 
-instruct countLeadingZerosI_bsr(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct countLeadingZerosI_bsr(rRegI dst, rRegI src, eFlagsReg cr) %{
   predicate(!UseCountLeadingZerosInstruction);
   match(Set dst (CountLeadingZerosI src));
   effect(KILL cr);
@@ -5621,7 +5670,7 @@
   ins_pipe(ialu_reg);
 %}
 
-instruct countLeadingZerosL(eRegI dst, eRegL src, eFlagsReg cr) %{
+instruct countLeadingZerosL(rRegI dst, eRegL src, eFlagsReg cr) %{
   predicate(UseCountLeadingZerosInstruction);
   match(Set dst (CountLeadingZerosL src));
   effect(TEMP dst, KILL cr);
@@ -5644,7 +5693,7 @@
   ins_pipe(ialu_reg);
 %}
 
-instruct countLeadingZerosL_bsr(eRegI dst, eRegL src, eFlagsReg cr) %{
+instruct countLeadingZerosL_bsr(rRegI dst, eRegL src, eFlagsReg cr) %{
   predicate(!UseCountLeadingZerosInstruction);
   match(Set dst (CountLeadingZerosL src));
   effect(TEMP dst, KILL cr);
@@ -5680,7 +5729,7 @@
   ins_pipe(ialu_reg);
 %}
 
-instruct countTrailingZerosI(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct countTrailingZerosI(rRegI dst, rRegI src, eFlagsReg cr) %{
   match(Set dst (CountTrailingZerosI src));
   effect(KILL cr);
 
@@ -5699,7 +5748,7 @@
   ins_pipe(ialu_reg);
 %}
 
-instruct countTrailingZerosL(eRegI dst, eRegL src, eFlagsReg cr) %{
+instruct countTrailingZerosL(rRegI dst, eRegL src, eFlagsReg cr) %{
   match(Set dst (CountTrailingZerosL src));
   effect(TEMP dst, KILL cr);
 
@@ -5731,7 +5780,7 @@
 
 //---------- Population Count Instructions -------------------------------------
 
-instruct popCountI(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct popCountI(rRegI dst, rRegI src, eFlagsReg cr) %{
   predicate(UsePopCountInstruction);
   match(Set dst (PopCountI src));
   effect(KILL cr);
@@ -5743,7 +5792,7 @@
   ins_pipe(ialu_reg);
 %}
 
-instruct popCountI_mem(eRegI dst, memory mem, eFlagsReg cr) %{
+instruct popCountI_mem(rRegI dst, memory mem, eFlagsReg cr) %{
   predicate(UsePopCountInstruction);
   match(Set dst (PopCountI (LoadI mem)));
   effect(KILL cr);
@@ -5756,7 +5805,7 @@
 %}
 
 // Note: Long.bitCount(long) returns an int.
-instruct popCountL(eRegI dst, eRegL src, eRegI tmp, eFlagsReg cr) %{
+instruct popCountL(rRegI dst, eRegL src, rRegI tmp, eFlagsReg cr) %{
   predicate(UsePopCountInstruction);
   match(Set dst (PopCountL src));
   effect(KILL cr, TEMP tmp, TEMP dst);
@@ -5773,7 +5822,7 @@
 %}
 
 // Note: Long.bitCount(long) returns an int.
-instruct popCountL_mem(eRegI dst, memory mem, eRegI tmp, eFlagsReg cr) %{
+instruct popCountL_mem(rRegI dst, memory mem, rRegI tmp, eFlagsReg cr) %{
   predicate(UsePopCountInstruction);
   match(Set dst (PopCountL (LoadL mem)));
   effect(KILL cr, TEMP tmp, TEMP dst);
@@ -5877,7 +5926,7 @@
 %}
 
 // Load Short (16bit signed)
-instruct loadS(eRegI dst, memory mem) %{
+instruct loadS(rRegI dst, memory mem) %{
   match(Set dst (LoadS mem));
 
   ins_cost(125);
@@ -5891,7 +5940,7 @@
 %}
 
 // Load Short (16 bit signed) to Byte (8 bit signed)
-instruct loadS2B(eRegI dst, memory mem, immI_24 twentyfour) %{
+instruct loadS2B(rRegI dst, memory mem, immI_24 twentyfour) %{
   match(Set dst (RShiftI (LShiftI (LoadS mem) twentyfour) twentyfour));
 
   ins_cost(125);
@@ -5922,7 +5971,7 @@
 %}
 
 // Load Unsigned Short/Char (16bit unsigned)
-instruct loadUS(eRegI dst, memory mem) %{
+instruct loadUS(rRegI dst, memory mem) %{
   match(Set dst (LoadUS mem));
 
   ins_cost(125);
@@ -5936,7 +5985,7 @@
 %}
 
 // Load Unsigned Short/Char (16 bit UNsigned) to Byte (8 bit signed)
-instruct loadUS2B(eRegI dst, memory mem, immI_24 twentyfour) %{
+instruct loadUS2B(rRegI dst, memory mem, immI_24 twentyfour) %{
   match(Set dst (RShiftI (LShiftI (LoadUS mem) twentyfour) twentyfour));
 
   ins_cost(125);
@@ -5997,7 +6046,7 @@
 %}
 
 // Load Integer
-instruct loadI(eRegI dst, memory mem) %{
+instruct loadI(rRegI dst, memory mem) %{
   match(Set dst (LoadI mem));
 
   ins_cost(125);
@@ -6011,7 +6060,7 @@
 %}
 
 // Load Integer (32 bit signed) to Byte (8 bit signed)
-instruct loadI2B(eRegI dst, memory mem, immI_24 twentyfour) %{
+instruct loadI2B(rRegI dst, memory mem, immI_24 twentyfour) %{
   match(Set dst (RShiftI (LShiftI (LoadI mem) twentyfour) twentyfour));
 
   ins_cost(125);
@@ -6023,7 +6072,7 @@
 %}
 
 // Load Integer (32 bit signed) to Unsigned Byte (8 bit UNsigned)
-instruct loadI2UB(eRegI dst, memory mem, immI_255 mask) %{
+instruct loadI2UB(rRegI dst, memory mem, immI_255 mask) %{
   match(Set dst (AndI (LoadI mem) mask));
 
   ins_cost(125);
@@ -6035,7 +6084,7 @@
 %}
 
 // Load Integer (32 bit signed) to Short (16 bit signed)
-instruct loadI2S(eRegI dst, memory mem, immI_16 sixteen) %{
+instruct loadI2S(rRegI dst, memory mem, immI_16 sixteen) %{
   match(Set dst (RShiftI (LShiftI (LoadI mem) sixteen) sixteen));
 
   ins_cost(125);
@@ -6047,7 +6096,7 @@
 %}
 
 // Load Integer (32 bit signed) to Unsigned Short/Char (16 bit UNsigned)
-instruct loadI2US(eRegI dst, memory mem, immI_65535 mask) %{
+instruct loadI2US(rRegI dst, memory mem, immI_65535 mask) %{
   match(Set dst (AndI (LoadI mem) mask));
 
   ins_cost(125);
@@ -6208,7 +6257,7 @@
 %}
 
 // Load Range
-instruct loadRange(eRegI dst, memory mem) %{
+instruct loadRange(rRegI dst, memory mem) %{
   match(Set dst (LoadRange mem));
 
   ins_cost(125);
@@ -6305,66 +6354,6 @@
   ins_pipe( fpu_reg_mem );
 %}
 
-// Load Aligned Packed Byte to XMM register
-instruct loadA8B(regD dst, memory mem) %{
-  predicate(UseSSE>=1);
-  match(Set dst (Load8B mem));
-  ins_cost(125);
-  format %{ "MOVQ  $dst,$mem\t! packed8B" %}
-  ins_encode %{
-    __ movq($dst$$XMMRegister, $mem$$Address);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
-// Load Aligned Packed Short to XMM register
-instruct loadA4S(regD dst, memory mem) %{
-  predicate(UseSSE>=1);
-  match(Set dst (Load4S mem));
-  ins_cost(125);
-  format %{ "MOVQ  $dst,$mem\t! packed4S" %}
-  ins_encode %{
-    __ movq($dst$$XMMRegister, $mem$$Address);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
-// Load Aligned Packed Char to XMM register
-instruct loadA4C(regD dst, memory mem) %{
-  predicate(UseSSE>=1);
-  match(Set dst (Load4C mem));
-  ins_cost(125);
-  format %{ "MOVQ  $dst,$mem\t! packed4C" %}
-  ins_encode %{
-    __ movq($dst$$XMMRegister, $mem$$Address);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
-// Load Aligned Packed Integer to XMM register
-instruct load2IU(regD dst, memory mem) %{
-  predicate(UseSSE>=1);
-  match(Set dst (Load2I mem));
-  ins_cost(125);
-  format %{ "MOVQ  $dst,$mem\t! packed2I" %}
-  ins_encode %{
-    __ movq($dst$$XMMRegister, $mem$$Address);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
-// Load Aligned Packed Single to XMM
-instruct loadA2F(regD dst, memory mem) %{
-  predicate(UseSSE>=1);
-  match(Set dst (Load2F mem));
-  ins_cost(145);
-  format %{ "MOVQ  $dst,$mem\t! packed2F" %}
-  ins_encode %{
-    __ movq($dst$$XMMRegister, $mem$$Address);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
 // Load Effective Address
 instruct leaP8(eRegP dst, indOffset8 mem) %{
   match(Set dst mem);
@@ -6417,7 +6406,7 @@
 %}
 
 // Load Constant
-instruct loadConI(eRegI dst, immI src) %{
+instruct loadConI(rRegI dst, immI src) %{
   match(Set dst src);
 
   format %{ "MOV    $dst,$src" %}
@@ -6426,7 +6415,7 @@
 %}
 
 // Load Constant zero
-instruct loadConI0(eRegI dst, immI0 src, eFlagsReg cr) %{
+instruct loadConI0(rRegI dst, immI0 src, eFlagsReg cr) %{
   match(Set dst src);
   effect(KILL cr);
 
@@ -6594,7 +6583,7 @@
 %}
 
 // Load Stack Slot
-instruct loadSSI(eRegI dst, stackSlotI src) %{
+instruct loadSSI(rRegI dst, stackSlotI src) %{
   match(Set dst src);
   ins_cost(125);
 
@@ -6821,7 +6810,7 @@
 %}
 
 // Store Char/Short
-instruct storeC(memory mem, eRegI src) %{
+instruct storeC(memory mem, rRegI src) %{
   match(Set mem (StoreC mem src));
 
   ins_cost(125);
@@ -6832,7 +6821,7 @@
 %}
 
 // Store Integer
-instruct storeI(memory mem, eRegI src) %{
+instruct storeI(memory mem, rRegI src) %{
   match(Set mem (StoreI mem src));
 
   ins_cost(125);
@@ -6976,42 +6965,6 @@
   ins_pipe( ialu_mem_imm );
 %}
 
-// Store Aligned Packed Byte XMM register to memory
-instruct storeA8B(memory mem, regD src) %{
-  predicate(UseSSE>=1);
-  match(Set mem (Store8B mem src));
-  ins_cost(145);
-  format %{ "MOVQ  $mem,$src\t! packed8B" %}
-  ins_encode %{
-    __ movq($mem$$Address, $src$$XMMRegister);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
-// Store Aligned Packed Char/Short XMM register to memory
-instruct storeA4C(memory mem, regD src) %{
-  predicate(UseSSE>=1);
-  match(Set mem (Store4C mem src));
-  ins_cost(145);
-  format %{ "MOVQ  $mem,$src\t! packed4C" %}
-  ins_encode %{
-    __ movq($mem$$Address, $src$$XMMRegister);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
-// Store Aligned Packed Integer XMM register to memory
-instruct storeA2I(memory mem, regD src) %{
-  predicate(UseSSE>=1);
-  match(Set mem (Store2I mem src));
-  ins_cost(145);
-  format %{ "MOVQ  $mem,$src\t! packed2I" %}
-  ins_encode %{
-    __ movq($mem$$Address, $src$$XMMRegister);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
 // Store CMS card-mark Immediate
 instruct storeImmCM(memory mem, immI8 src) %{
   match(Set mem (StoreCM mem src));
@@ -7073,18 +7026,6 @@
   ins_pipe( pipe_slow );
 %}
 
-// Store Aligned Packed Single Float XMM register to memory
-instruct storeA2F(memory mem, regD src) %{
-  predicate(UseSSE>=1);
-  match(Set mem (Store2F mem src));
-  ins_cost(145);
-  format %{ "MOVQ  $mem,$src\t! packed2F" %}
-  ins_encode %{
-    __ movq($mem$$Address, $src$$XMMRegister);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
 // Store Float
 instruct storeFPR( memory mem, regFPR1 src) %{
   predicate(UseSSE==0);
@@ -7146,7 +7087,7 @@
 %}
 
 // Store Integer to stack slot
-instruct storeSSI(stackSlotI dst, eRegI src) %{
+instruct storeSSI(stackSlotI dst, rRegI src) %{
   match(Set dst src);
 
   ins_cost(100);
@@ -7271,7 +7212,7 @@
   ins_pipe(empty);
 %}
 
-instruct castP2X(eRegI dst, eRegP src ) %{
+instruct castP2X(rRegI dst, eRegP src ) %{
   match(Set dst (CastP2X src));
   ins_cost(50);
   format %{ "MOV    $dst, $src\t# CastP2X" %}
@@ -7281,7 +7222,7 @@
 
 //----------Conditional Move---------------------------------------------------
 // Conditional move
-instruct jmovI_reg(cmpOp cop, eFlagsReg cr, eRegI dst, eRegI src) %{
+instruct jmovI_reg(cmpOp cop, eFlagsReg cr, rRegI dst, rRegI src) %{
   predicate(!VM_Version::supports_cmov() );
   match(Set dst (CMoveI (Binary cop cr) (Binary dst src)));
   ins_cost(200);
@@ -7298,7 +7239,7 @@
   ins_pipe( pipe_cmov_reg );
 %}
 
-instruct jmovI_regU(cmpOpU cop, eFlagsRegU cr, eRegI dst, eRegI src) %{
+instruct jmovI_regU(cmpOpU cop, eFlagsRegU cr, rRegI dst, rRegI src) %{
   predicate(!VM_Version::supports_cmov() );
   match(Set dst (CMoveI (Binary cop cr) (Binary dst src)));
   ins_cost(200);
@@ -7315,7 +7256,7 @@
   ins_pipe( pipe_cmov_reg );
 %}
 
-instruct cmovI_reg(eRegI dst, eRegI src, eFlagsReg cr, cmpOp cop ) %{
+instruct cmovI_reg(rRegI dst, rRegI src, eFlagsReg cr, cmpOp cop ) %{
   predicate(VM_Version::supports_cmov() );
   match(Set dst (CMoveI (Binary cop cr) (Binary dst src)));
   ins_cost(200);
@@ -7325,7 +7266,7 @@
   ins_pipe( pipe_cmov_reg );
 %}
 
-instruct cmovI_regU( cmpOpU cop, eFlagsRegU cr, eRegI dst, eRegI src ) %{
+instruct cmovI_regU( cmpOpU cop, eFlagsRegU cr, rRegI dst, rRegI src ) %{
   predicate(VM_Version::supports_cmov() );
   match(Set dst (CMoveI (Binary cop cr) (Binary dst src)));
   ins_cost(200);
@@ -7335,7 +7276,7 @@
   ins_pipe( pipe_cmov_reg );
 %}
 
-instruct cmovI_regUCF( cmpOpUCF cop, eFlagsRegUCF cr, eRegI dst, eRegI src ) %{
+instruct cmovI_regUCF( cmpOpUCF cop, eFlagsRegUCF cr, rRegI dst, rRegI src ) %{
   predicate(VM_Version::supports_cmov() );
   match(Set dst (CMoveI (Binary cop cr) (Binary dst src)));
   ins_cost(200);
@@ -7345,7 +7286,7 @@
 %}
 
 // Conditional move
-instruct cmovI_mem(cmpOp cop, eFlagsReg cr, eRegI dst, memory src) %{
+instruct cmovI_mem(cmpOp cop, eFlagsReg cr, rRegI dst, memory src) %{
   predicate(VM_Version::supports_cmov() );
   match(Set dst (CMoveI (Binary cop cr) (Binary dst (LoadI src))));
   ins_cost(250);
@@ -7356,7 +7297,7 @@
 %}
 
 // Conditional move
-instruct cmovI_memU(cmpOpU cop, eFlagsRegU cr, eRegI dst, memory src) %{
+instruct cmovI_memU(cmpOpU cop, eFlagsRegU cr, rRegI dst, memory src) %{
   predicate(VM_Version::supports_cmov() );
   match(Set dst (CMoveI (Binary cop cr) (Binary dst (LoadI src))));
   ins_cost(250);
@@ -7366,7 +7307,7 @@
   ins_pipe( pipe_cmov_mem );
 %}
 
-instruct cmovI_memUCF(cmpOpUCF cop, eFlagsRegUCF cr, eRegI dst, memory src) %{
+instruct cmovI_memUCF(cmpOpUCF cop, eFlagsRegUCF cr, rRegI dst, memory src) %{
   predicate(VM_Version::supports_cmov() );
   match(Set dst (CMoveI (Binary cop cr) (Binary dst (LoadI src))));
   ins_cost(250);
@@ -7620,7 +7561,7 @@
 //----------Arithmetic Instructions--------------------------------------------
 //----------Addition Instructions----------------------------------------------
 // Integer Addition Instructions
-instruct addI_eReg(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct addI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
   match(Set dst (AddI dst src));
   effect(KILL cr);
 
@@ -7631,7 +7572,7 @@
   ins_pipe( ialu_reg_reg );
 %}
 
-instruct addI_eReg_imm(eRegI dst, immI src, eFlagsReg cr) %{
+instruct addI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{
   match(Set dst (AddI dst src));
   effect(KILL cr);
 
@@ -7641,7 +7582,7 @@
   ins_pipe( ialu_reg );
 %}
 
-instruct incI_eReg(eRegI dst, immI1 src, eFlagsReg cr) %{
+instruct incI_eReg(rRegI dst, immI1 src, eFlagsReg cr) %{
   predicate(UseIncDec);
   match(Set dst (AddI dst src));
   effect(KILL cr);
@@ -7653,7 +7594,7 @@
   ins_pipe( ialu_reg );
 %}
 
-instruct leaI_eReg_immI(eRegI dst, eRegI src0, immI src1) %{
+instruct leaI_eReg_immI(rRegI dst, rRegI src0, immI src1) %{
   match(Set dst (AddI src0 src1));
   ins_cost(110);
 
@@ -7673,7 +7614,7 @@
   ins_pipe( ialu_reg_reg );
 %}
 
-instruct decI_eReg(eRegI dst, immI_M1 src, eFlagsReg cr) %{
+instruct decI_eReg(rRegI dst, immI_M1 src, eFlagsReg cr) %{
   predicate(UseIncDec);
   match(Set dst (AddI dst src));
   effect(KILL cr);
@@ -7685,7 +7626,7 @@
   ins_pipe( ialu_reg );
 %}
 
-instruct addP_eReg(eRegP dst, eRegI src, eFlagsReg cr) %{
+instruct addP_eReg(eRegP dst, rRegI src, eFlagsReg cr) %{
   match(Set dst (AddP dst src));
   effect(KILL cr);
 
@@ -7707,7 +7648,7 @@
   ins_pipe( ialu_reg );
 %}
 
-instruct addI_eReg_mem(eRegI dst, memory src, eFlagsReg cr) %{
+instruct addI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{
   match(Set dst (AddI dst (LoadI src)));
   effect(KILL cr);
 
@@ -7718,7 +7659,7 @@
   ins_pipe( ialu_reg_mem );
 %}
 
-instruct addI_mem_eReg(memory dst, eRegI src, eFlagsReg cr) %{
+instruct addI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{
   match(Set dst (StoreI dst (AddI (LoadI dst) src)));
   effect(KILL cr);
 
@@ -7780,7 +7721,7 @@
   ins_pipe( empty );
 %}
 
-instruct castII( eRegI dst ) %{
+instruct castII( rRegI dst ) %{
   match(Set dst (CastII dst));
   format %{ "#castII of $dst" %}
   ins_encode( /*empty encoding*/ );
@@ -7814,7 +7755,7 @@
 
 // Conditional-store of an int value.
 // ZF flag is set on success, reset otherwise.  Implemented with a CMPXCHG on Intel.
-instruct storeIConditional( memory mem, eAXRegI oldval, eRegI newval, eFlagsReg cr ) %{
+instruct storeIConditional( memory mem, eAXRegI oldval, rRegI newval, eFlagsReg cr ) %{
   match(Set cr (StoreIConditional mem (Binary oldval newval)));
   effect(KILL oldval);
   format %{ "CMPXCHG $mem,$newval\t# If EAX==$mem Then store $newval into $mem" %}
@@ -7847,7 +7788,7 @@
 
 // No flag versions for CompareAndSwap{P,I,L} because matcher can't match them
 
-instruct compareAndSwapL( eRegI res, eSIRegP mem_ptr, eADXRegL oldval, eBCXRegL newval, eFlagsReg cr ) %{
+instruct compareAndSwapL( rRegI res, eSIRegP mem_ptr, eADXRegL oldval, eBCXRegL newval, eFlagsReg cr ) %{
   match(Set res (CompareAndSwapL mem_ptr (Binary oldval newval)));
   effect(KILL cr, KILL oldval);
   format %{ "CMPXCHG8 [$mem_ptr],$newval\t# If EDX:EAX==[$mem_ptr] Then store $newval into [$mem_ptr]\n\t"
@@ -7860,7 +7801,7 @@
   ins_pipe( pipe_cmpxchg );
 %}
 
-instruct compareAndSwapP( eRegI res,  pRegP mem_ptr, eAXRegP oldval, eCXRegP newval, eFlagsReg cr) %{
+instruct compareAndSwapP( rRegI res,  pRegP mem_ptr, eAXRegP oldval, eCXRegP newval, eFlagsReg cr) %{
   match(Set res (CompareAndSwapP mem_ptr (Binary oldval newval)));
   effect(KILL cr, KILL oldval);
   format %{ "CMPXCHG [$mem_ptr],$newval\t# If EAX==[$mem_ptr] Then store $newval into [$mem_ptr]\n\t"
@@ -7872,7 +7813,7 @@
   ins_pipe( pipe_cmpxchg );
 %}
 
-instruct compareAndSwapI( eRegI res, pRegP mem_ptr, eAXRegI oldval, eCXRegI newval, eFlagsReg cr) %{
+instruct compareAndSwapI( rRegI res, pRegP mem_ptr, eAXRegI oldval, eCXRegI newval, eFlagsReg cr) %{
   match(Set res (CompareAndSwapI mem_ptr (Binary oldval newval)));
   effect(KILL cr, KILL oldval);
   format %{ "CMPXCHG [$mem_ptr],$newval\t# If EAX==[$mem_ptr] Then store $newval into [$mem_ptr]\n\t"
@@ -7886,7 +7827,7 @@
 
 //----------Subtraction Instructions-------------------------------------------
 // Integer Subtraction Instructions
-instruct subI_eReg(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct subI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
   match(Set dst (SubI dst src));
   effect(KILL cr);
 
@@ -7897,7 +7838,7 @@
   ins_pipe( ialu_reg_reg );
 %}
 
-instruct subI_eReg_imm(eRegI dst, immI src, eFlagsReg cr) %{
+instruct subI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{
   match(Set dst (SubI dst src));
   effect(KILL cr);
 
@@ -7908,7 +7849,7 @@
   ins_pipe( ialu_reg );
 %}
 
-instruct subI_eReg_mem(eRegI dst, memory src, eFlagsReg cr) %{
+instruct subI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{
   match(Set dst (SubI dst (LoadI src)));
   effect(KILL cr);
 
@@ -7919,7 +7860,7 @@
   ins_pipe( ialu_reg_mem );
 %}
 
-instruct subI_mem_eReg(memory dst, eRegI src, eFlagsReg cr) %{
+instruct subI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{
   match(Set dst (StoreI dst (SubI (LoadI dst) src)));
   effect(KILL cr);
 
@@ -7931,7 +7872,7 @@
 %}
 
 // Subtract from a pointer
-instruct subP_eReg(eRegP dst, eRegI src, immI0 zero, eFlagsReg cr) %{
+instruct subP_eReg(eRegP dst, rRegI src, immI0 zero, eFlagsReg cr) %{
   match(Set dst (AddP dst (SubI zero src)));
   effect(KILL cr);
 
@@ -7942,7 +7883,7 @@
   ins_pipe( ialu_reg_reg );
 %}
 
-instruct negI_eReg(eRegI dst, immI0 zero, eFlagsReg cr) %{
+instruct negI_eReg(rRegI dst, immI0 zero, eFlagsReg cr) %{
   match(Set dst (SubI zero dst));
   effect(KILL cr);
 
@@ -7957,7 +7898,7 @@
 //----------Multiplication/Division Instructions-------------------------------
 // Integer Multiplication Instructions
 // Multiply Register
-instruct mulI_eReg(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct mulI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
   match(Set dst (MulI dst src));
   effect(KILL cr);
 
@@ -7970,7 +7911,7 @@
 %}
 
 // Multiply 32-bit Immediate
-instruct mulI_eReg_imm(eRegI dst, eRegI src, immI imm, eFlagsReg cr) %{
+instruct mulI_eReg_imm(rRegI dst, rRegI src, immI imm, eFlagsReg cr) %{
   match(Set dst (MulI src imm));
   effect(KILL cr);
 
@@ -8026,7 +7967,7 @@
 %}
 
 // Multiply Memory 32-bit Immediate
-instruct mulI_mem_imm(eRegI dst, memory src, immI imm, eFlagsReg cr) %{
+instruct mulI_mem_imm(rRegI dst, memory src, immI imm, eFlagsReg cr) %{
   match(Set dst (MulI (LoadI src) imm));
   effect(KILL cr);
 
@@ -8038,7 +7979,7 @@
 %}
 
 // Multiply Memory
-instruct mulI(eRegI dst, memory src, eFlagsReg cr) %{
+instruct mulI(rRegI dst, memory src, eFlagsReg cr) %{
   match(Set dst (MulI dst (LoadI src)));
   effect(KILL cr);
 
@@ -8075,7 +8016,7 @@
 %}
 
 // Multiply Register Long
-instruct mulL_eReg(eADXRegL dst, eRegL src, eRegI tmp, eFlagsReg cr) %{
+instruct mulL_eReg(eADXRegL dst, eRegL src, rRegI tmp, eFlagsReg cr) %{
   match(Set dst (MulL dst src));
   effect(KILL cr, TEMP tmp);
   ins_cost(4*100+3*400);
@@ -8093,7 +8034,7 @@
 %}
 
 // Multiply Register Long where the left operand's high 32 bits are zero
-instruct mulL_eReg_lhi0(eADXRegL dst, eRegL src, eRegI tmp, eFlagsReg cr) %{
+instruct mulL_eReg_lhi0(eADXRegL dst, eRegL src, rRegI tmp, eFlagsReg cr) %{
   predicate(is_operand_hi32_zero(n->in(1)));
   match(Set dst (MulL dst src));
   effect(KILL cr, TEMP tmp);
@@ -8114,7 +8055,7 @@
 %}
 
 // Multiply Register Long where the right operand's high 32 bits are zero
-instruct mulL_eReg_rhi0(eADXRegL dst, eRegL src, eRegI tmp, eFlagsReg cr) %{
+instruct mulL_eReg_rhi0(eADXRegL dst, eRegL src, rRegI tmp, eFlagsReg cr) %{
   predicate(is_operand_hi32_zero(n->in(2)));
   match(Set dst (MulL dst src));
   effect(KILL cr, TEMP tmp);
@@ -8150,7 +8091,7 @@
 %}
 
 // Multiply Register Long by small constant
-instruct mulL_eReg_con(eADXRegL dst, immL_127 src, eRegI tmp, eFlagsReg cr) %{
+instruct mulL_eReg_con(eADXRegL dst, immL_127 src, rRegI tmp, eFlagsReg cr) %{
   match(Set dst (MulL dst src));
   effect(KILL cr, TEMP tmp);
   ins_cost(2*100+2*400);
@@ -8248,7 +8189,7 @@
 %}
 
 // Divide Register Long (no special case since divisor != -1)
-instruct divL_eReg_imm32( eADXRegL dst, immL32 imm, eRegI tmp, eRegI tmp2, eFlagsReg cr ) %{
+instruct divL_eReg_imm32( eADXRegL dst, immL32 imm, rRegI tmp, rRegI tmp2, eFlagsReg cr ) %{
   match(Set dst (DivL dst imm));
   effect( TEMP tmp, TEMP tmp2, KILL cr );
   ins_cost(1000);
@@ -8319,7 +8260,7 @@
 %}
 
 // Remainder Register Long (remainder fit into 32 bits)
-instruct modL_eReg_imm32( eADXRegL dst, immL32 imm, eRegI tmp, eRegI tmp2, eFlagsReg cr ) %{
+instruct modL_eReg_imm32( eADXRegL dst, immL32 imm, rRegI tmp, rRegI tmp2, eFlagsReg cr ) %{
   match(Set dst (ModL dst imm));
   effect( TEMP tmp, TEMP tmp2, KILL cr );
   ins_cost(1000);
@@ -8387,7 +8328,7 @@
 
 // Integer Shift Instructions
 // Shift Left by one
-instruct shlI_eReg_1(eRegI dst, immI1 shift, eFlagsReg cr) %{
+instruct shlI_eReg_1(rRegI dst, immI1 shift, eFlagsReg cr) %{
   match(Set dst (LShiftI dst shift));
   effect(KILL cr);
 
@@ -8399,7 +8340,7 @@
 %}
 
 // Shift Left by 8-bit immediate
-instruct salI_eReg_imm(eRegI dst, immI8 shift, eFlagsReg cr) %{
+instruct salI_eReg_imm(rRegI dst, immI8 shift, eFlagsReg cr) %{
   match(Set dst (LShiftI dst shift));
   effect(KILL cr);
 
@@ -8411,7 +8352,7 @@
 %}
 
 // Shift Left by variable
-instruct salI_eReg_CL(eRegI dst, eCXRegI shift, eFlagsReg cr) %{
+instruct salI_eReg_CL(rRegI dst, eCXRegI shift, eFlagsReg cr) %{
   match(Set dst (LShiftI dst shift));
   effect(KILL cr);
 
@@ -8423,7 +8364,7 @@
 %}
 
 // Arithmetic shift right by one
-instruct sarI_eReg_1(eRegI dst, immI1 shift, eFlagsReg cr) %{
+instruct sarI_eReg_1(rRegI dst, immI1 shift, eFlagsReg cr) %{
   match(Set dst (RShiftI dst shift));
   effect(KILL cr);
 
@@ -8445,7 +8386,7 @@
 %}
 
 // Arithmetic Shift Right by 8-bit immediate
-instruct sarI_eReg_imm(eRegI dst, immI8 shift, eFlagsReg cr) %{
+instruct sarI_eReg_imm(rRegI dst, immI8 shift, eFlagsReg cr) %{
   match(Set dst (RShiftI dst shift));
   effect(KILL cr);
 
@@ -8468,7 +8409,7 @@
 %}
 
 // Arithmetic Shift Right by variable
-instruct sarI_eReg_CL(eRegI dst, eCXRegI shift, eFlagsReg cr) %{
+instruct sarI_eReg_CL(rRegI dst, eCXRegI shift, eFlagsReg cr) %{
   match(Set dst (RShiftI dst shift));
   effect(KILL cr);
 
@@ -8480,7 +8421,7 @@
 %}
 
 // Logical shift right by one
-instruct shrI_eReg_1(eRegI dst, immI1 shift, eFlagsReg cr) %{
+instruct shrI_eReg_1(rRegI dst, immI1 shift, eFlagsReg cr) %{
   match(Set dst (URShiftI dst shift));
   effect(KILL cr);
 
@@ -8492,7 +8433,7 @@
 %}
 
 // Logical Shift Right by 8-bit immediate
-instruct shrI_eReg_imm(eRegI dst, immI8 shift, eFlagsReg cr) %{
+instruct shrI_eReg_imm(rRegI dst, immI8 shift, eFlagsReg cr) %{
   match(Set dst (URShiftI dst shift));
   effect(KILL cr);
 
@@ -8506,7 +8447,7 @@
 
 // Logical Shift Right by 24, followed by Arithmetic Shift Left by 24.
 // This idiom is used by the compiler for the i2b bytecode.
-instruct i2b(eRegI dst, xRegI src, immI_24 twentyfour) %{
+instruct i2b(rRegI dst, xRegI src, immI_24 twentyfour) %{
   match(Set dst (RShiftI (LShiftI src twentyfour) twentyfour));
 
   size(3);
@@ -8519,7 +8460,7 @@
 
 // Logical Shift Right by 16, followed by Arithmetic Shift Left by 16.
 // This idiom is used by the compiler the i2s bytecode.
-instruct i2s(eRegI dst, xRegI src, immI_16 sixteen) %{
+instruct i2s(rRegI dst, xRegI src, immI_16 sixteen) %{
   match(Set dst (RShiftI (LShiftI src sixteen) sixteen));
 
   size(3);
@@ -8532,7 +8473,7 @@
 
 
 // Logical Shift Right by variable
-instruct shrI_eReg_CL(eRegI dst, eCXRegI shift, eFlagsReg cr) %{
+instruct shrI_eReg_CL(rRegI dst, eCXRegI shift, eFlagsReg cr) %{
   match(Set dst (URShiftI dst shift));
   effect(KILL cr);
 
@@ -8548,7 +8489,7 @@
 //----------Integer Logical Instructions---------------------------------------
 // And Instructions
 // And Register with Register
-instruct andI_eReg(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct andI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
   match(Set dst (AndI dst src));
   effect(KILL cr);
 
@@ -8560,7 +8501,7 @@
 %}
 
 // And Register with Immediate
-instruct andI_eReg_imm(eRegI dst, immI src, eFlagsReg cr) %{
+instruct andI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{
   match(Set dst (AndI dst src));
   effect(KILL cr);
 
@@ -8572,7 +8513,7 @@
 %}
 
 // And Register with Memory
-instruct andI_eReg_mem(eRegI dst, memory src, eFlagsReg cr) %{
+instruct andI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{
   match(Set dst (AndI dst (LoadI src)));
   effect(KILL cr);
 
@@ -8584,7 +8525,7 @@
 %}
 
 // And Memory with Register
-instruct andI_mem_eReg(memory dst, eRegI src, eFlagsReg cr) %{
+instruct andI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{
   match(Set dst (StoreI dst (AndI (LoadI dst) src)));
   effect(KILL cr);
 
@@ -8610,7 +8551,7 @@
 
 // Or Instructions
 // Or Register with Register
-instruct orI_eReg(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct orI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
   match(Set dst (OrI dst src));
   effect(KILL cr);
 
@@ -8621,7 +8562,7 @@
   ins_pipe( ialu_reg_reg );
 %}
 
-instruct orI_eReg_castP2X(eRegI dst, eRegP src, eFlagsReg cr) %{
+instruct orI_eReg_castP2X(rRegI dst, eRegP src, eFlagsReg cr) %{
   match(Set dst (OrI dst (CastP2X src)));
   effect(KILL cr);
 
@@ -8634,7 +8575,7 @@
 
 
 // Or Register with Immediate
-instruct orI_eReg_imm(eRegI dst, immI src, eFlagsReg cr) %{
+instruct orI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{
   match(Set dst (OrI dst src));
   effect(KILL cr);
 
@@ -8646,7 +8587,7 @@
 %}
 
 // Or Register with Memory
-instruct orI_eReg_mem(eRegI dst, memory src, eFlagsReg cr) %{
+instruct orI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{
   match(Set dst (OrI dst (LoadI src)));
   effect(KILL cr);
 
@@ -8658,7 +8599,7 @@
 %}
 
 // Or Memory with Register
-instruct orI_mem_eReg(memory dst, eRegI src, eFlagsReg cr) %{
+instruct orI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{
   match(Set dst (StoreI dst (OrI (LoadI dst) src)));
   effect(KILL cr);
 
@@ -8684,7 +8625,7 @@
 
 // ROL/ROR
 // ROL expand
-instruct rolI_eReg_imm1(eRegI dst, immI1 shift, eFlagsReg cr) %{
+instruct rolI_eReg_imm1(rRegI dst, immI1 shift, eFlagsReg cr) %{
   effect(USE_DEF dst, USE shift, KILL cr);
 
   format %{ "ROL    $dst, $shift" %}
@@ -8693,7 +8634,7 @@
   ins_pipe( ialu_reg );
 %}
 
-instruct rolI_eReg_imm8(eRegI dst, immI8 shift, eFlagsReg cr) %{
+instruct rolI_eReg_imm8(rRegI dst, immI8 shift, eFlagsReg cr) %{
   effect(USE_DEF dst, USE shift, KILL cr);
 
   format %{ "ROL    $dst, $shift" %}
@@ -8713,7 +8654,7 @@
 // end of ROL expand
 
 // ROL 32bit by one once
-instruct rolI_eReg_i1(eRegI dst, immI1 lshift, immI_M1 rshift, eFlagsReg cr) %{
+instruct rolI_eReg_i1(rRegI dst, immI1 lshift, immI_M1 rshift, eFlagsReg cr) %{
   match(Set dst ( OrI (LShiftI dst lshift) (URShiftI dst rshift)));
 
   expand %{
@@ -8722,7 +8663,7 @@
 %}
 
 // ROL 32bit var by imm8 once
-instruct rolI_eReg_i8(eRegI dst, immI8 lshift, immI8 rshift, eFlagsReg cr) %{
+instruct rolI_eReg_i8(rRegI dst, immI8 lshift, immI8 rshift, eFlagsReg cr) %{
   predicate(  0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & 0x1f));
   match(Set dst ( OrI (LShiftI dst lshift) (URShiftI dst rshift)));
 
@@ -8750,7 +8691,7 @@
 %}
 
 // ROR expand
-instruct rorI_eReg_imm1(eRegI dst, immI1 shift, eFlagsReg cr) %{
+instruct rorI_eReg_imm1(rRegI dst, immI1 shift, eFlagsReg cr) %{
   effect(USE_DEF dst, USE shift, KILL cr);
 
   format %{ "ROR    $dst, $shift" %}
@@ -8759,7 +8700,7 @@
   ins_pipe( ialu_reg );
 %}
 
-instruct rorI_eReg_imm8(eRegI dst, immI8 shift, eFlagsReg cr) %{
+instruct rorI_eReg_imm8(rRegI dst, immI8 shift, eFlagsReg cr) %{
   effect (USE_DEF dst, USE shift, KILL cr);
 
   format %{ "ROR    $dst, $shift" %}
@@ -8779,7 +8720,7 @@
 // end of ROR expand
 
 // ROR right once
-instruct rorI_eReg_i1(eRegI dst, immI1 rshift, immI_M1 lshift, eFlagsReg cr) %{
+instruct rorI_eReg_i1(rRegI dst, immI1 rshift, immI_M1 lshift, eFlagsReg cr) %{
   match(Set dst ( OrI (URShiftI dst rshift) (LShiftI dst lshift)));
 
   expand %{
@@ -8788,7 +8729,7 @@
 %}
 
 // ROR 32bit by immI8 once
-instruct rorI_eReg_i8(eRegI dst, immI8 rshift, immI8 lshift, eFlagsReg cr) %{
+instruct rorI_eReg_i8(rRegI dst, immI8 rshift, immI8 lshift, eFlagsReg cr) %{
   predicate(  0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & 0x1f));
   match(Set dst ( OrI (URShiftI dst rshift) (LShiftI dst lshift)));
 
@@ -8817,7 +8758,7 @@
 
 // Xor Instructions
 // Xor Register with Register
-instruct xorI_eReg(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct xorI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
   match(Set dst (XorI dst src));
   effect(KILL cr);
 
@@ -8829,7 +8770,7 @@
 %}
 
 // Xor Register with Immediate -1
-instruct xorI_eReg_im1(eRegI dst, immI_M1 imm) %{
+instruct xorI_eReg_im1(rRegI dst, immI_M1 imm) %{
   match(Set dst (XorI dst imm));  
 
   size(2);
@@ -8841,7 +8782,7 @@
 %}
 
 // Xor Register with Immediate
-instruct xorI_eReg_imm(eRegI dst, immI src, eFlagsReg cr) %{
+instruct xorI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{
   match(Set dst (XorI dst src));
   effect(KILL cr);
 
@@ -8853,7 +8794,7 @@
 %}
 
 // Xor Register with Memory
-instruct xorI_eReg_mem(eRegI dst, memory src, eFlagsReg cr) %{
+instruct xorI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{
   match(Set dst (XorI dst (LoadI src)));
   effect(KILL cr);
 
@@ -8865,7 +8806,7 @@
 %}
 
 // Xor Memory with Register
-instruct xorI_mem_eReg(memory dst, eRegI src, eFlagsReg cr) %{
+instruct xorI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{
   match(Set dst (StoreI dst (XorI (LoadI dst) src)));
   effect(KILL cr);
 
@@ -8890,14 +8831,14 @@
 
 //----------Convert Int to Boolean---------------------------------------------
 
-instruct movI_nocopy(eRegI dst, eRegI src) %{
+instruct movI_nocopy(rRegI dst, rRegI src) %{
   effect( DEF dst, USE src );
   format %{ "MOV    $dst,$src" %}
   ins_encode( enc_Copy( dst, src) );
   ins_pipe( ialu_reg_reg );
 %}
 
-instruct ci2b( eRegI dst, eRegI src, eFlagsReg cr ) %{
+instruct ci2b( rRegI dst, rRegI src, eFlagsReg cr ) %{
   effect( USE_DEF dst, USE src, KILL cr );
 
   size(4);
@@ -8908,7 +8849,7 @@
   ins_pipe( ialu_reg_reg_long );
 %}
 
-instruct convI2B( eRegI dst, eRegI src, eFlagsReg cr ) %{
+instruct convI2B( rRegI dst, rRegI src, eFlagsReg cr ) %{
   match(Set dst (Conv2B src));
 
   expand %{
@@ -8917,14 +8858,14 @@
   %}
 %}
 
-instruct movP_nocopy(eRegI dst, eRegP src) %{
+instruct movP_nocopy(rRegI dst, eRegP src) %{
   effect( DEF dst, USE src );
   format %{ "MOV    $dst,$src" %}
   ins_encode( enc_Copy( dst, src) );
   ins_pipe( ialu_reg_reg );
 %}
 
-instruct cp2b( eRegI dst, eRegP src, eFlagsReg cr ) %{
+instruct cp2b( rRegI dst, eRegP src, eFlagsReg cr ) %{
   effect( USE_DEF dst, USE src, KILL cr );
   format %{ "NEG    $dst\n\t"
             "ADC    $dst,$src" %}
@@ -8933,7 +8874,7 @@
   ins_pipe( ialu_reg_reg_long );
 %}
 
-instruct convP2B( eRegI dst, eRegP src, eFlagsReg cr ) %{
+instruct convP2B( rRegI dst, eRegP src, eFlagsReg cr ) %{
   match(Set dst (Conv2B src));
 
   expand %{
@@ -8958,7 +8899,7 @@
   ins_pipe( pipe_slow );
 %}
 
-instruct cmpLTMask0( eRegI dst, immI0 zero, eFlagsReg cr ) %{
+instruct cmpLTMask0( rRegI dst, immI0 zero, eFlagsReg cr ) %{
   match(Set dst (CmpLTMask dst zero));
   effect( DEF dst, KILL cr );
   ins_cost(100);
@@ -9430,7 +9371,7 @@
 %}
 
 // Compare vs zero into -1,0,1
-instruct cmpDPR_0(eRegI dst, regDPR src1, immDPR0 zero, eAXRegI rax, eFlagsReg cr) %{
+instruct cmpDPR_0(rRegI dst, regDPR src1, immDPR0 zero, eAXRegI rax, eFlagsReg cr) %{
   predicate(UseSSE<=1);
   match(Set dst (CmpD3 src1 zero));
   effect(KILL cr, KILL rax);
@@ -9444,7 +9385,7 @@
 %}
 
 // Compare into -1,0,1
-instruct cmpDPR_reg(eRegI dst, regDPR src1, regDPR src2, eAXRegI rax, eFlagsReg cr) %{
+instruct cmpDPR_reg(rRegI dst, regDPR src1, regDPR src2, eAXRegI rax, eFlagsReg cr) %{
   predicate(UseSSE<=1);
   match(Set dst (CmpD3 src1 src2));
   effect(KILL cr, KILL rax);
@@ -10222,7 +10163,7 @@
 %}
 
 // Compare vs zero into -1,0,1
-instruct cmpFPR_0(eRegI dst, regFPR src1, immFPR0 zero, eAXRegI rax, eFlagsReg cr) %{
+instruct cmpFPR_0(rRegI dst, regFPR src1, immFPR0 zero, eAXRegI rax, eFlagsReg cr) %{
   predicate(UseSSE == 0);
   match(Set dst (CmpF3 src1 zero));
   effect(KILL cr, KILL rax);
@@ -10236,7 +10177,7 @@
 %}
 
 // Compare into -1,0,1
-instruct cmpFPR_reg(eRegI dst, regFPR src1, regFPR src2, eAXRegI rax, eFlagsReg cr) %{
+instruct cmpFPR_reg(rRegI dst, regFPR src1, regFPR src2, eAXRegI rax, eFlagsReg cr) %{
   predicate(UseSSE == 0);
   match(Set dst (CmpF3 src1 src2));
   effect(KILL cr, KILL rax);
@@ -11156,7 +11097,7 @@
   ins_pipe( fpu_reg_mem );
 %}
 
-instruct convI2D_reg(regD dst, eRegI src) %{
+instruct convI2D_reg(regD dst, rRegI src) %{
   predicate( UseSSE>=2 && !UseXmmI2D );
   match(Set dst (ConvI2D src));
   format %{ "CVTSI2SD $dst,$src" %}
@@ -11176,7 +11117,7 @@
   ins_pipe( pipe_slow );
 %}
 
-instruct convXI2D_reg(regD dst, eRegI src)
+instruct convXI2D_reg(regD dst, rRegI src)
 %{
   predicate( UseSSE>=2 && UseXmmI2D );
   match(Set dst (ConvI2D src));
@@ -11264,7 +11205,7 @@
 %}
 
 // Convert an int to a float in xmm; no rounding step needed.
-instruct convI2F_reg(regF dst, eRegI src) %{
+instruct convI2F_reg(regF dst, rRegI src) %{
   predicate( UseSSE==1 || UseSSE>=2 && !UseXmmI2F );
   match(Set dst (ConvI2F src));
   format %{ "CVTSI2SS $dst, $src" %}
@@ -11274,7 +11215,7 @@
   ins_pipe( pipe_slow );
 %}
 
- instruct convXI2F_reg(regF dst, eRegI src)
+ instruct convXI2F_reg(regF dst, rRegI src)
 %{
   predicate( UseSSE>=2 && UseXmmI2F );
   match(Set dst (ConvI2F src));
@@ -11288,7 +11229,7 @@
   ins_pipe(pipe_slow); // XXX
 %}
 
-instruct convI2L_reg( eRegL dst, eRegI src, eFlagsReg cr) %{
+instruct convI2L_reg( eRegL dst, rRegI src, eFlagsReg cr) %{
   match(Set dst (ConvI2L src));
   effect(KILL cr);
   ins_cost(375);
@@ -11300,7 +11241,7 @@
 %}
 
 // Zero-extend convert int to long
-instruct convI2L_reg_zex(eRegL dst, eRegI src, immL_32bits mask, eFlagsReg flags ) %{
+instruct convI2L_reg_zex(eRegL dst, rRegI src, immL_32bits mask, eFlagsReg flags ) %{
   match(Set dst (AndL (ConvI2L src) mask) );
   effect( KILL flags );
   ins_cost(250);
@@ -11380,7 +11321,7 @@
   ins_pipe( pipe_slow );
 %}
 
-instruct convL2I_reg( eRegI dst, eRegL src ) %{
+instruct convL2I_reg( rRegI dst, eRegL src ) %{
   match(Set dst (ConvL2I src));
   effect( DEF dst, USE src );
   format %{ "MOV    $dst,$src.lo" %}
@@ -11389,7 +11330,7 @@
 %}
 
 
-instruct MoveF2I_stack_reg(eRegI dst, stackSlotF src) %{
+instruct MoveF2I_stack_reg(rRegI dst, stackSlotF src) %{
   match(Set dst (MoveF2I src));
   effect( DEF dst, USE src );
   ins_cost(100);
@@ -11424,7 +11365,7 @@
   ins_pipe( pipe_slow );
 %}
 
-instruct MoveF2I_reg_reg_sse(eRegI dst, regF src) %{
+instruct MoveF2I_reg_reg_sse(rRegI dst, regF src) %{
   predicate(UseSSE>=2);
   match(Set dst (MoveF2I src));
   effect( DEF dst, USE src );
@@ -11436,7 +11377,7 @@
   ins_pipe( pipe_slow );
 %}
 
-instruct MoveI2F_reg_stack(stackSlotF dst, eRegI src) %{
+instruct MoveI2F_reg_stack(stackSlotF dst, rRegI src) %{
   match(Set dst (MoveI2F src));
   effect( DEF dst, USE src );
 
@@ -11476,7 +11417,7 @@
   ins_pipe( pipe_slow );
 %}
 
-instruct MoveI2F_reg_reg_sse(regF dst, eRegI src) %{
+instruct MoveI2F_reg_reg_sse(regF dst, rRegI src) %{
   predicate(UseSSE>=2);
   match(Set dst (MoveI2F src));
   effect( DEF dst, USE src );
@@ -11610,186 +11551,6 @@
   ins_pipe( pipe_slow );
 %}
 
-// Replicate scalar to packed byte (1 byte) values in xmm
-instruct Repl8B_reg(regD dst, regD src) %{
-  predicate(UseSSE>=2);
-  match(Set dst (Replicate8B src));
-  format %{ "MOVDQA  $dst,$src\n\t"
-            "PUNPCKLBW $dst,$dst\n\t"
-            "PSHUFLW $dst,$dst,0x00\t! replicate8B" %}
-  ins_encode %{
-    if ($dst$$reg != $src$$reg) {
-      __ movdqa($dst$$XMMRegister, $src$$XMMRegister);
-    }
-    __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
-    __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
-// Replicate scalar to packed byte (1 byte) values in xmm
-instruct Repl8B_eRegI(regD dst, eRegI src) %{
-  predicate(UseSSE>=2);
-  match(Set dst (Replicate8B src));
-  format %{ "MOVD    $dst,$src\n\t"
-            "PUNPCKLBW $dst,$dst\n\t"
-            "PSHUFLW $dst,$dst,0x00\t! replicate8B" %}
-  ins_encode %{
-    __ movdl($dst$$XMMRegister, $src$$Register);
-    __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
-    __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
-// Replicate scalar zero to packed byte (1 byte) values in xmm
-instruct Repl8B_immI0(regD dst, immI0 zero) %{
-  predicate(UseSSE>=2);
-  match(Set dst (Replicate8B zero));
-  format %{ "PXOR  $dst,$dst\t! replicate8B" %}
-  ins_encode %{
-    __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed shore (2 byte) values in xmm
-instruct Repl4S_reg(regD dst, regD src) %{
-  predicate(UseSSE>=2);
-  match(Set dst (Replicate4S src));
-  format %{ "PSHUFLW $dst,$src,0x00\t! replicate4S" %}
-  ins_encode %{
-    __ pshuflw($dst$$XMMRegister, $src$$XMMRegister, 0x00);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed shore (2 byte) values in xmm
-instruct Repl4S_eRegI(regD dst, eRegI src) %{
-  predicate(UseSSE>=2);
-  match(Set dst (Replicate4S src));
-  format %{ "MOVD    $dst,$src\n\t"
-            "PSHUFLW $dst,$dst,0x00\t! replicate4S" %}
-  ins_encode %{
-    __ movdl($dst$$XMMRegister, $src$$Register);
-    __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar zero to packed short (2 byte) values in xmm
-instruct Repl4S_immI0(regD dst, immI0 zero) %{
-  predicate(UseSSE>=2);
-  match(Set dst (Replicate4S zero));
-  format %{ "PXOR  $dst,$dst\t! replicate4S" %}
-  ins_encode %{
-    __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed char (2 byte) values in xmm
-instruct Repl4C_reg(regD dst, regD src) %{
-  predicate(UseSSE>=2);
-  match(Set dst (Replicate4C src));
-  format %{ "PSHUFLW $dst,$src,0x00\t! replicate4C" %}
-  ins_encode %{
-    __ pshuflw($dst$$XMMRegister, $src$$XMMRegister, 0x00);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed char (2 byte) values in xmm
-instruct Repl4C_eRegI(regD dst, eRegI src) %{
-  predicate(UseSSE>=2);
-  match(Set dst (Replicate4C src));
-  format %{ "MOVD    $dst,$src\n\t"
-            "PSHUFLW $dst,$dst,0x00\t! replicate4C" %}
-  ins_encode %{
-    __ movdl($dst$$XMMRegister, $src$$Register);
-    __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar zero to packed char (2 byte) values in xmm
-instruct Repl4C_immI0(regD dst, immI0 zero) %{
-  predicate(UseSSE>=2);
-  match(Set dst (Replicate4C zero));
-  format %{ "PXOR  $dst,$dst\t! replicate4C" %}
-  ins_encode %{
-    __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed integer (4 byte) values in xmm
-instruct Repl2I_reg(regD dst, regD src) %{
-  predicate(UseSSE>=2);
-  match(Set dst (Replicate2I src));
-  format %{ "PSHUFD $dst,$src,0x00\t! replicate2I" %}
-  ins_encode %{
-    __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x00);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed integer (4 byte) values in xmm
-instruct Repl2I_eRegI(regD dst, eRegI src) %{
-  predicate(UseSSE>=2);
-  match(Set dst (Replicate2I src));
-  format %{ "MOVD   $dst,$src\n\t"
-            "PSHUFD $dst,$dst,0x00\t! replicate2I" %}
-  ins_encode %{
-    __ movdl($dst$$XMMRegister, $src$$Register);
-    __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar zero to packed integer (2 byte) values in xmm
-instruct Repl2I_immI0(regD dst, immI0 zero) %{
-  predicate(UseSSE>=2);
-  match(Set dst (Replicate2I zero));
-  format %{ "PXOR  $dst,$dst\t! replicate2I" %}
-  ins_encode %{
-    __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed single precision floating point values in xmm
-instruct Repl2F_reg(regD dst, regD src) %{
-  predicate(UseSSE>=2);
-  match(Set dst (Replicate2F src));
-  format %{ "PSHUFD $dst,$src,0xe0\t! replicate2F" %}
-  ins_encode %{
-    __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0xe0);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed single precision floating point values in xmm
-instruct Repl2F_regF(regD dst, regF src) %{
-  predicate(UseSSE>=2);
-  match(Set dst (Replicate2F src));
-  format %{ "PSHUFD $dst,$src,0xe0\t! replicate2F" %}
-  ins_encode %{
-    __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0xe0);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed single precision floating point values in xmm
-instruct Repl2F_immF0(regD dst, immF0 zero) %{
-  predicate(UseSSE>=2);
-  match(Set dst (Replicate2F zero));
-  format %{ "PXOR  $dst,$dst\t! replicate2F" %}
-  ins_encode %{
-    __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
 
 // =======================================================================
 // fast clearing of an array
@@ -11898,7 +11659,7 @@
 
 //----------Control Flow Instructions------------------------------------------
 // Signed compare Instructions
-instruct compI_eReg(eFlagsReg cr, eRegI op1, eRegI op2) %{
+instruct compI_eReg(eFlagsReg cr, rRegI op1, rRegI op2) %{
   match(Set cr (CmpI op1 op2));
   effect( DEF cr, USE op1, USE op2 );
   format %{ "CMP    $op1,$op2" %}
@@ -11907,7 +11668,7 @@
   ins_pipe( ialu_cr_reg_reg );
 %}
 
-instruct compI_eReg_imm(eFlagsReg cr, eRegI op1, immI op2) %{
+instruct compI_eReg_imm(eFlagsReg cr, rRegI op1, immI op2) %{
   match(Set cr (CmpI op1 op2));
   effect( DEF cr, USE op1 );
   format %{ "CMP    $op1,$op2" %}
@@ -11918,7 +11679,7 @@
 %}
 
 // Cisc-spilled version of cmpI_eReg
-instruct compI_eReg_mem(eFlagsReg cr, eRegI op1, memory op2) %{
+instruct compI_eReg_mem(eFlagsReg cr, rRegI op1, memory op2) %{
   match(Set cr (CmpI op1 (LoadI op2)));
 
   format %{ "CMP    $op1,$op2" %}
@@ -11928,7 +11689,7 @@
   ins_pipe( ialu_cr_reg_mem );
 %}
 
-instruct testI_reg( eFlagsReg cr, eRegI src, immI0 zero ) %{
+instruct testI_reg( eFlagsReg cr, rRegI src, immI0 zero ) %{
   match(Set cr (CmpI src zero));
   effect( DEF cr, USE src );
 
@@ -11938,7 +11699,7 @@
   ins_pipe( ialu_cr_reg_imm );
 %}
 
-instruct testI_reg_imm( eFlagsReg cr, eRegI src, immI con, immI0 zero ) %{
+instruct testI_reg_imm( eFlagsReg cr, rRegI src, immI con, immI0 zero ) %{
   match(Set cr (CmpI (AndI src con) zero));
 
   format %{ "TEST   $src,$con" %}
@@ -11947,7 +11708,7 @@
   ins_pipe( ialu_cr_reg_imm );
 %}
 
-instruct testI_reg_mem( eFlagsReg cr, eRegI src, memory mem, immI0 zero ) %{
+instruct testI_reg_mem( eFlagsReg cr, rRegI src, memory mem, immI0 zero ) %{
   match(Set cr (CmpI (AndI src mem) zero));
 
   format %{ "TEST   $src,$mem" %}
@@ -11958,7 +11719,7 @@
 
 // Unsigned compare Instructions; really, same as signed except they
 // produce an eFlagsRegU instead of eFlagsReg.
-instruct compU_eReg(eFlagsRegU cr, eRegI op1, eRegI op2) %{
+instruct compU_eReg(eFlagsRegU cr, rRegI op1, rRegI op2) %{
   match(Set cr (CmpU op1 op2));
 
   format %{ "CMPu   $op1,$op2" %}
@@ -11967,7 +11728,7 @@
   ins_pipe( ialu_cr_reg_reg );
 %}
 
-instruct compU_eReg_imm(eFlagsRegU cr, eRegI op1, immI op2) %{
+instruct compU_eReg_imm(eFlagsRegU cr, rRegI op1, immI op2) %{
   match(Set cr (CmpU op1 op2));
 
   format %{ "CMPu   $op1,$op2" %}
@@ -11977,7 +11738,7 @@
 %}
 
 // // Cisc-spilled version of cmpU_eReg
-instruct compU_eReg_mem(eFlagsRegU cr, eRegI op1, memory op2) %{
+instruct compU_eReg_mem(eFlagsRegU cr, rRegI op1, memory op2) %{
   match(Set cr (CmpU op1 (LoadI op2)));
 
   format %{ "CMPu   $op1,$op2" %}
@@ -11988,7 +11749,7 @@
 %}
 
 // // Cisc-spilled version of cmpU_eReg
-//instruct compU_mem_eReg(eFlagsRegU cr, memory op1, eRegI op2) %{
+//instruct compU_mem_eReg(eFlagsRegU cr, memory op1, rRegI op2) %{
 //  match(Set cr (CmpU (LoadI op1) op2));
 //
 //  format %{ "CMPu   $op1,$op2" %}
@@ -11997,7 +11758,7 @@
 //  ins_encode( OpcP, RegMem( op1, op2) );
 //%}
 
-instruct testU_reg( eFlagsRegU cr, eRegI src, immI0 zero ) %{
+instruct testU_reg( eFlagsRegU cr, rRegI src, immI0 zero ) %{
   match(Set cr (CmpU src zero));
 
   format %{ "TESTu  $src,$src" %}
@@ -12093,7 +11854,7 @@
 //   *** Min and Max using the conditional move are slower than the
 //   *** branch version on a Pentium III.
 // // Conditional move for min
-//instruct cmovI_reg_lt( eRegI op2, eRegI op1, eFlagsReg cr ) %{
+//instruct cmovI_reg_lt( rRegI op2, rRegI op1, eFlagsReg cr ) %{
 //  effect( USE_DEF op2, USE op1, USE cr );
 //  format %{ "CMOVlt $op2,$op1\t! min" %}
 //  opcode(0x4C,0x0F);
@@ -12102,7 +11863,7 @@
 //%}
 //
 //// Min Register with Register (P6 version)
-//instruct minI_eReg_p6( eRegI op1, eRegI op2 ) %{
+//instruct minI_eReg_p6( rRegI op1, rRegI op2 ) %{
 //  predicate(VM_Version::supports_cmov() );
 //  match(Set op2 (MinI op1 op2));
 //  ins_cost(200);
@@ -12114,7 +11875,7 @@
 //%}
 
 // Min Register with Register (generic version)
-instruct minI_eReg(eRegI dst, eRegI src, eFlagsReg flags) %{
+instruct minI_eReg(rRegI dst, rRegI src, eFlagsReg flags) %{
   match(Set dst (MinI dst src));
   effect(KILL flags);
   ins_cost(300);
@@ -12129,7 +11890,7 @@
 //   *** Min and Max using the conditional move are slower than the
 //   *** branch version on a Pentium III.
 // // Conditional move for max
-//instruct cmovI_reg_gt( eRegI op2, eRegI op1, eFlagsReg cr ) %{
+//instruct cmovI_reg_gt( rRegI op2, rRegI op1, eFlagsReg cr ) %{
 //  effect( USE_DEF op2, USE op1, USE cr );
 //  format %{ "CMOVgt $op2,$op1\t! max" %}
 //  opcode(0x4F,0x0F);
@@ -12138,7 +11899,7 @@
 //%}
 //
 // // Max Register with Register (P6 version)
-//instruct maxI_eReg_p6( eRegI op1, eRegI op2 ) %{
+//instruct maxI_eReg_p6( rRegI op1, rRegI op2 ) %{
 //  predicate(VM_Version::supports_cmov() );
 //  match(Set op2 (MaxI op1 op2));
 //  ins_cost(200);
@@ -12150,7 +11911,7 @@
 //%}
 
 // Max Register with Register (generic version)
-instruct maxI_eReg(eRegI dst, eRegI src, eFlagsReg flags) %{
+instruct maxI_eReg(rRegI dst, rRegI src, eFlagsReg flags) %{
   match(Set dst (MaxI dst src));
   effect(KILL flags);
   ins_cost(300);
@@ -12211,7 +11972,7 @@
 // ============================================================================
 // Branch Instructions
 // Jump Table
-instruct jumpXtnd(eRegI switch_val) %{
+instruct jumpXtnd(rRegI switch_val) %{
   match(Jump switch_val);
   ins_cost(350);
   format %{  "JMP    [$constantaddress](,$switch_val,1)\n\t" %}
@@ -12629,7 +12390,7 @@
 // Manifest a CmpL result in the normal flags.  Only good for LT or GE
 // compares.  Can be used for LE or GT compares by reversing arguments.
 // NOT GOOD FOR EQ/NE tests.
-instruct cmpL_reg_flags_LTGE( flagsReg_long_LTGE flags, eRegL src1, eRegL src2, eRegI tmp ) %{
+instruct cmpL_reg_flags_LTGE( flagsReg_long_LTGE flags, eRegL src1, eRegL src2, rRegI tmp ) %{
   match( Set flags (CmpL src1 src2 ));
   effect( TEMP tmp );
   ins_cost(300);
@@ -12675,7 +12436,7 @@
 %}
 
 // Compare 2 longs and CMOVE ints.
-instruct cmovII_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, eRegI dst, eRegI src) %{
+instruct cmovII_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, rRegI dst, rRegI src) %{
   predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge ));
   match(Set dst (CMoveI (Binary cmp flags) (Binary dst src)));
   ins_cost(200);
@@ -12685,7 +12446,7 @@
   ins_pipe( pipe_cmov_reg );
 %}
 
-instruct cmovII_mem_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, eRegI dst, memory src) %{
+instruct cmovII_mem_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, rRegI dst, memory src) %{
   predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge ));
   match(Set dst (CMoveI (Binary cmp flags) (Binary dst (LoadI src))));
   ins_cost(250);
@@ -12746,7 +12507,7 @@
 
 //======
 // Manifest a CmpL result in the normal flags.  Only good for EQ/NE compares.
-instruct cmpL_zero_flags_EQNE( flagsReg_long_EQNE flags, eRegL src, immL0 zero, eRegI tmp ) %{
+instruct cmpL_zero_flags_EQNE( flagsReg_long_EQNE flags, eRegL src, immL0 zero, rRegI tmp ) %{
   match( Set flags (CmpL src zero ));
   effect(TEMP tmp);
   ins_cost(200);
@@ -12803,7 +12564,7 @@
 %}
 
 // Compare 2 longs and CMOVE ints.
-instruct cmovII_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, eRegI dst, eRegI src) %{
+instruct cmovII_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, rRegI dst, rRegI src) %{
   predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne ));
   match(Set dst (CMoveI (Binary cmp flags) (Binary dst src)));
   ins_cost(200);
@@ -12813,7 +12574,7 @@
   ins_pipe( pipe_cmov_reg );
 %}
 
-instruct cmovII_mem_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, eRegI dst, memory src) %{
+instruct cmovII_mem_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, rRegI dst, memory src) %{
   predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne ));
   match(Set dst (CMoveI (Binary cmp flags) (Binary dst (LoadI src))));
   ins_cost(250);
@@ -12875,7 +12636,7 @@
 //======
 // Manifest a CmpL result in the normal flags.  Only good for LE or GT compares.
 // Same as cmpL_reg_flags_LEGT except must negate src
-instruct cmpL_zero_flags_LEGT( flagsReg_long_LEGT flags, eRegL src, immL0 zero, eRegI tmp ) %{
+instruct cmpL_zero_flags_LEGT( flagsReg_long_LEGT flags, eRegL src, immL0 zero, rRegI tmp ) %{
   match( Set flags (CmpL src zero ));
   effect( TEMP tmp );
   ins_cost(300);
@@ -12889,7 +12650,7 @@
 // Manifest a CmpL result in the normal flags.  Only good for LE or GT compares.
 // Same as cmpL_reg_flags_LTGE except operands swapped.  Swapping operands
 // requires a commuted test to get the same result.
-instruct cmpL_reg_flags_LEGT( flagsReg_long_LEGT flags, eRegL src1, eRegL src2, eRegI tmp ) %{
+instruct cmpL_reg_flags_LEGT( flagsReg_long_LEGT flags, eRegL src1, eRegL src2, rRegI tmp ) %{
   match( Set flags (CmpL src1 src2 ));
   effect( TEMP tmp );
   ins_cost(300);
@@ -12936,7 +12697,7 @@
 %}
 
 // Compare 2 longs and CMOVE ints.
-instruct cmovII_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, eRegI dst, eRegI src) %{
+instruct cmovII_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, rRegI dst, rRegI src) %{
   predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ));
   match(Set dst (CMoveI (Binary cmp flags) (Binary dst src)));
   ins_cost(200);
@@ -12946,7 +12707,7 @@
   ins_pipe( pipe_cmov_reg );
 %}
 
-instruct cmovII_mem_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, eRegI dst, memory src) %{
+instruct cmovII_mem_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, rRegI dst, memory src) %{
   predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ));
   match(Set dst (CMoveI (Binary cmp flags) (Binary dst (LoadI src))));
   ins_cost(250);
@@ -13275,11 +13036,11 @@
 // ---------EXAMPLE----------------------------------------------------------
 //
 // // pertinent parts of existing instructions in architecture description
-// instruct movI(eRegI dst, eRegI src) %{
+// instruct movI(rRegI dst, rRegI src) %{
 //   match(Set dst (CopyI src));
 // %}
 //
-// instruct incI_eReg(eRegI dst, immI1 src, eFlagsReg cr) %{
+// instruct incI_eReg(rRegI dst, immI1 src, eFlagsReg cr) %{
 //   match(Set dst (AddI dst src));
 //   effect(KILL cr);
 // %}
@@ -13324,11 +13085,11 @@
 // %}
 
 // // Change load of spilled value to only a spill
-// instruct storeI(memory mem, eRegI src) %{
+// instruct storeI(memory mem, rRegI src) %{
 //   match(Set mem (StoreI mem src));
 // %}
 //
-// instruct loadI(eRegI dst, memory mem) %{
+// instruct loadI(rRegI dst, memory mem) %{
 //   match(Set dst (LoadI mem));
 // %}
 //
--- a/src/cpu/x86/vm/x86_64.ad	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/cpu/x86/vm/x86_64.ad	Fri Aug 03 20:23:25 2012 +0100
@@ -131,102 +131,6 @@
 
 // Floating Point Registers
 
-// XMM registers.  128-bit registers or 4 words each, labeled (a)-d.
-// Word a in each register holds a Float, words ab hold a Double.  We
-// currently do not use the SIMD capabilities, so registers cd are
-// unused at the moment.
-// XMM8-XMM15 must be encoded with REX.
-// Linux ABI:   No register preserved across function calls
-//              XMM0-XMM7 might hold parameters
-// Windows ABI: XMM6-XMM15 preserved across function calls
-//              XMM0-XMM3 might hold parameters
-
-reg_def XMM0   (SOC, SOC, Op_RegF,  0, xmm0->as_VMReg());
-reg_def XMM0_H (SOC, SOC, Op_RegF,  0, xmm0->as_VMReg()->next());
-
-reg_def XMM1   (SOC, SOC, Op_RegF,  1, xmm1->as_VMReg());
-reg_def XMM1_H (SOC, SOC, Op_RegF,  1, xmm1->as_VMReg()->next());
-
-reg_def XMM2   (SOC, SOC, Op_RegF,  2, xmm2->as_VMReg());
-reg_def XMM2_H (SOC, SOC, Op_RegF,  2, xmm2->as_VMReg()->next());
-
-reg_def XMM3   (SOC, SOC, Op_RegF,  3, xmm3->as_VMReg());
-reg_def XMM3_H (SOC, SOC, Op_RegF,  3, xmm3->as_VMReg()->next());
-
-reg_def XMM4   (SOC, SOC, Op_RegF,  4, xmm4->as_VMReg());
-reg_def XMM4_H (SOC, SOC, Op_RegF,  4, xmm4->as_VMReg()->next());
-
-reg_def XMM5   (SOC, SOC, Op_RegF,  5, xmm5->as_VMReg());
-reg_def XMM5_H (SOC, SOC, Op_RegF,  5, xmm5->as_VMReg()->next());
-
-#ifdef _WIN64
-
-reg_def XMM6   (SOC, SOE, Op_RegF,  6, xmm6->as_VMReg());
-reg_def XMM6_H (SOC, SOE, Op_RegF,  6, xmm6->as_VMReg()->next());
-
-reg_def XMM7   (SOC, SOE, Op_RegF,  7, xmm7->as_VMReg());
-reg_def XMM7_H (SOC, SOE, Op_RegF,  7, xmm7->as_VMReg()->next());
-
-reg_def XMM8   (SOC, SOE, Op_RegF,  8, xmm8->as_VMReg());
-reg_def XMM8_H (SOC, SOE, Op_RegF,  8, xmm8->as_VMReg()->next());
-
-reg_def XMM9   (SOC, SOE, Op_RegF,  9, xmm9->as_VMReg());
-reg_def XMM9_H (SOC, SOE, Op_RegF,  9, xmm9->as_VMReg()->next());
-
-reg_def XMM10  (SOC, SOE, Op_RegF, 10, xmm10->as_VMReg());
-reg_def XMM10_H(SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next());
-
-reg_def XMM11  (SOC, SOE, Op_RegF, 11, xmm11->as_VMReg());
-reg_def XMM11_H(SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next());
-
-reg_def XMM12  (SOC, SOE, Op_RegF, 12, xmm12->as_VMReg());
-reg_def XMM12_H(SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next());
-
-reg_def XMM13  (SOC, SOE, Op_RegF, 13, xmm13->as_VMReg());
-reg_def XMM13_H(SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next());
-
-reg_def XMM14  (SOC, SOE, Op_RegF, 14, xmm14->as_VMReg());
-reg_def XMM14_H(SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next());
-
-reg_def XMM15  (SOC, SOE, Op_RegF, 15, xmm15->as_VMReg());
-reg_def XMM15_H(SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next());
-
-#else
-
-reg_def XMM6   (SOC, SOC, Op_RegF,  6, xmm6->as_VMReg());
-reg_def XMM6_H (SOC, SOC, Op_RegF,  6, xmm6->as_VMReg()->next());
-
-reg_def XMM7   (SOC, SOC, Op_RegF,  7, xmm7->as_VMReg());
-reg_def XMM7_H (SOC, SOC, Op_RegF,  7, xmm7->as_VMReg()->next());
-
-reg_def XMM8   (SOC, SOC, Op_RegF,  8, xmm8->as_VMReg());
-reg_def XMM8_H (SOC, SOC, Op_RegF,  8, xmm8->as_VMReg()->next());
-
-reg_def XMM9   (SOC, SOC, Op_RegF,  9, xmm9->as_VMReg());
-reg_def XMM9_H (SOC, SOC, Op_RegF,  9, xmm9->as_VMReg()->next());
-
-reg_def XMM10  (SOC, SOC, Op_RegF, 10, xmm10->as_VMReg());
-reg_def XMM10_H(SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next());
-
-reg_def XMM11  (SOC, SOC, Op_RegF, 11, xmm11->as_VMReg());
-reg_def XMM11_H(SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next());
-
-reg_def XMM12  (SOC, SOC, Op_RegF, 12, xmm12->as_VMReg());
-reg_def XMM12_H(SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next());
-
-reg_def XMM13  (SOC, SOC, Op_RegF, 13, xmm13->as_VMReg());
-reg_def XMM13_H(SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next());
-
-reg_def XMM14  (SOC, SOC, Op_RegF, 14, xmm14->as_VMReg());
-reg_def XMM14_H(SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next());
-
-reg_def XMM15  (SOC, SOC, Op_RegF, 15, xmm15->as_VMReg());
-reg_def XMM15_H(SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next());
-
-#endif // _WIN64
-
-reg_def RFLAGS(SOC, SOC, 0, 16, VMRegImpl::Bad());
-
 // Specify priority of register selection within phases of register
 // allocation.  Highest priority is first.  A useful heuristic is to
 // give registers a low priority when they are required by machine
@@ -252,26 +156,6 @@
                    R15,         R15_H,
                    RSP,         RSP_H);
 
-// XXX probably use 8-15 first on Linux
-alloc_class chunk1(XMM0,  XMM0_H,
-                   XMM1,  XMM1_H,
-                   XMM2,  XMM2_H,
-                   XMM3,  XMM3_H,
-                   XMM4,  XMM4_H,
-                   XMM5,  XMM5_H,
-                   XMM6,  XMM6_H,
-                   XMM7,  XMM7_H,
-                   XMM8,  XMM8_H,
-                   XMM9,  XMM9_H,
-                   XMM10, XMM10_H,
-                   XMM11, XMM11_H,
-                   XMM12, XMM12_H,
-                   XMM13, XMM13_H,
-                   XMM14, XMM14_H,
-                   XMM15, XMM15_H);
-
-alloc_class chunk2(RFLAGS);
-
 
 //----------Architecture Description Register Classes--------------------------
 // Several register classes are automatically defined based upon information in
@@ -501,46 +385,7 @@
 // Singleton class for instruction pointer
 // reg_class ip_reg(RIP);
 
-// Singleton class for condition codes
-reg_class int_flags(RFLAGS);
-
-// Class for all float registers
-reg_class float_reg(XMM0,
-                    XMM1,
-                    XMM2,
-                    XMM3,
-                    XMM4,
-                    XMM5,
-                    XMM6,
-                    XMM7,
-                    XMM8,
-                    XMM9,
-                    XMM10,
-                    XMM11,
-                    XMM12,
-                    XMM13,
-                    XMM14,
-                    XMM15);
-
-// Class for all double registers
-reg_class double_reg(XMM0,  XMM0_H,
-                     XMM1,  XMM1_H,
-                     XMM2,  XMM2_H,
-                     XMM3,  XMM3_H,
-                     XMM4,  XMM4_H,
-                     XMM5,  XMM5_H,
-                     XMM6,  XMM6_H,
-                     XMM7,  XMM7_H,
-                     XMM8,  XMM8_H,
-                     XMM9,  XMM9_H,
-                     XMM10, XMM10_H,
-                     XMM11, XMM11_H,
-                     XMM12, XMM12_H,
-                     XMM13, XMM13_H,
-                     XMM14, XMM14_H,
-                     XMM15, XMM15_H);
-%}
-
+%}
 
 //----------SOURCE BLOCK-------------------------------------------------------
 // This is a block of C++ code which provides values, functions, and
@@ -1027,12 +872,84 @@
   return rc_float;
 }
 
+// Next two methods are shared by 32- and 64-bit VM. They are defined in x86.ad.
+static int vec_mov_helper(CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo,
+                          int src_hi, int dst_hi, uint ireg, outputStream* st);
+
+static int vec_spill_helper(CodeBuffer *cbuf, bool do_size, bool is_load,
+                            int stack_offset, int reg, uint ireg, outputStream* st);
+
+static void vec_stack_to_stack_helper(CodeBuffer *cbuf, int src_offset,
+                                      int dst_offset, uint ireg, outputStream* st) {
+  if (cbuf) {
+    MacroAssembler _masm(cbuf);
+    switch (ireg) {
+    case Op_VecS:
+      __ movq(Address(rsp, -8), rax);
+      __ movl(rax, Address(rsp, src_offset));
+      __ movl(Address(rsp, dst_offset), rax);
+      __ movq(rax, Address(rsp, -8));
+      break;
+    case Op_VecD:
+      __ pushq(Address(rsp, src_offset));
+      __ popq (Address(rsp, dst_offset));
+      break;
+    case Op_VecX:
+      __ pushq(Address(rsp, src_offset));
+      __ popq (Address(rsp, dst_offset));
+      __ pushq(Address(rsp, src_offset+8));
+      __ popq (Address(rsp, dst_offset+8));
+      break;
+    case Op_VecY:
+      __ vmovdqu(Address(rsp, -32), xmm0);
+      __ vmovdqu(xmm0, Address(rsp, src_offset));
+      __ vmovdqu(Address(rsp, dst_offset), xmm0);
+      __ vmovdqu(xmm0, Address(rsp, -32));
+      break;
+    default:
+      ShouldNotReachHere();
+    }
+#ifndef PRODUCT
+  } else {
+    switch (ireg) {
+    case Op_VecS:
+      st->print("movq    [rsp - #8], rax\t# 32-bit mem-mem spill\n\t"
+                "movl    rax, [rsp + #%d]\n\t"
+                "movl    [rsp + #%d], rax\n\t"
+                "movq    rax, [rsp - #8]",
+                src_offset, dst_offset);
+      break;
+    case Op_VecD:
+      st->print("pushq   [rsp + #%d]\t# 64-bit mem-mem spill\n\t"
+                "popq    [rsp + #%d]",
+                src_offset, dst_offset);
+      break;
+     case Op_VecX:
+      st->print("pushq   [rsp + #%d]\t# 128-bit mem-mem spill\n\t"
+                "popq    [rsp + #%d]\n\t"
+                "pushq   [rsp + #%d]\n\t"
+                "popq    [rsp + #%d]",
+                src_offset, dst_offset, src_offset+8, dst_offset+8);
+      break;
+    case Op_VecY:
+      st->print("vmovdqu [rsp - #32], xmm0\t# 256-bit mem-mem spill\n\t"
+                "vmovdqu xmm0, [rsp + #%d]\n\t"
+                "vmovdqu [rsp + #%d], xmm0\n\t"
+                "vmovdqu xmm0, [rsp - #32]",
+                src_offset, dst_offset);
+      break;
+    default:
+      ShouldNotReachHere();
+    }
+#endif
+  }
+}
+
 uint MachSpillCopyNode::implementation(CodeBuffer* cbuf,
                                        PhaseRegAlloc* ra_,
                                        bool do_size,
-                                       outputStream* st) const
-{
-
+                                       outputStream* st) const {
+  assert(cbuf != NULL || st  != NULL, "sanity");
   // Get registers to move
   OptoReg::Name src_second = ra_->get_reg_second(in(1));
   OptoReg::Name src_first = ra_->get_reg_first(in(1));
@@ -1050,7 +967,30 @@
   if (src_first == dst_first && src_second == dst_second) {
     // Self copy, no move
     return 0;
-  } else if (src_first_rc == rc_stack) {
+  }
+  if (bottom_type()->isa_vect() != NULL) {
+    uint ireg = ideal_reg();
+    assert((src_first_rc != rc_int && dst_first_rc != rc_int), "sanity");
+    assert((ireg == Op_VecS || ireg == Op_VecD || ireg == Op_VecX || ireg == Op_VecY), "sanity");
+    if( src_first_rc == rc_stack && dst_first_rc == rc_stack ) {
+      // mem -> mem
+      int src_offset = ra_->reg2offset(src_first);
+      int dst_offset = ra_->reg2offset(dst_first);
+      vec_stack_to_stack_helper(cbuf, src_offset, dst_offset, ireg, st);
+    } else if (src_first_rc == rc_float && dst_first_rc == rc_float ) {
+      vec_mov_helper(cbuf, false, src_first, dst_first, src_second, dst_second, ireg, st);
+    } else if (src_first_rc == rc_float && dst_first_rc == rc_stack ) {
+      int stack_offset = ra_->reg2offset(dst_first);
+      vec_spill_helper(cbuf, false, false, stack_offset, src_first, ireg, st);
+    } else if (src_first_rc == rc_stack && dst_first_rc == rc_float ) {
+      int stack_offset = ra_->reg2offset(src_first);
+      vec_spill_helper(cbuf, false, true,  stack_offset, dst_first, ireg, st);
+    } else {
+      ShouldNotReachHere();
+    }
+    return 0;
+  }
+  if (src_first_rc == rc_stack) {
     // mem ->
     if (dst_first_rc == rc_stack) {
       // mem -> mem
@@ -1061,23 +1001,16 @@
         int src_offset = ra_->reg2offset(src_first);
         int dst_offset = ra_->reg2offset(dst_first);
         if (cbuf) {
-          emit_opcode(*cbuf, 0xFF);
-          encode_RegMem(*cbuf, RSI_enc, RSP_enc, 0x4, 0, src_offset, false);
-
-          emit_opcode(*cbuf, 0x8F);
-          encode_RegMem(*cbuf, RAX_enc, RSP_enc, 0x4, 0, dst_offset, false);
-
+          MacroAssembler _masm(cbuf);
+          __ pushq(Address(rsp, src_offset));
+          __ popq (Address(rsp, dst_offset));
 #ifndef PRODUCT
-        } else if (!do_size) {
+        } else {
           st->print("pushq   [rsp + #%d]\t# 64-bit mem-mem spill\n\t"
-                     "popq    [rsp + #%d]",
-                     src_offset,
-                     dst_offset);
+                    "popq    [rsp + #%d]",
+                     src_offset, dst_offset);
 #endif
         }
-        return
-          3 + ((src_offset == 0) ? 0 : (src_offset < 0x80 ? 1 : 4)) +
-          3 + ((dst_offset == 0) ? 0 : (dst_offset < 0x80 ? 1 : 4));
       } else {
         // 32-bit
         assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform");
@@ -1086,46 +1019,22 @@
         int src_offset = ra_->reg2offset(src_first);
         int dst_offset = ra_->reg2offset(dst_first);
         if (cbuf) {
-          emit_opcode(*cbuf, Assembler::REX_W);
-          emit_opcode(*cbuf, 0x89);
-          emit_opcode(*cbuf, 0x44);
-          emit_opcode(*cbuf, 0x24);
-          emit_opcode(*cbuf, 0xF8);
-
-          emit_opcode(*cbuf, 0x8B);
-          encode_RegMem(*cbuf,
-                        RAX_enc,
-                        RSP_enc, 0x4, 0, src_offset,
-                        false);
-
-          emit_opcode(*cbuf, 0x89);
-          encode_RegMem(*cbuf,
-                        RAX_enc,
-                        RSP_enc, 0x4, 0, dst_offset,
-                        false);
-
-          emit_opcode(*cbuf, Assembler::REX_W);
-          emit_opcode(*cbuf, 0x8B);
-          emit_opcode(*cbuf, 0x44);
-          emit_opcode(*cbuf, 0x24);
-          emit_opcode(*cbuf, 0xF8);
-
+          MacroAssembler _masm(cbuf);
+          __ movq(Address(rsp, -8), rax);
+          __ movl(rax, Address(rsp, src_offset));
+          __ movl(Address(rsp, dst_offset), rax);
+          __ movq(rax, Address(rsp, -8));
 #ifndef PRODUCT
-        } else if (!do_size) {
+        } else {
           st->print("movq    [rsp - #8], rax\t# 32-bit mem-mem spill\n\t"
-                     "movl    rax, [rsp + #%d]\n\t"
-                     "movl    [rsp + #%d], rax\n\t"
-                     "movq    rax, [rsp - #8]",
-                     src_offset,
-                     dst_offset);
+                    "movl    rax, [rsp + #%d]\n\t"
+                    "movl    [rsp + #%d], rax\n\t"
+                    "movq    rax, [rsp - #8]",
+                     src_offset, dst_offset);
 #endif
         }
-        return
-          5 + // movq
-          3 + ((src_offset == 0) ? 0 : (src_offset < 0x80 ? 1 : 4)) + // movl
-          3 + ((dst_offset == 0) ? 0 : (dst_offset < 0x80 ? 1 : 4)) + // movl
-          5; // movq
       }
+      return 0;
     } else if (dst_first_rc == rc_int) {
       // mem -> gpr
       if ((src_first & 1) == 0 && src_first + 1 == src_second &&
@@ -1133,52 +1042,32 @@
         // 64-bit
         int offset = ra_->reg2offset(src_first);
         if (cbuf) {
-          if (Matcher::_regEncode[dst_first] < 8) {
-            emit_opcode(*cbuf, Assembler::REX_W);
-          } else {
-            emit_opcode(*cbuf, Assembler::REX_WR);
-          }
-          emit_opcode(*cbuf, 0x8B);
-          encode_RegMem(*cbuf,
-                        Matcher::_regEncode[dst_first],
-                        RSP_enc, 0x4, 0, offset,
-                        false);
+          MacroAssembler _masm(cbuf);
+          __ movq(as_Register(Matcher::_regEncode[dst_first]), Address(rsp, offset));
 #ifndef PRODUCT
-        } else if (!do_size) {
+        } else {
           st->print("movq    %s, [rsp + #%d]\t# spill",
                      Matcher::regName[dst_first],
                      offset);
 #endif
         }
-        return
-          ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) + 4; // REX
       } else {
         // 32-bit
         assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform");
         assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform");
         int offset = ra_->reg2offset(src_first);
         if (cbuf) {
-          if (Matcher::_regEncode[dst_first] >= 8) {
-            emit_opcode(*cbuf, Assembler::REX_R);
-          }
-          emit_opcode(*cbuf, 0x8B);
-          encode_RegMem(*cbuf,
-                        Matcher::_regEncode[dst_first],
-                        RSP_enc, 0x4, 0, offset,
-                        false);
+          MacroAssembler _masm(cbuf);
+          __ movl(as_Register(Matcher::_regEncode[dst_first]), Address(rsp, offset));
 #ifndef PRODUCT
-        } else if (!do_size) {
+        } else {
           st->print("movl    %s, [rsp + #%d]\t# spill",
                      Matcher::regName[dst_first],
                      offset);
 #endif
         }
-        return
-          ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) +
-          ((Matcher::_regEncode[dst_first] < 8)
-           ? 3
-           : 4); // REX
       }
+      return 0;
     } else if (dst_first_rc == rc_float) {
       // mem-> xmm
       if ((src_first & 1) == 0 && src_first + 1 == src_second &&
@@ -1189,18 +1078,13 @@
           MacroAssembler _masm(cbuf);
           __ movdbl( as_XMMRegister(Matcher::_regEncode[dst_first]), Address(rsp, offset));
 #ifndef PRODUCT
-        } else if (!do_size) {
+        } else {
           st->print("%s  %s, [rsp + #%d]\t# spill",
                      UseXmmLoadAndClearUpper ? "movsd " : "movlpd",
                      Matcher::regName[dst_first],
                      offset);
 #endif
         }
-        return
-          ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) +
-          ((Matcher::_regEncode[dst_first] >= 8)
-           ? 6
-           : (5 + ((UseAVX>0)?1:0))); // REX
       } else {
         // 32-bit
         assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform");
@@ -1210,18 +1094,14 @@
           MacroAssembler _masm(cbuf);
           __ movflt( as_XMMRegister(Matcher::_regEncode[dst_first]), Address(rsp, offset));
 #ifndef PRODUCT
-        } else if (!do_size) {
+        } else {
           st->print("movss   %s, [rsp + #%d]\t# spill",
                      Matcher::regName[dst_first],
                      offset);
 #endif
         }
-        return
-          ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) +
-          ((Matcher::_regEncode[dst_first] >= 8)
-           ? 6
-           : (5 + ((UseAVX>0)?1:0))); // REX
       }
+      return 0;
     }
   } else if (src_first_rc == rc_int) {
     // gpr ->
@@ -1232,113 +1112,65 @@
         // 64-bit
         int offset = ra_->reg2offset(dst_first);
         if (cbuf) {
-          if (Matcher::_regEncode[src_first] < 8) {
-            emit_opcode(*cbuf, Assembler::REX_W);
-          } else {
-            emit_opcode(*cbuf, Assembler::REX_WR);
-          }
-          emit_opcode(*cbuf, 0x89);
-          encode_RegMem(*cbuf,
-                        Matcher::_regEncode[src_first],
-                        RSP_enc, 0x4, 0, offset,
-                        false);
+          MacroAssembler _masm(cbuf);
+          __ movq(Address(rsp, offset), as_Register(Matcher::_regEncode[src_first]));
 #ifndef PRODUCT
-        } else if (!do_size) {
+        } else {
           st->print("movq    [rsp + #%d], %s\t# spill",
                      offset,
                      Matcher::regName[src_first]);
 #endif
         }
-        return ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) + 4; // REX
       } else {
         // 32-bit
         assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform");
         assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform");
         int offset = ra_->reg2offset(dst_first);
         if (cbuf) {
-          if (Matcher::_regEncode[src_first] >= 8) {
-            emit_opcode(*cbuf, Assembler::REX_R);
-          }
-          emit_opcode(*cbuf, 0x89);
-          encode_RegMem(*cbuf,
-                        Matcher::_regEncode[src_first],
-                        RSP_enc, 0x4, 0, offset,
-                        false);
+          MacroAssembler _masm(cbuf);
+          __ movl(Address(rsp, offset), as_Register(Matcher::_regEncode[src_first]));
 #ifndef PRODUCT
-        } else if (!do_size) {
+        } else {
           st->print("movl    [rsp + #%d], %s\t# spill",
                      offset,
                      Matcher::regName[src_first]);
 #endif
         }
-        return
-          ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) +
-          ((Matcher::_regEncode[src_first] < 8)
-           ? 3
-           : 4); // REX
       }
+      return 0;
     } else if (dst_first_rc == rc_int) {
       // gpr -> gpr
       if ((src_first & 1) == 0 && src_first + 1 == src_second &&
           (dst_first & 1) == 0 && dst_first + 1 == dst_second) {
         // 64-bit
         if (cbuf) {
-          if (Matcher::_regEncode[dst_first] < 8) {
-            if (Matcher::_regEncode[src_first] < 8) {
-              emit_opcode(*cbuf, Assembler::REX_W);
-            } else {
-              emit_opcode(*cbuf, Assembler::REX_WB);
-            }
-          } else {
-            if (Matcher::_regEncode[src_first] < 8) {
-              emit_opcode(*cbuf, Assembler::REX_WR);
-            } else {
-              emit_opcode(*cbuf, Assembler::REX_WRB);
-            }
-          }
-          emit_opcode(*cbuf, 0x8B);
-          emit_rm(*cbuf, 0x3,
-                  Matcher::_regEncode[dst_first] & 7,
-                  Matcher::_regEncode[src_first] & 7);
+          MacroAssembler _masm(cbuf);
+          __ movq(as_Register(Matcher::_regEncode[dst_first]),
+                  as_Register(Matcher::_regEncode[src_first]));
 #ifndef PRODUCT
-        } else if (!do_size) {
+        } else {
           st->print("movq    %s, %s\t# spill",
                      Matcher::regName[dst_first],
                      Matcher::regName[src_first]);
 #endif
         }
-        return 3; // REX
+        return 0;
       } else {
         // 32-bit
         assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform");
         assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform");
         if (cbuf) {
-          if (Matcher::_regEncode[dst_first] < 8) {
-            if (Matcher::_regEncode[src_first] >= 8) {
-              emit_opcode(*cbuf, Assembler::REX_B);
-            }
-          } else {
-            if (Matcher::_regEncode[src_first] < 8) {
-              emit_opcode(*cbuf, Assembler::REX_R);
-            } else {
-              emit_opcode(*cbuf, Assembler::REX_RB);
-            }
-          }
-          emit_opcode(*cbuf, 0x8B);
-          emit_rm(*cbuf, 0x3,
-                  Matcher::_regEncode[dst_first] & 7,
-                  Matcher::_regEncode[src_first] & 7);
+          MacroAssembler _masm(cbuf);
+          __ movl(as_Register(Matcher::_regEncode[dst_first]),
+                  as_Register(Matcher::_regEncode[src_first]));
 #ifndef PRODUCT
-        } else if (!do_size) {
+        } else {
           st->print("movl    %s, %s\t# spill",
                      Matcher::regName[dst_first],
                      Matcher::regName[src_first]);
 #endif
         }
-        return
-          (Matcher::_regEncode[src_first] < 8 && Matcher::_regEncode[dst_first] < 8)
-          ? 2
-          : 3; // REX
+        return 0;
       }
     } else if (dst_first_rc == rc_float) {
       // gpr -> xmm
@@ -1349,13 +1181,12 @@
           MacroAssembler _masm(cbuf);
           __ movdq( as_XMMRegister(Matcher::_regEncode[dst_first]), as_Register(Matcher::_regEncode[src_first]));
 #ifndef PRODUCT
-        } else if (!do_size) {
+        } else {
           st->print("movdq   %s, %s\t# spill",
                      Matcher::regName[dst_first],
                      Matcher::regName[src_first]);
 #endif
         }
-        return 5; // REX
       } else {
         // 32-bit
         assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform");
@@ -1364,17 +1195,14 @@
           MacroAssembler _masm(cbuf);
           __ movdl( as_XMMRegister(Matcher::_regEncode[dst_first]), as_Register(Matcher::_regEncode[src_first]));
 #ifndef PRODUCT
-        } else if (!do_size) {
+        } else {
           st->print("movdl   %s, %s\t# spill",
                      Matcher::regName[dst_first],
                      Matcher::regName[src_first]);
 #endif
         }
-        return
-          (Matcher::_regEncode[src_first] >= 8 || Matcher::_regEncode[dst_first] >= 8)
-          ? 5
-          : (4 + ((UseAVX>0)?1:0)); // REX
       }
+      return 0;
     }
   } else if (src_first_rc == rc_float) {
     // xmm ->
@@ -1388,17 +1216,12 @@
           MacroAssembler _masm(cbuf);
           __ movdbl( Address(rsp, offset), as_XMMRegister(Matcher::_regEncode[src_first]));
 #ifndef PRODUCT
-        } else if (!do_size) {
+        } else {
           st->print("movsd   [rsp + #%d], %s\t# spill",
                      offset,
                      Matcher::regName[src_first]);
 #endif
         }
-        return
-          ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) +
-          ((Matcher::_regEncode[src_first] >= 8)
-           ? 6
-           : (5 + ((UseAVX>0)?1:0))); // REX
       } else {
         // 32-bit
         assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform");
@@ -1408,18 +1231,14 @@
           MacroAssembler _masm(cbuf);
           __ movflt(Address(rsp, offset), as_XMMRegister(Matcher::_regEncode[src_first]));
 #ifndef PRODUCT
-        } else if (!do_size) {
+        } else {
           st->print("movss   [rsp + #%d], %s\t# spill",
                      offset,
                      Matcher::regName[src_first]);
 #endif
         }
-        return
-          ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) +
-          ((Matcher::_regEncode[src_first] >=8)
-           ? 6
-           : (5 + ((UseAVX>0)?1:0))); // REX
       }
+      return 0;
     } else if (dst_first_rc == rc_int) {
       // xmm -> gpr
       if ((src_first & 1) == 0 && src_first + 1 == src_second &&
@@ -1429,13 +1248,12 @@
           MacroAssembler _masm(cbuf);
           __ movdq( as_Register(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first]));
 #ifndef PRODUCT
-        } else if (!do_size) {
+        } else {
           st->print("movdq   %s, %s\t# spill",
                      Matcher::regName[dst_first],
                      Matcher::regName[src_first]);
 #endif
         }
-        return 5; // REX
       } else {
         // 32-bit
         assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform");
@@ -1444,17 +1262,14 @@
           MacroAssembler _masm(cbuf);
           __ movdl( as_Register(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first]));
 #ifndef PRODUCT
-        } else if (!do_size) {
+        } else {
           st->print("movdl   %s, %s\t# spill",
                      Matcher::regName[dst_first],
                      Matcher::regName[src_first]);
 #endif
         }
-        return
-          (Matcher::_regEncode[src_first] >= 8 || Matcher::_regEncode[dst_first] >= 8)
-          ? 5
-          : (4 + ((UseAVX>0)?1:0)); // REX
       }
+      return 0;
     } else if (dst_first_rc == rc_float) {
       // xmm -> xmm
       if ((src_first & 1) == 0 && src_first + 1 == src_second &&
@@ -1464,17 +1279,13 @@
           MacroAssembler _masm(cbuf);
           __ movdbl( as_XMMRegister(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first]));
 #ifndef PRODUCT
-        } else if (!do_size) {
+        } else {
           st->print("%s  %s, %s\t# spill",
                      UseXmmRegToRegMoveAll ? "movapd" : "movsd ",
                      Matcher::regName[dst_first],
                      Matcher::regName[src_first]);
 #endif
         }
-        return
-          (Matcher::_regEncode[src_first] >= 8 || Matcher::_regEncode[dst_first] >= 8)
-          ? 5
-          : (4 + ((UseAVX>0)?1:0)); // REX
       } else {
         // 32-bit
         assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform");
@@ -1483,42 +1294,35 @@
           MacroAssembler _masm(cbuf);
           __ movflt( as_XMMRegister(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first]));
 #ifndef PRODUCT
-        } else if (!do_size) {
+        } else {
           st->print("%s  %s, %s\t# spill",
                      UseXmmRegToRegMoveAll ? "movaps" : "movss ",
                      Matcher::regName[dst_first],
                      Matcher::regName[src_first]);
 #endif
         }
-        return ((UseAVX>0) ? 5:
-          ((Matcher::_regEncode[src_first] >= 8 || Matcher::_regEncode[dst_first] >= 8)
-           ? (UseXmmRegToRegMoveAll ? 4 : 5)
-           : (UseXmmRegToRegMoveAll ? 3 : 4))); // REX
       }
+      return 0;
     }
   }
 
   assert(0," foo ");
   Unimplemented();
-
   return 0;
 }
 
 #ifndef PRODUCT
-void MachSpillCopyNode::format(PhaseRegAlloc *ra_, outputStream* st) const
-{
+void MachSpillCopyNode::format(PhaseRegAlloc *ra_, outputStream* st) const {
   implementation(NULL, ra_, false, st);
 }
 #endif
 
-void MachSpillCopyNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const
-{
+void MachSpillCopyNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
   implementation(&cbuf, ra_, false, NULL);
 }
 
-uint MachSpillCopyNode::size(PhaseRegAlloc *ra_) const
-{
-  return implementation(NULL, ra_, true, NULL);
+uint MachSpillCopyNode::size(PhaseRegAlloc *ra_) const {
+  return MachNode::size(ra_);
 }
 
 //=============================================================================
@@ -1735,16 +1539,6 @@
   return true;
 }
 
-// Vector width in bytes
-const uint Matcher::vector_width_in_bytes(void) {
-  return 8;
-}
-
-// Vector ideal reg
-const uint Matcher::vector_ideal_reg(void) {
-  return Op_RegD;
-}
-
 // Is this branch offset short enough that a short branch can be used?
 //
 // NOTE: If the platform does not provide any short branch variants, then
@@ -1831,21 +1625,21 @@
 bool Matcher::can_be_java_arg(int reg)
 {
   return
-    reg ==  RDI_num || reg ==  RDI_H_num ||
-    reg ==  RSI_num || reg ==  RSI_H_num ||
-    reg ==  RDX_num || reg ==  RDX_H_num ||
-    reg ==  RCX_num || reg ==  RCX_H_num ||
-    reg ==   R8_num || reg ==   R8_H_num ||
-    reg ==   R9_num || reg ==   R9_H_num ||
-    reg ==  R12_num || reg ==  R12_H_num ||
-    reg == XMM0_num || reg == XMM0_H_num ||
-    reg == XMM1_num || reg == XMM1_H_num ||
-    reg == XMM2_num || reg == XMM2_H_num ||
-    reg == XMM3_num || reg == XMM3_H_num ||
-    reg == XMM4_num || reg == XMM4_H_num ||
-    reg == XMM5_num || reg == XMM5_H_num ||
-    reg == XMM6_num || reg == XMM6_H_num ||
-    reg == XMM7_num || reg == XMM7_H_num;
+    reg ==  RDI_num || reg == RDI_H_num ||
+    reg ==  RSI_num || reg == RSI_H_num ||
+    reg ==  RDX_num || reg == RDX_H_num ||
+    reg ==  RCX_num || reg == RCX_H_num ||
+    reg ==   R8_num || reg ==  R8_H_num ||
+    reg ==   R9_num || reg ==  R9_H_num ||
+    reg ==  R12_num || reg == R12_H_num ||
+    reg == XMM0_num || reg == XMM0b_num ||
+    reg == XMM1_num || reg == XMM1b_num ||
+    reg == XMM2_num || reg == XMM2b_num ||
+    reg == XMM3_num || reg == XMM3b_num ||
+    reg == XMM4_num || reg == XMM4b_num ||
+    reg == XMM5_num || reg == XMM5b_num ||
+    reg == XMM6_num || reg == XMM6b_num ||
+    reg == XMM7_num || reg == XMM7b_num;
 }
 
 bool Matcher::is_spillable_arg(int reg)
@@ -3220,10 +3014,11 @@
       OptoReg::Bad, // Op_RegI
       RAX_H_num,    // Op_RegP
       OptoReg::Bad, // Op_RegF
-      XMM0_H_num,   // Op_RegD
+      XMM0b_num,    // Op_RegD
       RAX_H_num     // Op_RegL
     };
-    assert(ARRAY_SIZE(hi) == _last_machine_leaf - 1, "missing type");
+    // Excluded flags and vector registers.
+    assert(ARRAY_SIZE(hi) == _last_machine_leaf - 5, "missing type");
     return OptoRegPair(hi[ideal_reg], lo[ideal_reg]);
   %}
 %}
@@ -3985,7 +3780,6 @@
   interface(REG_INTER);
 %}
 
-
 //----------Memory Operands----------------------------------------------------
 // Direct Memory Operand
 // operand direct(immP addr)
@@ -5416,61 +5210,6 @@
   ins_pipe(pipe_slow); // XXX
 %}
 
-// Load Aligned Packed Byte to XMM register
-instruct loadA8B(regD dst, memory mem) %{
-  match(Set dst (Load8B mem));
-  ins_cost(125);
-  format %{ "MOVQ  $dst,$mem\t! packed8B" %}
-  ins_encode %{
-    __ movq($dst$$XMMRegister, $mem$$Address);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
-// Load Aligned Packed Short to XMM register
-instruct loadA4S(regD dst, memory mem) %{
-  match(Set dst (Load4S mem));
-  ins_cost(125);
-  format %{ "MOVQ  $dst,$mem\t! packed4S" %}
-  ins_encode %{
-    __ movq($dst$$XMMRegister, $mem$$Address);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
-// Load Aligned Packed Char to XMM register
-instruct loadA4C(regD dst, memory mem) %{
-  match(Set dst (Load4C mem));
-  ins_cost(125);
-  format %{ "MOVQ  $dst,$mem\t! packed4C" %}
-  ins_encode %{
-    __ movq($dst$$XMMRegister, $mem$$Address);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
-// Load Aligned Packed Integer to XMM register
-instruct load2IU(regD dst, memory mem) %{
-  match(Set dst (Load2I mem));
-  ins_cost(125);
-  format %{ "MOVQ  $dst,$mem\t! packed2I" %}
-  ins_encode %{
-    __ movq($dst$$XMMRegister, $mem$$Address);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
-// Load Aligned Packed Single to XMM
-instruct loadA2F(regD dst, memory mem) %{
-  match(Set dst (Load2F mem));
-  ins_cost(125);
-  format %{ "MOVQ  $dst,$mem\t! packed2F" %}
-  ins_encode %{
-    __ movq($dst$$XMMRegister, $mem$$Address);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
 // Load Effective Address
 instruct leaP8(rRegP dst, indOffset8 mem)
 %{
@@ -6200,39 +5939,6 @@
   ins_pipe(ialu_mem_imm);
 %}
 
-// Store Aligned Packed Byte XMM register to memory
-instruct storeA8B(memory mem, regD src) %{
-  match(Set mem (Store8B mem src));
-  ins_cost(145);
-  format %{ "MOVQ  $mem,$src\t! packed8B" %}
-  ins_encode %{
-    __ movq($mem$$Address, $src$$XMMRegister);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
-// Store Aligned Packed Char/Short XMM register to memory
-instruct storeA4C(memory mem, regD src) %{
-  match(Set mem (Store4C mem src));
-  ins_cost(145);
-  format %{ "MOVQ  $mem,$src\t! packed4C" %}
-  ins_encode %{
-    __ movq($mem$$Address, $src$$XMMRegister);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
-// Store Aligned Packed Integer XMM register to memory
-instruct storeA2I(memory mem, regD src) %{
-  match(Set mem (Store2I mem src));
-  ins_cost(145);
-  format %{ "MOVQ  $mem,$src\t! packed2I" %}
-  ins_encode %{
-    __ movq($mem$$Address, $src$$XMMRegister);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
 // Store CMS card-mark Immediate
 instruct storeImmCM0_reg(memory mem, immI0 zero)
 %{
@@ -6258,17 +5964,6 @@
   ins_pipe(ialu_mem_imm);
 %}
 
-// Store Aligned Packed Single Float XMM register to memory
-instruct storeA2F(memory mem, regD src) %{
-  match(Set mem (Store2F mem src));
-  ins_cost(145);
-  format %{ "MOVQ  $mem,$src\t! packed2F" %}
-  ins_encode %{
-    __ movq($mem$$Address, $src$$XMMRegister);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
 // Store Float
 instruct storeF(memory mem, regF src)
 %{
@@ -10377,172 +10072,6 @@
   ins_pipe( pipe_slow );
 %}
 
-// Replicate scalar to packed byte (1 byte) values in xmm
-instruct Repl8B_reg(regD dst, regD src) %{
-  match(Set dst (Replicate8B src));
-  format %{ "MOVDQA  $dst,$src\n\t"
-            "PUNPCKLBW $dst,$dst\n\t"
-            "PSHUFLW $dst,$dst,0x00\t! replicate8B" %}
-  ins_encode %{
-    if ($dst$$reg != $src$$reg) {
-      __ movdqa($dst$$XMMRegister, $src$$XMMRegister);
-    }
-    __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
-    __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
-// Replicate scalar to packed byte (1 byte) values in xmm
-instruct Repl8B_rRegI(regD dst, rRegI src) %{
-  match(Set dst (Replicate8B src));
-  format %{ "MOVD    $dst,$src\n\t"
-            "PUNPCKLBW $dst,$dst\n\t"
-            "PSHUFLW $dst,$dst,0x00\t! replicate8B" %}
-  ins_encode %{
-    __ movdl($dst$$XMMRegister, $src$$Register);
-    __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
-    __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
-  %}
-  ins_pipe( pipe_slow );
-%}
-
-// Replicate scalar zero to packed byte (1 byte) values in xmm
-instruct Repl8B_immI0(regD dst, immI0 zero) %{
-  match(Set dst (Replicate8B zero));
-  format %{ "PXOR  $dst,$dst\t! replicate8B" %}
-  ins_encode %{
-    __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed shore (2 byte) values in xmm
-instruct Repl4S_reg(regD dst, regD src) %{
-  match(Set dst (Replicate4S src));
-  format %{ "PSHUFLW $dst,$src,0x00\t! replicate4S" %}
-  ins_encode %{
-    __ pshuflw($dst$$XMMRegister, $src$$XMMRegister, 0x00);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed shore (2 byte) values in xmm
-instruct Repl4S_rRegI(regD dst, rRegI src) %{
-  match(Set dst (Replicate4S src));
-  format %{ "MOVD    $dst,$src\n\t"
-            "PSHUFLW $dst,$dst,0x00\t! replicate4S" %}
-  ins_encode %{
-    __ movdl($dst$$XMMRegister, $src$$Register);
-    __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar zero to packed short (2 byte) values in xmm
-instruct Repl4S_immI0(regD dst, immI0 zero) %{
-  match(Set dst (Replicate4S zero));
-  format %{ "PXOR  $dst,$dst\t! replicate4S" %}
-  ins_encode %{
-    __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed char (2 byte) values in xmm
-instruct Repl4C_reg(regD dst, regD src) %{
-  match(Set dst (Replicate4C src));
-  format %{ "PSHUFLW $dst,$src,0x00\t! replicate4C" %}
-  ins_encode %{
-    __ pshuflw($dst$$XMMRegister, $src$$XMMRegister, 0x00);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed char (2 byte) values in xmm
-instruct Repl4C_rRegI(regD dst, rRegI src) %{
-  match(Set dst (Replicate4C src));
-  format %{ "MOVD    $dst,$src\n\t"
-            "PSHUFLW $dst,$dst,0x00\t! replicate4C" %}
-  ins_encode %{
-    __ movdl($dst$$XMMRegister, $src$$Register);
-    __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar zero to packed char (2 byte) values in xmm
-instruct Repl4C_immI0(regD dst, immI0 zero) %{
-  match(Set dst (Replicate4C zero));
-  format %{ "PXOR  $dst,$dst\t! replicate4C" %}
-  ins_encode %{
-    __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed integer (4 byte) values in xmm
-instruct Repl2I_reg(regD dst, regD src) %{
-  match(Set dst (Replicate2I src));
-  format %{ "PSHUFD $dst,$src,0x00\t! replicate2I" %}
-  ins_encode %{
-    __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x00);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed integer (4 byte) values in xmm
-instruct Repl2I_rRegI(regD dst, rRegI src) %{
-  match(Set dst (Replicate2I src));
-  format %{ "MOVD   $dst,$src\n\t"
-            "PSHUFD $dst,$dst,0x00\t! replicate2I" %}
-  ins_encode %{
-    __ movdl($dst$$XMMRegister, $src$$Register);
-    __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar zero to packed integer (2 byte) values in xmm
-instruct Repl2I_immI0(regD dst, immI0 zero) %{
-  match(Set dst (Replicate2I zero));
-  format %{ "PXOR  $dst,$dst\t! replicate2I" %}
-  ins_encode %{
-    __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed single precision floating point values in xmm
-instruct Repl2F_reg(regD dst, regD src) %{
-  match(Set dst (Replicate2F src));
-  format %{ "PSHUFD $dst,$src,0xe0\t! replicate2F" %}
-  ins_encode %{
-    __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0xe0);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed single precision floating point values in xmm
-instruct Repl2F_regF(regD dst, regF src) %{
-  match(Set dst (Replicate2F src));
-  format %{ "PSHUFD $dst,$src,0xe0\t! replicate2F" %}
-  ins_encode %{
-    __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0xe0);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed single precision floating point values in xmm
-instruct Repl2F_immF0(regD dst, immF0 zero) %{
-  match(Set dst (Replicate2F zero));
-  format %{ "PXOR  $dst,$dst\t! replicate2F" %}
-  ins_encode %{
-    __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
-  %}
-  ins_pipe( fpu_reg_reg );
-%}
-
 
 // =======================================================================
 // fast clearing of an array
--- a/src/os/bsd/vm/os_bsd.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/os/bsd/vm/os_bsd.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -440,7 +440,7 @@
   // code needs to be changed accordingly.
 
   // The next few definitions allow the code to be verbatim:
-#define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n))
+#define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n), mtInternal)
 #define getenv(n) ::getenv(n)
 
 /*
@@ -1913,11 +1913,11 @@
     // release the storage
     for (int i = 0 ; i < n ; i++) {
       if (pelements[i] != NULL) {
-        FREE_C_HEAP_ARRAY(char, pelements[i]);
+        FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
       }
     }
     if (pelements != NULL) {
-      FREE_C_HEAP_ARRAY(char*, pelements);
+      FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
     }
   } else {
     snprintf(buffer, buflen, "%s/" JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX, pname, fname);
@@ -2766,7 +2766,7 @@
 //       All it does is to check if there are enough free pages
 //       left at the time of mmap(). This could be a potential
 //       problem.
-bool os::commit_memory(char* addr, size_t size, bool exec) {
+bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
   int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
 #ifdef __OpenBSD__
   // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
@@ -2790,7 +2790,7 @@
 #endif
 #endif
 
-bool os::commit_memory(char* addr, size_t size, size_t alignment_hint,
+bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
                        bool exec) {
 #ifndef _ALLBSD_SOURCE
   if (UseHugeTLBFS && alignment_hint > (size_t)vm_page_size()) {
@@ -2806,7 +2806,7 @@
   return commit_memory(addr, size, exec);
 }
 
-void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
+void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
 #ifndef _ALLBSD_SOURCE
   if (UseHugeTLBFS && alignment_hint > (size_t)vm_page_size()) {
     // We don't check the return value: madvise(MADV_HUGEPAGE) may not
@@ -2816,7 +2816,7 @@
 #endif
 }
 
-void os::free_memory(char *addr, size_t bytes, size_t alignment_hint) {
+void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) {
   ::madvise(addr, bytes, MADV_DONTNEED);
 }
 
@@ -2958,7 +2958,7 @@
 unsigned long* os::Bsd::_numa_all_nodes;
 #endif
 
-bool os::uncommit_memory(char* addr, size_t size) {
+bool os::pd_uncommit_memory(char* addr, size_t size) {
 #ifdef __OpenBSD__
   // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
   return ::mprotect(addr, size, PROT_NONE) == 0;
@@ -2969,7 +2969,7 @@
 #endif
 }
 
-bool os::create_stack_guard_pages(char* addr, size_t size) {
+bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
   return os::commit_memory(addr, size);
 }
 
@@ -3023,12 +3023,12 @@
   return ::munmap(addr, size) == 0;
 }
 
-char* os::reserve_memory(size_t bytes, char* requested_addr,
+char* os::pd_reserve_memory(size_t bytes, char* requested_addr,
                          size_t alignment_hint) {
   return anon_mmap(requested_addr, bytes, (requested_addr != NULL));
 }
 
-bool os::release_memory(char* addr, size_t size) {
+bool os::pd_release_memory(char* addr, size_t size) {
   return anon_munmap(addr, size);
 }
 
@@ -3331,7 +3331,7 @@
 // Reserve memory at an arbitrary address, only if that area is
 // available (and not reserved for something else).
 
-char* os::attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
+char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
   const int max_tries = 10;
   char* base[max_tries];
   size_t size[max_tries];
@@ -4987,7 +4987,7 @@
 }
 
 // Map a block of memory.
-char* os::map_memory(int fd, const char* file_name, size_t file_offset,
+char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
                      char *addr, size_t bytes, bool read_only,
                      bool allow_exec) {
   int prot;
@@ -5019,7 +5019,7 @@
 
 
 // Remap a block of memory.
-char* os::remap_memory(int fd, const char* file_name, size_t file_offset,
+char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
                        char *addr, size_t bytes, bool read_only,
                        bool allow_exec) {
   // same as map_memory() on this OS
@@ -5029,7 +5029,7 @@
 
 
 // Unmap a block of memory.
-bool os::unmap_memory(char* addr, size_t bytes) {
+bool os::pd_unmap_memory(char* addr, size_t bytes) {
   return munmap(addr, bytes) == 0;
 }
 
@@ -5801,3 +5801,14 @@
 
     return true;
 }
+
+// Get the default path to the core file
+// Returns the length of the string
+int os::get_core_path(char* buffer, size_t bufferSize) {
+  int n = jio_snprintf(buffer, bufferSize, "/cores");
+
+  // Truncate if theoretical string was longer than bufferSize
+  n = MIN2(n, (int)bufferSize);
+
+  return n;
+}
--- a/src/os/bsd/vm/os_bsd.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/os/bsd/vm/os_bsd.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -312,7 +312,7 @@
 };
 
 
-class PlatformEvent : public CHeapObj {
+class PlatformEvent : public CHeapObj<mtInternal> {
   private:
     double CachePad [4] ;   // increase odds that _mutex is sole occupant of cache line
     volatile int _Event ;
@@ -347,7 +347,7 @@
     void SetAssociation (Thread * a) { _Assoc = a ; }
 } ;
 
-class PlatformParker : public CHeapObj {
+class PlatformParker : public CHeapObj<mtInternal> {
   protected:
     pthread_mutex_t _mutex [1] ;
     pthread_cond_t  _cond  [1] ;
--- a/src/os/bsd/vm/os_bsd.inline.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/os/bsd/vm/os_bsd.inline.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -95,7 +95,7 @@
 
 
 // On Bsd, reservations are made on a page by page basis, nothing to do.
-inline void os::split_reserved_memory(char *base, size_t size,
+inline void os::pd_split_reserved_memory(char *base, size_t size,
                                       size_t split, bool realloc) {
 }
 
--- a/src/os/bsd/vm/perfMemory_bsd.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/os/bsd/vm/perfMemory_bsd.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -126,7 +126,7 @@
       }
     }
   }
-  FREE_C_HEAP_ARRAY(char, destfile);
+  FREE_C_HEAP_ARRAY(char, destfile, mtInternal);
 }
 
 
@@ -153,7 +153,7 @@
   const char* tmpdir = os::get_temp_directory();
   const char* perfdir = PERFDATA_NAME;
   size_t nbytes = strlen(tmpdir) + strlen(perfdir) + strlen(user) + 3;
-  char* dirname = NEW_C_HEAP_ARRAY(char, nbytes);
+  char* dirname = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
 
   // construct the path name to user specific tmp directory
   snprintf(dirname, nbytes, "%s/%s_%s", tmpdir, perfdir, user);
@@ -246,7 +246,7 @@
   if (bufsize == -1)
     bufsize = 1024;
 
-  char* pwbuf = NEW_C_HEAP_ARRAY(char, bufsize);
+  char* pwbuf = NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
 
   // POSIX interface to getpwuid_r is used on LINUX
   struct passwd* p;
@@ -278,14 +278,14 @@
                                      "pw_name zero length");
       }
     }
-    FREE_C_HEAP_ARRAY(char, pwbuf);
+    FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal);
     return NULL;
   }
 
-  char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1);
+  char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1, mtInternal);
   strcpy(user_name, p->pw_name);
 
-  FREE_C_HEAP_ARRAY(char, pwbuf);
+  FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal);
   return user_name;
 }
 
@@ -328,7 +328,7 @@
   // to determine the user name for the process id.
   //
   struct dirent* dentry;
-  char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(tmpdirname));
+  char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(tmpdirname), mtInternal);
   errno = 0;
   while ((dentry = os::readdir(tmpdirp, (struct dirent *)tdbuf)) != NULL) {
 
@@ -338,7 +338,7 @@
     }
 
     char* usrdir_name = NEW_C_HEAP_ARRAY(char,
-                              strlen(tmpdirname) + strlen(dentry->d_name) + 2);
+                 strlen(tmpdirname) + strlen(dentry->d_name) + 2, mtInternal);
     strcpy(usrdir_name, tmpdirname);
     strcat(usrdir_name, "/");
     strcat(usrdir_name, dentry->d_name);
@@ -346,7 +346,7 @@
     DIR* subdirp = os::opendir(usrdir_name);
 
     if (subdirp == NULL) {
-      FREE_C_HEAP_ARRAY(char, usrdir_name);
+      FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
       continue;
     }
 
@@ -357,13 +357,13 @@
     // symlink can be exploited.
     //
     if (!is_directory_secure(usrdir_name)) {
-      FREE_C_HEAP_ARRAY(char, usrdir_name);
+      FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
       os::closedir(subdirp);
       continue;
     }
 
     struct dirent* udentry;
-    char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name));
+    char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name), mtInternal);
     errno = 0;
     while ((udentry = os::readdir(subdirp, (struct dirent *)udbuf)) != NULL) {
 
@@ -372,7 +372,7 @@
         int result;
 
         char* filename = NEW_C_HEAP_ARRAY(char,
-                            strlen(usrdir_name) + strlen(udentry->d_name) + 2);
+                 strlen(usrdir_name) + strlen(udentry->d_name) + 2, mtInternal);
 
         strcpy(filename, usrdir_name);
         strcat(filename, "/");
@@ -381,13 +381,13 @@
         // don't follow symbolic links for the file
         RESTARTABLE(::lstat(filename, &statbuf), result);
         if (result == OS_ERR) {
-           FREE_C_HEAP_ARRAY(char, filename);
+           FREE_C_HEAP_ARRAY(char, filename, mtInternal);
            continue;
         }
 
         // skip over files that are not regular files.
         if (!S_ISREG(statbuf.st_mode)) {
-          FREE_C_HEAP_ARRAY(char, filename);
+          FREE_C_HEAP_ARRAY(char, filename, mtInternal);
           continue;
         }
 
@@ -397,23 +397,23 @@
           if (statbuf.st_ctime > oldest_ctime) {
             char* user = strchr(dentry->d_name, '_') + 1;
 
-            if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user);
-            oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1);
+            if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user, mtInternal);
+            oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal);
 
             strcpy(oldest_user, user);
             oldest_ctime = statbuf.st_ctime;
           }
         }
 
-        FREE_C_HEAP_ARRAY(char, filename);
+        FREE_C_HEAP_ARRAY(char, filename, mtInternal);
       }
     }
     os::closedir(subdirp);
-    FREE_C_HEAP_ARRAY(char, udbuf);
-    FREE_C_HEAP_ARRAY(char, usrdir_name);
+    FREE_C_HEAP_ARRAY(char, udbuf, mtInternal);
+    FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
   }
   os::closedir(tmpdirp);
-  FREE_C_HEAP_ARRAY(char, tdbuf);
+  FREE_C_HEAP_ARRAY(char, tdbuf, mtInternal);
 
   return(oldest_user);
 }
@@ -434,7 +434,7 @@
   // add 2 for the file separator and a null terminator.
   size_t nbytes = strlen(dirname) + UINT_CHARS + 2;
 
-  char* name = NEW_C_HEAP_ARRAY(char, nbytes);
+  char* name = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
   snprintf(name, nbytes, "%s/%d", dirname, vmid);
 
   return name;
@@ -472,7 +472,7 @@
 static void remove_file(const char* dirname, const char* filename) {
 
   size_t nbytes = strlen(dirname) + strlen(filename) + 2;
-  char* path = NEW_C_HEAP_ARRAY(char, nbytes);
+  char* path = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
 
   strcpy(path, dirname);
   strcat(path, "/");
@@ -480,7 +480,7 @@
 
   remove_file(path);
 
-  FREE_C_HEAP_ARRAY(char, path);
+  FREE_C_HEAP_ARRAY(char, path, mtInternal);
 }
 
 
@@ -517,7 +517,7 @@
   // opendir/readdir.
   //
   struct dirent* entry;
-  char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname));
+  char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname), mtInternal);
   errno = 0;
   while ((entry = os::readdir(dirp, (struct dirent *)dbuf)) != NULL) {
 
@@ -556,7 +556,7 @@
     errno = 0;
   }
   os::closedir(dirp);
-  FREE_C_HEAP_ARRAY(char, dbuf);
+  FREE_C_HEAP_ARRAY(char, dbuf, mtInternal);
 }
 
 // make the user specific temporary directory. Returns true if
@@ -723,11 +723,11 @@
 
   fd = create_sharedmem_resources(dirname, filename, size);
 
-  FREE_C_HEAP_ARRAY(char, user_name);
-  FREE_C_HEAP_ARRAY(char, dirname);
+  FREE_C_HEAP_ARRAY(char, user_name, mtInternal);
+  FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
 
   if (fd == -1) {
-    FREE_C_HEAP_ARRAY(char, filename);
+    FREE_C_HEAP_ARRAY(char, filename, mtInternal);
     return NULL;
   }
 
@@ -743,7 +743,7 @@
       warning("mmap failed -  %s\n", strerror(errno));
     }
     remove_file(filename);
-    FREE_C_HEAP_ARRAY(char, filename);
+    FREE_C_HEAP_ARRAY(char, filename, mtInternal);
     return NULL;
   }
 
@@ -869,7 +869,7 @@
   // store file, we don't follow them when attaching either.
   //
   if (!is_directory_secure(dirname)) {
-    FREE_C_HEAP_ARRAY(char, dirname);
+    FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
               "Process not found");
   }
@@ -884,9 +884,9 @@
   strcpy(rfilename, filename);
 
   // free the c heap resources that are no longer needed
-  if (luser != user) FREE_C_HEAP_ARRAY(char, luser);
-  FREE_C_HEAP_ARRAY(char, dirname);
-  FREE_C_HEAP_ARRAY(char, filename);
+  if (luser != user) FREE_C_HEAP_ARRAY(char, luser, mtInternal);
+  FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
+  FREE_C_HEAP_ARRAY(char, filename, mtInternal);
 
   // open the shared memory file for the give vmid
   fd = open_sharedmem_file(rfilename, file_flags, CHECK);
--- a/src/os/linux/vm/os_linux.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/os/linux/vm/os_linux.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -371,7 +371,7 @@
   // code needs to be changed accordingly.
 
   // The next few definitions allow the code to be verbatim:
-#define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n))
+#define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n), mtInternal)
 #define getenv(n) ::getenv(n)
 
 /*
@@ -639,7 +639,7 @@
 
   size_t n = confstr(_CS_GNU_LIBC_VERSION, NULL, 0);
   if (n > 0) {
-     char *str = (char *)malloc(n);
+     char *str = (char *)malloc(n, mtInternal);
      confstr(_CS_GNU_LIBC_VERSION, str, n);
      os::Linux::set_glibc_version(str);
   } else {
@@ -652,7 +652,7 @@
 
   n = confstr(_CS_GNU_LIBPTHREAD_VERSION, NULL, 0);
   if (n > 0) {
-     char *str = (char *)malloc(n);
+     char *str = (char *)malloc(n, mtInternal);
      confstr(_CS_GNU_LIBPTHREAD_VERSION, str, n);
      // Vanilla RH-9 (glibc 2.3.2) has a bug that confstr() always tells
      // us "NPTL-0.29" even we are running with LinuxThreads. Check if this
@@ -1685,11 +1685,11 @@
     // release the storage
     for (int i = 0 ; i < n ; i++) {
       if (pelements[i] != NULL) {
-        FREE_C_HEAP_ARRAY(char, pelements[i]);
+        FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
       }
     }
     if (pelements != NULL) {
-      FREE_C_HEAP_ARRAY(char*, pelements);
+      FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
     }
   } else {
     snprintf(buffer, buflen, "%s/lib%s.so", pname, fname);
@@ -2469,7 +2469,7 @@
 //       All it does is to check if there are enough free pages
 //       left at the time of mmap(). This could be a potential
 //       problem.
-bool os::commit_memory(char* addr, size_t size, bool exec) {
+bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
   int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
   uintptr_t res = (uintptr_t) ::mmap(addr, size, prot,
                                    MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
@@ -2492,7 +2492,7 @@
 #define MADV_HUGEPAGE 14
 #endif
 
-bool os::commit_memory(char* addr, size_t size, size_t alignment_hint,
+bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
                        bool exec) {
   if (UseHugeTLBFS && alignment_hint > (size_t)vm_page_size()) {
     int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
@@ -2516,7 +2516,7 @@
   return false;
 }
 
-void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
+void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
   if (UseHugeTLBFS && alignment_hint > (size_t)vm_page_size()) {
     // We don't check the return value: madvise(MADV_HUGEPAGE) may not
     // be supported or the memory may already be backed by huge pages.
@@ -2524,7 +2524,7 @@
   }
 }
 
-void os::free_memory(char *addr, size_t bytes, size_t alignment_hint) {
+void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) {
   // This method works by doing an mmap over an existing mmaping and effectively discarding
   // the existing pages. However it won't work for SHM-based large pages that cannot be
   // uncommitted at all. We don't do anything in this case to avoid creating a segment with
@@ -2646,7 +2646,7 @@
       if (numa_available() != -1) {
         set_numa_all_nodes((unsigned long*)libnuma_dlsym(handle, "numa_all_nodes"));
         // Create a cpu -> node mapping
-        _cpu_to_node = new (ResourceObj::C_HEAP) GrowableArray<int>(0, true);
+        _cpu_to_node = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<int>(0, true);
         rebuild_cpu_to_node_map();
         return true;
       }
@@ -2676,7 +2676,7 @@
   cpu_to_node()->at_grow(cpu_num - 1);
   size_t node_num = numa_get_groups_num();
 
-  unsigned long *cpu_map = NEW_C_HEAP_ARRAY(unsigned long, cpu_map_size);
+  unsigned long *cpu_map = NEW_C_HEAP_ARRAY(unsigned long, cpu_map_size, mtInternal);
   for (size_t i = 0; i < node_num; i++) {
     if (numa_node_to_cpus(i, cpu_map, cpu_map_size * sizeof(unsigned long)) != -1) {
       for (size_t j = 0; j < cpu_map_valid_size; j++) {
@@ -2690,7 +2690,7 @@
       }
     }
   }
-  FREE_C_HEAP_ARRAY(unsigned long, cpu_map);
+  FREE_C_HEAP_ARRAY(unsigned long, cpu_map, mtInternal);
 }
 
 int os::Linux::get_node_by_cpu(int cpu_id) {
@@ -2709,7 +2709,7 @@
 os::Linux::numa_interleave_memory_func_t os::Linux::_numa_interleave_memory;
 unsigned long* os::Linux::_numa_all_nodes;
 
-bool os::uncommit_memory(char* addr, size_t size) {
+bool os::pd_uncommit_memory(char* addr, size_t size) {
   uintptr_t res = (uintptr_t) ::mmap(addr, size, PROT_NONE,
                 MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
   return res  != (uintptr_t) MAP_FAILED;
@@ -2774,7 +2774,7 @@
 // munmap() the guard pages we don't leave a hole in the stack
 // mapping. This only affects the main/initial thread, but guard
 // against future OS changes
-bool os::create_stack_guard_pages(char* addr, size_t size) {
+bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
   uintptr_t stack_extent, stack_base;
   bool chk_bounds = NOT_DEBUG(os::Linux::is_initial_thread()) DEBUG_ONLY(true);
   if (chk_bounds && get_stack_bounds(&stack_extent, &stack_base)) {
@@ -2847,12 +2847,12 @@
   return ::munmap(addr, size) == 0;
 }
 
-char* os::reserve_memory(size_t bytes, char* requested_addr,
+char* os::pd_reserve_memory(size_t bytes, char* requested_addr,
                          size_t alignment_hint) {
   return anon_mmap(requested_addr, bytes, (requested_addr != NULL));
 }
 
-bool os::release_memory(char* addr, size_t size) {
+bool os::pd_release_memory(char* addr, size_t size) {
   return anon_munmap(addr, size);
 }
 
@@ -3149,7 +3149,7 @@
 // Reserve memory at an arbitrary address, only if that area is
 // available (and not reserved for something else).
 
-char* os::attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
+char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
   const int max_tries = 10;
   char* base[max_tries];
   size_t size[max_tries];
@@ -4671,7 +4671,7 @@
 }
 
 // Map a block of memory.
-char* os::map_memory(int fd, const char* file_name, size_t file_offset,
+char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
                      char *addr, size_t bytes, bool read_only,
                      bool allow_exec) {
   int prot;
@@ -4701,7 +4701,7 @@
 
 
 // Remap a block of memory.
-char* os::remap_memory(int fd, const char* file_name, size_t file_offset,
+char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
                        char *addr, size_t bytes, bool read_only,
                        bool allow_exec) {
   // same as map_memory() on this OS
@@ -4711,7 +4711,7 @@
 
 
 // Unmap a block of memory.
-bool os::unmap_memory(char* addr, size_t bytes) {
+bool os::pd_unmap_memory(char* addr, size_t bytes) {
   return munmap(addr, bytes) == 0;
 }
 
@@ -5447,6 +5447,18 @@
     return true;
 }
 
+// Get the default path to the core file
+// Returns the length of the string
+int os::get_core_path(char* buffer, size_t bufferSize) {
+  const char* p = get_current_directory(buffer, bufferSize);
+
+  if (p == NULL) {
+    assert(p != NULL, "failed to get current directory");
+    return 0;
+  }
+
+  return strlen(buffer);
+}
 
 #ifdef JAVASE_EMBEDDED
 //
--- a/src/os/linux/vm/os_linux.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/os/linux/vm/os_linux.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -287,7 +287,7 @@
 };
 
 
-class PlatformEvent : public CHeapObj {
+class PlatformEvent : public CHeapObj<mtInternal> {
   private:
     double CachePad [4] ;   // increase odds that _mutex is sole occupant of cache line
     volatile int _Event ;
@@ -322,7 +322,7 @@
     void SetAssociation (Thread * a) { _Assoc = a ; }
 } ;
 
-class PlatformParker : public CHeapObj {
+class PlatformParker : public CHeapObj<mtInternal> {
   protected:
     pthread_mutex_t _mutex [1] ;
     pthread_cond_t  _cond  [1] ;
--- a/src/os/linux/vm/os_linux.inline.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/os/linux/vm/os_linux.inline.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -99,7 +99,7 @@
 
 
 // On Linux, reservations are made on a page by page basis, nothing to do.
-inline void os::split_reserved_memory(char *base, size_t size,
+inline void os::pd_split_reserved_memory(char *base, size_t size,
                                       size_t split, bool realloc) {
 }
 
--- a/src/os/linux/vm/perfMemory_linux.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/os/linux/vm/perfMemory_linux.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -126,7 +126,7 @@
       }
     }
   }
-  FREE_C_HEAP_ARRAY(char, destfile);
+  FREE_C_HEAP_ARRAY(char, destfile, mtInternal);
 }
 
 
@@ -153,7 +153,7 @@
   const char* tmpdir = os::get_temp_directory();
   const char* perfdir = PERFDATA_NAME;
   size_t nbytes = strlen(tmpdir) + strlen(perfdir) + strlen(user) + 3;
-  char* dirname = NEW_C_HEAP_ARRAY(char, nbytes);
+  char* dirname = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
 
   // construct the path name to user specific tmp directory
   snprintf(dirname, nbytes, "%s/%s_%s", tmpdir, perfdir, user);
@@ -246,7 +246,7 @@
   if (bufsize == -1)
     bufsize = 1024;
 
-  char* pwbuf = NEW_C_HEAP_ARRAY(char, bufsize);
+  char* pwbuf = NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
 
   // POSIX interface to getpwuid_r is used on LINUX
   struct passwd* p;
@@ -278,14 +278,14 @@
                                      "pw_name zero length");
       }
     }
-    FREE_C_HEAP_ARRAY(char, pwbuf);
+    FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal);
     return NULL;
   }
 
-  char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1);
+  char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1, mtInternal);
   strcpy(user_name, p->pw_name);
 
-  FREE_C_HEAP_ARRAY(char, pwbuf);
+  FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal);
   return user_name;
 }
 
@@ -328,7 +328,7 @@
   // to determine the user name for the process id.
   //
   struct dirent* dentry;
-  char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(tmpdirname));
+  char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(tmpdirname), mtInternal);
   errno = 0;
   while ((dentry = os::readdir(tmpdirp, (struct dirent *)tdbuf)) != NULL) {
 
@@ -338,7 +338,7 @@
     }
 
     char* usrdir_name = NEW_C_HEAP_ARRAY(char,
-                              strlen(tmpdirname) + strlen(dentry->d_name) + 2);
+                     strlen(tmpdirname) + strlen(dentry->d_name) + 2, mtInternal);
     strcpy(usrdir_name, tmpdirname);
     strcat(usrdir_name, "/");
     strcat(usrdir_name, dentry->d_name);
@@ -346,7 +346,7 @@
     DIR* subdirp = os::opendir(usrdir_name);
 
     if (subdirp == NULL) {
-      FREE_C_HEAP_ARRAY(char, usrdir_name);
+      FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
       continue;
     }
 
@@ -357,13 +357,13 @@
     // symlink can be exploited.
     //
     if (!is_directory_secure(usrdir_name)) {
-      FREE_C_HEAP_ARRAY(char, usrdir_name);
+      FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
       os::closedir(subdirp);
       continue;
     }
 
     struct dirent* udentry;
-    char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name));
+    char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name), mtInternal);
     errno = 0;
     while ((udentry = os::readdir(subdirp, (struct dirent *)udbuf)) != NULL) {
 
@@ -372,7 +372,7 @@
         int result;
 
         char* filename = NEW_C_HEAP_ARRAY(char,
-                            strlen(usrdir_name) + strlen(udentry->d_name) + 2);
+                   strlen(usrdir_name) + strlen(udentry->d_name) + 2, mtInternal);
 
         strcpy(filename, usrdir_name);
         strcat(filename, "/");
@@ -381,13 +381,13 @@
         // don't follow symbolic links for the file
         RESTARTABLE(::lstat(filename, &statbuf), result);
         if (result == OS_ERR) {
-           FREE_C_HEAP_ARRAY(char, filename);
+           FREE_C_HEAP_ARRAY(char, filename, mtInternal);
            continue;
         }
 
         // skip over files that are not regular files.
         if (!S_ISREG(statbuf.st_mode)) {
-          FREE_C_HEAP_ARRAY(char, filename);
+          FREE_C_HEAP_ARRAY(char, filename, mtInternal);
           continue;
         }
 
@@ -397,23 +397,23 @@
           if (statbuf.st_ctime > oldest_ctime) {
             char* user = strchr(dentry->d_name, '_') + 1;
 
-            if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user);
-            oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1);
+            if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user, mtInternal);
+            oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal);
 
             strcpy(oldest_user, user);
             oldest_ctime = statbuf.st_ctime;
           }
         }
 
-        FREE_C_HEAP_ARRAY(char, filename);
+        FREE_C_HEAP_ARRAY(char, filename, mtInternal);
       }
     }
     os::closedir(subdirp);
-    FREE_C_HEAP_ARRAY(char, udbuf);
-    FREE_C_HEAP_ARRAY(char, usrdir_name);
+    FREE_C_HEAP_ARRAY(char, udbuf, mtInternal);
+    FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
   }
   os::closedir(tmpdirp);
-  FREE_C_HEAP_ARRAY(char, tdbuf);
+  FREE_C_HEAP_ARRAY(char, tdbuf, mtInternal);
 
   return(oldest_user);
 }
@@ -434,7 +434,7 @@
   // add 2 for the file separator and a null terminator.
   size_t nbytes = strlen(dirname) + UINT_CHARS + 2;
 
-  char* name = NEW_C_HEAP_ARRAY(char, nbytes);
+  char* name = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
   snprintf(name, nbytes, "%s/%d", dirname, vmid);
 
   return name;
@@ -472,7 +472,7 @@
 static void remove_file(const char* dirname, const char* filename) {
 
   size_t nbytes = strlen(dirname) + strlen(filename) + 2;
-  char* path = NEW_C_HEAP_ARRAY(char, nbytes);
+  char* path = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
 
   strcpy(path, dirname);
   strcat(path, "/");
@@ -480,7 +480,7 @@
 
   remove_file(path);
 
-  FREE_C_HEAP_ARRAY(char, path);
+  FREE_C_HEAP_ARRAY(char, path, mtInternal);
 }
 
 
@@ -517,7 +517,7 @@
   // opendir/readdir.
   //
   struct dirent* entry;
-  char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname));
+  char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname), mtInternal);
   errno = 0;
   while ((entry = os::readdir(dirp, (struct dirent *)dbuf)) != NULL) {
 
@@ -556,7 +556,7 @@
     errno = 0;
   }
   os::closedir(dirp);
-  FREE_C_HEAP_ARRAY(char, dbuf);
+  FREE_C_HEAP_ARRAY(char, dbuf, mtInternal);
 }
 
 // make the user specific temporary directory. Returns true if
@@ -723,11 +723,11 @@
 
   fd = create_sharedmem_resources(dirname, filename, size);
 
-  FREE_C_HEAP_ARRAY(char, user_name);
-  FREE_C_HEAP_ARRAY(char, dirname);
+  FREE_C_HEAP_ARRAY(char, user_name, mtInternal);
+  FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
 
   if (fd == -1) {
-    FREE_C_HEAP_ARRAY(char, filename);
+    FREE_C_HEAP_ARRAY(char, filename, mtInternal);
     return NULL;
   }
 
@@ -743,7 +743,7 @@
       warning("mmap failed -  %s\n", strerror(errno));
     }
     remove_file(filename);
-    FREE_C_HEAP_ARRAY(char, filename);
+    FREE_C_HEAP_ARRAY(char, filename, mtInternal);
     return NULL;
   }
 
@@ -869,7 +869,7 @@
   // store file, we don't follow them when attaching either.
   //
   if (!is_directory_secure(dirname)) {
-    FREE_C_HEAP_ARRAY(char, dirname);
+    FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
               "Process not found");
   }
@@ -884,9 +884,9 @@
   strcpy(rfilename, filename);
 
   // free the c heap resources that are no longer needed
-  if (luser != user) FREE_C_HEAP_ARRAY(char, luser);
-  FREE_C_HEAP_ARRAY(char, dirname);
-  FREE_C_HEAP_ARRAY(char, filename);
+  if (luser != user) FREE_C_HEAP_ARRAY(char, luser, mtInternal);
+  FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
+  FREE_C_HEAP_ARRAY(char, filename, mtInternal);
 
   // open the shared memory file for the give vmid
   fd = open_sharedmem_file(rfilename, file_flags, CHECK);
--- a/src/os/posix/vm/os_posix.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/os/posix/vm/os_posix.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -23,6 +23,7 @@
 */
 
 #include "prims/jvm.h"
+#include "runtime/frame.inline.hpp"
 #include "runtime/os.hpp"
 #include "utilities/vmError.hpp"
 
@@ -33,19 +34,19 @@
 
 // Check core dump limit and report possible place where core can be found
 void os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize) {
+  int n;
   struct rlimit rlim;
-  static char cwd[O_BUFLEN];
   bool success;
 
-  get_current_directory(cwd, sizeof(cwd));
+  n = get_core_path(buffer, bufferSize);
 
   if (getrlimit(RLIMIT_CORE, &rlim) != 0) {
-    jio_snprintf(buffer, bufferSize, "%s/core or core.%d (may not exist)", cwd, current_process_id());
+    jio_snprintf(buffer + n, bufferSize - n, "/core or core.%d (may not exist)", current_process_id());
     success = true;
   } else {
     switch(rlim.rlim_cur) {
       case RLIM_INFINITY:
-        jio_snprintf(buffer, bufferSize, "%s/core or core.%d", cwd, current_process_id());
+        jio_snprintf(buffer + n, bufferSize - n, "/core or core.%d", current_process_id());
         success = true;
         break;
       case 0:
@@ -53,7 +54,7 @@
         success = false;
         break;
       default:
-        jio_snprintf(buffer, bufferSize, "%s/core or core.%d (max size %lu kB). To ensure a full core dump, try \"ulimit -c unlimited\" before starting Java again", cwd, current_process_id(), (unsigned long)(rlim.rlim_cur >> 10));
+        jio_snprintf(buffer + n, bufferSize - n, "/core or core.%d (max size %lu kB). To ensure a full core dump, try \"ulimit -c unlimited\" before starting Java again", current_process_id(), (unsigned long)(rlim.rlim_cur >> 10));
         success = true;
         break;
     }
@@ -61,6 +62,23 @@
   VMError::report_coredump_status(buffer, success);
 }
 
+address os::get_caller_pc(int n) {
+#ifdef _NMT_NOINLINE_
+  n ++;
+#endif
+  frame fr = os::current_frame();
+  while (n > 0 && fr.pc() &&
+    !os::is_first_C_frame(&fr) && fr.sender_pc()) {
+    fr = os::get_sender_for_C_frame(&fr);
+    n --;
+  }
+  if (n == 0) {
+    return fr.pc();
+  } else {
+    return NULL;
+  }
+}
+
 int os::get_last_error() {
   return errno;
 }
--- a/src/os/solaris/dtrace/hs_private.d	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/os/solaris/dtrace/hs_private.d	Fri Aug 03 20:23:25 2012 +0100
@@ -23,7 +23,6 @@
  */
 
 provider hs_private {
-  probe hashtable__new_entry(void*, uintptr_t, void*); 
   probe safepoint__begin();
   probe safepoint__end();
   probe cms__initmark__begin();
--- a/src/os/solaris/dtrace/libjvm_db.c	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/os/solaris/dtrace/libjvm_db.c	Fri Aug 03 20:23:25 2012 +0100
@@ -516,7 +516,7 @@
 
   err = read_pointer(J, methodOopPtr + OFFSET_methodOopDesc_constMethod, &constMethod);
   CHECK_FAIL(err);
-  err = read_pointer(J->P, constMethod + OFFSET_constMethodOopDesc_constants, &constantPool);
+  err = read_pointer(J, constMethod + OFFSET_constMethodOopDesc_constants, &constantPool);
   CHECK_FAIL(err);
 
   /* To get name string */
--- a/src/os/solaris/vm/os_solaris.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/os/solaris/vm/os_solaris.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -546,7 +546,7 @@
   // Find the number of processors in the processor set.
   if (pset_info(pset, NULL, id_length, NULL) == 0) {
     // Make up an array to hold their ids.
-    *id_array = NEW_C_HEAP_ARRAY(processorid_t, *id_length);
+    *id_array = NEW_C_HEAP_ARRAY(processorid_t, *id_length, mtInternal);
     // Fill in the array with their processor ids.
     if (pset_info(pset, NULL, id_length, *id_array) == 0) {
       result = true;
@@ -577,7 +577,7 @@
   // Find the number of processors online.
   *id_length = sysconf(_SC_NPROCESSORS_ONLN);
   // Make up an array to hold their ids.
-  *id_array = NEW_C_HEAP_ARRAY(processorid_t, *id_length);
+  *id_array = NEW_C_HEAP_ARRAY(processorid_t, *id_length, mtInternal);
   // Processors need not be numbered consecutively.
   long found = 0;
   processorid_t next = 0;
@@ -629,7 +629,7 @@
   // The next id, to limit loops.
   const processorid_t limit_id = max_id + 1;
   // Make up markers for available processors.
-  bool* available_id = NEW_C_HEAP_ARRAY(bool, limit_id);
+  bool* available_id = NEW_C_HEAP_ARRAY(bool, limit_id, mtInternal);
   for (uint c = 0; c < limit_id; c += 1) {
     available_id[c] = false;
   }
@@ -666,7 +666,7 @@
     }
   }
   if (available_id != NULL) {
-    FREE_C_HEAP_ARRAY(bool, available_id);
+    FREE_C_HEAP_ARRAY(bool, available_id, mtInternal);
   }
   return true;
 }
@@ -698,7 +698,7 @@
     }
   }
   if (id_array != NULL) {
-    FREE_C_HEAP_ARRAY(processorid_t, id_array);
+    FREE_C_HEAP_ARRAY(processorid_t, id_array, mtInternal);
   }
   return result;
 }
@@ -771,8 +771,8 @@
   // code needs to be changed accordingly.
 
   // The next few definitions allow the code to be verbatim:
-#define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n))
-#define free(p) FREE_C_HEAP_ARRAY(char, p)
+#define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n), mtInternal)
+#define free(p) FREE_C_HEAP_ARRAY(char, p, mtInternal)
 #define getenv(n) ::getenv(n)
 
 #define EXTENSIONS_DIR  "/lib/ext"
@@ -1927,11 +1927,11 @@
     // release the storage
     for (int i = 0 ; i < n ; i++) {
       if (pelements[i] != NULL) {
-        FREE_C_HEAP_ARRAY(char, pelements[i]);
+        FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
       }
     }
     if (pelements != NULL) {
-      FREE_C_HEAP_ARRAY(char*, pelements);
+      FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
     }
   } else {
     snprintf(buffer, buflen, "%s/lib%s.so", pname, fname);
@@ -2662,17 +2662,17 @@
 
   // pending_signals has one int per signal
   // The additional signal is for SIGEXIT - exit signal to signal_thread
-  pending_signals = (jint *)os::malloc(sizeof(jint) * (Sigexit+1));
+  pending_signals = (jint *)os::malloc(sizeof(jint) * (Sigexit+1), mtInternal);
   memset(pending_signals, 0, (sizeof(jint) * (Sigexit+1)));
 
   if (UseSignalChaining) {
      chainedsigactions = (struct sigaction *)malloc(sizeof(struct sigaction)
-       * (Maxsignum + 1));
+       * (Maxsignum + 1), mtInternal);
      memset(chainedsigactions, 0, (sizeof(struct sigaction) * (Maxsignum + 1)));
-     preinstalled_sigs = (int *)os::malloc(sizeof(int) * (Maxsignum + 1));
+     preinstalled_sigs = (int *)os::malloc(sizeof(int) * (Maxsignum + 1), mtInternal);
      memset(preinstalled_sigs, 0, (sizeof(int) * (Maxsignum + 1)));
   }
-  ourSigFlags = (int*)malloc(sizeof(int) * (Maxsignum + 1 ));
+  ourSigFlags = (int*)malloc(sizeof(int) * (Maxsignum + 1 ), mtInternal);
   memset(ourSigFlags, 0, sizeof(int) * (Maxsignum + 1));
 }
 
@@ -2760,7 +2760,7 @@
   return page_size;
 }
 
-bool os::commit_memory(char* addr, size_t bytes, bool exec) {
+bool os::pd_commit_memory(char* addr, size_t bytes, bool exec) {
   int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
   size_t size = bytes;
   char *res = Solaris::mmap_chunk(addr, size, MAP_PRIVATE|MAP_FIXED, prot);
@@ -2773,7 +2773,7 @@
   return false;
 }
 
-bool os::commit_memory(char* addr, size_t bytes, size_t alignment_hint,
+bool os::pd_commit_memory(char* addr, size_t bytes, size_t alignment_hint,
                        bool exec) {
   if (commit_memory(addr, bytes, exec)) {
     if (UseMPSS && alignment_hint > (size_t)vm_page_size()) {
@@ -2803,14 +2803,14 @@
 }
 
 // Uncommit the pages in a specified region.
-void os::free_memory(char* addr, size_t bytes, size_t alignment_hint) {
+void os::pd_free_memory(char* addr, size_t bytes, size_t alignment_hint) {
   if (madvise(addr, bytes, MADV_FREE) < 0) {
     debug_only(warning("MADV_FREE failed."));
     return;
   }
 }
 
-bool os::create_stack_guard_pages(char* addr, size_t size) {
+bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
   return os::commit_memory(addr, size);
 }
 
@@ -2819,7 +2819,7 @@
 }
 
 // Change the page size in a given range.
-void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
+void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
   assert((intptr_t)addr % alignment_hint == 0, "Address should be aligned.");
   assert((intptr_t)(addr + bytes) % alignment_hint == 0, "End should be aligned.");
   if (UseLargePages && UseMPSS) {
@@ -3006,7 +3006,7 @@
   return end;
 }
 
-bool os::uncommit_memory(char* addr, size_t bytes) {
+bool os::pd_uncommit_memory(char* addr, size_t bytes) {
   size_t size = bytes;
   // Map uncommitted pages PROT_NONE so we fail early if we touch an
   // uncommitted page. Otherwise, the read/write might succeed if we
@@ -3045,7 +3045,7 @@
   return mmap_chunk(addr, bytes, flags, PROT_NONE);
 }
 
-char* os::reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) {
+char* os::pd_reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) {
   char* addr = Solaris::anon_mmap(requested_addr, bytes, alignment_hint, (requested_addr != NULL));
 
   guarantee(requested_addr == NULL || requested_addr == addr,
@@ -3056,7 +3056,7 @@
 // Reserve memory at an arbitrary address, only if that area is
 // available (and not reserved for something else).
 
-char* os::attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
+char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
   const int max_tries = 10;
   char* base[max_tries];
   size_t size[max_tries];
@@ -3178,7 +3178,7 @@
   return (i < max_tries) ? requested_addr : NULL;
 }
 
-bool os::release_memory(char* addr, size_t bytes) {
+bool os::pd_release_memory(char* addr, size_t bytes) {
   size_t size = bytes;
   return munmap(addr, size) == 0;
 }
@@ -4792,7 +4792,7 @@
   lwpSize = 16*1024;
   for (;;) {
     ::lseek64 (lwpFile, 0, SEEK_SET);
-    lwpArray = (prheader_t *)NEW_C_HEAP_ARRAY(char, lwpSize);
+    lwpArray = (prheader_t *)NEW_C_HEAP_ARRAY(char, lwpSize, mtInternal);
     if (::read(lwpFile, lwpArray, lwpSize) < 0) {
       if (ThreadPriorityVerbose) warning("Error reading /proc/self/lstatus\n");
       break;
@@ -4810,10 +4810,10 @@
       break;
     }
     lwpSize = lwpArray->pr_nent * lwpArray->pr_entsize;
-    FREE_C_HEAP_ARRAY(char, lwpArray);  // retry.
-  }
-
-  FREE_C_HEAP_ARRAY(char, lwpArray);
+    FREE_C_HEAP_ARRAY(char, lwpArray, mtInternal);  // retry.
+  }
+
+  FREE_C_HEAP_ARRAY(char, lwpArray, mtInternal);
   ::close (lwpFile);
   if (ThreadPriorityVerbose) {
     if (isT2) tty->print_cr("We are running with a T2 libthread\n");
@@ -5137,9 +5137,9 @@
       UseNUMA = false;
     } else {
       size_t lgrp_limit = os::numa_get_groups_num();
-      int *lgrp_ids = NEW_C_HEAP_ARRAY(int, lgrp_limit);
+      int *lgrp_ids = NEW_C_HEAP_ARRAY(int, lgrp_limit, mtInternal);
       size_t lgrp_num = os::numa_get_leaf_groups(lgrp_ids, lgrp_limit);
-      FREE_C_HEAP_ARRAY(int, lgrp_ids);
+      FREE_C_HEAP_ARRAY(int, lgrp_ids, mtInternal);
       if (lgrp_num < 2) {
         // There's only one locality group, disable NUMA.
         UseNUMA = false;
@@ -5485,7 +5485,7 @@
 }
 
 // Map a block of memory.
-char* os::map_memory(int fd, const char* file_name, size_t file_offset,
+char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
                      char *addr, size_t bytes, bool read_only,
                      bool allow_exec) {
   int prot;
@@ -5517,7 +5517,7 @@
 
 
 // Remap a block of memory.
-char* os::remap_memory(int fd, const char* file_name, size_t file_offset,
+char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
                        char *addr, size_t bytes, bool read_only,
                        bool allow_exec) {
   // same as map_memory() on this OS
@@ -5527,7 +5527,7 @@
 
 
 // Unmap a block of memory.
-bool os::unmap_memory(char* addr, size_t bytes) {
+bool os::pd_unmap_memory(char* addr, size_t bytes) {
   return munmap(addr, bytes) == 0;
 }
 
@@ -6537,3 +6537,16 @@
    INTERRUPTIBLE_RETURN_INT_NORESTART(::bind(fd, him, len),\
                                       os::Solaris::clear_interrupted);
 }
+
+// Get the default path to the core file
+// Returns the length of the string
+int os::get_core_path(char* buffer, size_t bufferSize) {
+  const char* p = get_current_directory(buffer, bufferSize);
+
+  if (p == NULL) {
+    assert(p != NULL, "failed to get current directory");
+    return 0;
+  }
+
+  return strlen(buffer);
+}
--- a/src/os/solaris/vm/os_solaris.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/os/solaris/vm/os_solaris.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -346,7 +346,7 @@
 
 };
 
-class PlatformEvent : public CHeapObj {
+class PlatformEvent : public CHeapObj<mtInternal> {
   private:
     double CachePad [4] ;   // increase odds that _mutex is sole occupant of cache line
     volatile int _Event ;
@@ -383,7 +383,7 @@
     void unpark () ;
 } ;
 
-class PlatformParker : public CHeapObj {
+class PlatformParker : public CHeapObj<mtInternal> {
   protected:
     mutex_t _mutex [1] ;
     cond_t  _cond  [1] ;
--- a/src/os/solaris/vm/os_solaris.inline.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/os/solaris/vm/os_solaris.inline.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -71,7 +71,7 @@
 
 
 // On Solaris, reservations are made on a page by page basis, nothing to do.
-inline void os::split_reserved_memory(char *base, size_t size,
+inline void os::pd_split_reserved_memory(char *base, size_t size,
                                       size_t split, bool realloc) {
 }
 
--- a/src/os/solaris/vm/perfMemory_solaris.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/os/solaris/vm/perfMemory_solaris.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -128,7 +128,7 @@
       }
     }
   }
-  FREE_C_HEAP_ARRAY(char, destfile);
+  FREE_C_HEAP_ARRAY(char, destfile, mtInternal);
 }
 
 
@@ -155,7 +155,7 @@
   const char* tmpdir = os::get_temp_directory();
   const char* perfdir = PERFDATA_NAME;
   size_t nbytes = strlen(tmpdir) + strlen(perfdir) + strlen(user) + 3;
-  char* dirname = NEW_C_HEAP_ARRAY(char, nbytes);
+  char* dirname = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
 
   // construct the path name to user specific tmp directory
   snprintf(dirname, nbytes, "%s/%s_%s", tmpdir, perfdir, user);
@@ -248,7 +248,7 @@
   if (bufsize == -1)
     bufsize = 1024;
 
-  char* pwbuf = NEW_C_HEAP_ARRAY(char, bufsize);
+  char* pwbuf = NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
 
 #ifdef _GNU_SOURCE
   struct passwd* p = NULL;
@@ -269,14 +269,14 @@
                                      "pw_name zero length");
       }
     }
-    FREE_C_HEAP_ARRAY(char, pwbuf);
+    FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal);
     return NULL;
   }
 
-  char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1);
+  char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1, mtInternal);
   strcpy(user_name, p->pw_name);
 
-  FREE_C_HEAP_ARRAY(char, pwbuf);
+  FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal);
   return user_name;
 }
 
@@ -319,7 +319,7 @@
   // to determine the user name for the process id.
   //
   struct dirent* dentry;
-  char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(tmpdirname));
+  char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(tmpdirname), mtInternal);
   errno = 0;
   while ((dentry = os::readdir(tmpdirp, (struct dirent *)tdbuf)) != NULL) {
 
@@ -329,7 +329,7 @@
     }
 
     char* usrdir_name = NEW_C_HEAP_ARRAY(char,
-                              strlen(tmpdirname) + strlen(dentry->d_name) + 2);
+                  strlen(tmpdirname) + strlen(dentry->d_name) + 2, mtInternal);
     strcpy(usrdir_name, tmpdirname);
     strcat(usrdir_name, "/");
     strcat(usrdir_name, dentry->d_name);
@@ -337,7 +337,7 @@
     DIR* subdirp = os::opendir(usrdir_name);
 
     if (subdirp == NULL) {
-      FREE_C_HEAP_ARRAY(char, usrdir_name);
+      FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
       continue;
     }
 
@@ -348,13 +348,13 @@
     // symlink can be exploited.
     //
     if (!is_directory_secure(usrdir_name)) {
-      FREE_C_HEAP_ARRAY(char, usrdir_name);
+      FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
       os::closedir(subdirp);
       continue;
     }
 
     struct dirent* udentry;
-    char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name));
+    char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name), mtInternal);
     errno = 0;
     while ((udentry = os::readdir(subdirp, (struct dirent *)udbuf)) != NULL) {
 
@@ -363,7 +363,7 @@
         int result;
 
         char* filename = NEW_C_HEAP_ARRAY(char,
-                            strlen(usrdir_name) + strlen(udentry->d_name) + 2);
+                 strlen(usrdir_name) + strlen(udentry->d_name) + 2, mtInternal);
 
         strcpy(filename, usrdir_name);
         strcat(filename, "/");
@@ -372,13 +372,13 @@
         // don't follow symbolic links for the file
         RESTARTABLE(::lstat(filename, &statbuf), result);
         if (result == OS_ERR) {
-           FREE_C_HEAP_ARRAY(char, filename);
+           FREE_C_HEAP_ARRAY(char, filename, mtInternal);
            continue;
         }
 
         // skip over files that are not regular files.
         if (!S_ISREG(statbuf.st_mode)) {
-          FREE_C_HEAP_ARRAY(char, filename);
+          FREE_C_HEAP_ARRAY(char, filename, mtInternal);
           continue;
         }
 
@@ -388,23 +388,23 @@
           if (statbuf.st_ctime > oldest_ctime) {
             char* user = strchr(dentry->d_name, '_') + 1;
 
-            if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user);
-            oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1);
+            if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user, mtInternal);
+            oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal);
 
             strcpy(oldest_user, user);
             oldest_ctime = statbuf.st_ctime;
           }
         }
 
-        FREE_C_HEAP_ARRAY(char, filename);
+        FREE_C_HEAP_ARRAY(char, filename, mtInternal);
       }
     }
     os::closedir(subdirp);
-    FREE_C_HEAP_ARRAY(char, udbuf);
-    FREE_C_HEAP_ARRAY(char, usrdir_name);
+    FREE_C_HEAP_ARRAY(char, udbuf, mtInternal);
+    FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
   }
   os::closedir(tmpdirp);
-  FREE_C_HEAP_ARRAY(char, tdbuf);
+  FREE_C_HEAP_ARRAY(char, tdbuf, mtInternal);
 
   return(oldest_user);
 }
@@ -471,7 +471,7 @@
   // add 2 for the file separator and a NULL terminator.
   size_t nbytes = strlen(dirname) + UINT_CHARS + 2;
 
-  char* name = NEW_C_HEAP_ARRAY(char, nbytes);
+  char* name = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
   snprintf(name, nbytes, "%s/%d", dirname, vmid);
 
   return name;
@@ -509,7 +509,7 @@
 static void remove_file(const char* dirname, const char* filename) {
 
   size_t nbytes = strlen(dirname) + strlen(filename) + 2;
-  char* path = NEW_C_HEAP_ARRAY(char, nbytes);
+  char* path = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
 
   strcpy(path, dirname);
   strcat(path, "/");
@@ -517,7 +517,7 @@
 
   remove_file(path);
 
-  FREE_C_HEAP_ARRAY(char, path);
+  FREE_C_HEAP_ARRAY(char, path, mtInternal);
 }
 
 
@@ -554,7 +554,7 @@
   // opendir/readdir.
   //
   struct dirent* entry;
-  char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname));
+  char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname), mtInternal);
   errno = 0;
   while ((entry = os::readdir(dirp, (struct dirent *)dbuf)) != NULL) {
 
@@ -593,7 +593,7 @@
     errno = 0;
   }
   os::closedir(dirp);
-  FREE_C_HEAP_ARRAY(char, dbuf);
+  FREE_C_HEAP_ARRAY(char, dbuf, mtInternal);
 }
 
 // make the user specific temporary directory. Returns true if
@@ -738,11 +738,11 @@
 
   fd = create_sharedmem_resources(dirname, filename, size);
 
-  FREE_C_HEAP_ARRAY(char, user_name);
-  FREE_C_HEAP_ARRAY(char, dirname);
+  FREE_C_HEAP_ARRAY(char, user_name, mtInternal);
+  FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
 
   if (fd == -1) {
-    FREE_C_HEAP_ARRAY(char, filename);
+    FREE_C_HEAP_ARRAY(char, filename, mtInternal);
     return NULL;
   }
 
@@ -758,7 +758,7 @@
       warning("mmap failed -  %s\n", strerror(errno));
     }
     remove_file(filename);
-    FREE_C_HEAP_ARRAY(char, filename);
+    FREE_C_HEAP_ARRAY(char, filename, mtInternal);
     return NULL;
   }
 
@@ -884,7 +884,7 @@
   // store file, we don't follow them when attaching either.
   //
   if (!is_directory_secure(dirname)) {
-    FREE_C_HEAP_ARRAY(char, dirname);
+    FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
               "Process not found");
   }
@@ -899,9 +899,9 @@
   strcpy(rfilename, filename);
 
   // free the c heap resources that are no longer needed
-  if (luser != user) FREE_C_HEAP_ARRAY(char, luser);
-  FREE_C_HEAP_ARRAY(char, dirname);
-  FREE_C_HEAP_ARRAY(char, filename);
+  if (luser != user) FREE_C_HEAP_ARRAY(char, luser, mtInternal);
+  FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
+  FREE_C_HEAP_ARRAY(char, filename, mtInternal);
 
   // open the shared memory file for the give vmid
   fd = open_sharedmem_file(rfilename, file_flags, CHECK);
--- a/src/os/windows/vm/os_windows.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/os/windows/vm/os_windows.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -96,7 +96,6 @@
 #include <io.h>
 #include <process.h>              // For _beginthreadex(), _endthreadex()
 #include <imagehlp.h>             // For os::dll_address_to_function_name
-
 /* for enumerating dll libraries */
 #include <vdmdbg.h>
 
@@ -214,13 +213,13 @@
           }
       }
 
-      home_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + 1);
+      home_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + 1, mtInternal);
       if (home_path == NULL)
           return;
       strcpy(home_path, home_dir);
       Arguments::set_java_home(home_path);
 
-      dll_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + strlen(bin) + 1);
+      dll_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + strlen(bin) + 1, mtInternal);
       if (dll_path == NULL)
           return;
       strcpy(dll_path, home_dir);
@@ -251,7 +250,7 @@
     char *path_str = ::getenv("PATH");
 
     library_path = NEW_C_HEAP_ARRAY(char, MAX_PATH * 5 + sizeof(PACKAGE_DIR) +
-        sizeof(BIN_DIR) + (path_str ? strlen(path_str) : 0) + 10);
+        sizeof(BIN_DIR) + (path_str ? strlen(path_str) : 0) + 10, mtInternal);
 
     library_path[0] = '\0';
 
@@ -280,7 +279,7 @@
     strcat(library_path, ";.");
 
     Arguments::set_library_path(library_path);
-    FREE_C_HEAP_ARRAY(char, library_path);
+    FREE_C_HEAP_ARRAY(char, library_path, mtInternal);
   }
 
   /* Default extensions directory */
@@ -300,7 +299,7 @@
   {
     #define ENDORSED_DIR "\\lib\\endorsed"
     size_t len = strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR);
-    char * buf = NEW_C_HEAP_ARRAY(char, len);
+    char * buf = NEW_C_HEAP_ARRAY(char, len, mtInternal);
     sprintf(buf, "%s%s", Arguments::get_java_home(), ENDORSED_DIR);
     Arguments::set_endorsed_dirs(buf);
     #undef ENDORSED_DIR
@@ -324,6 +323,23 @@
   os::breakpoint();
 }
 
+/*
+ * RtlCaptureStackBackTrace Windows API may not exist prior to Windows XP.
+ * So far, this method is only used by Native Memory Tracking, which is
+ * only supported on Windows XP or later.
+ */
+address os::get_caller_pc(int n) {
+#ifdef _NMT_NOINLINE_
+  n ++;
+#endif
+  address pc;
+  if (os::Kernel32Dll::RtlCaptureStackBackTrace(n + 1, 1, (PVOID*)&pc, NULL) == 1) {
+    return pc;
+  }
+  return NULL;
+}
+
+
 // os::current_stack_base()
 //
 //   Returns the base of the stack, which is the stack's
@@ -1014,7 +1030,7 @@
 os::opendir(const char *dirname)
 {
     assert(dirname != NULL, "just checking");   // hotspot change
-    DIR *dirp = (DIR *)malloc(sizeof(DIR));
+    DIR *dirp = (DIR *)malloc(sizeof(DIR), mtInternal);
     DWORD fattr;                                // hotspot change
     char alt_dirname[4] = { 0, 0, 0, 0 };
 
@@ -1036,9 +1052,9 @@
         dirname = alt_dirname;
     }
 
-    dirp->path = (char *)malloc(strlen(dirname) + 5);
+    dirp->path = (char *)malloc(strlen(dirname) + 5, mtInternal);
     if (dirp->path == 0) {
-        free(dirp);
+        free(dirp, mtInternal);
         errno = ENOMEM;
         return 0;
     }
@@ -1046,13 +1062,13 @@
 
     fattr = GetFileAttributes(dirp->path);
     if (fattr == 0xffffffff) {
-        free(dirp->path);
-        free(dirp);
+        free(dirp->path, mtInternal);
+        free(dirp, mtInternal);
         errno = ENOENT;
         return 0;
     } else if ((fattr & FILE_ATTRIBUTE_DIRECTORY) == 0) {
-        free(dirp->path);
-        free(dirp);
+        free(dirp->path, mtInternal);
+        free(dirp, mtInternal);
         errno = ENOTDIR;
         return 0;
     }
@@ -1070,8 +1086,8 @@
     dirp->handle = FindFirstFile(dirp->path, &dirp->find_data);
     if (dirp->handle == INVALID_HANDLE_VALUE) {
         if (GetLastError() != ERROR_FILE_NOT_FOUND) {
-            free(dirp->path);
-            free(dirp);
+            free(dirp->path, mtInternal);
+            free(dirp, mtInternal);
             errno = EACCES;
             return 0;
         }
@@ -1114,8 +1130,8 @@
         }
         dirp->handle = INVALID_HANDLE_VALUE;
     }
-    free(dirp->path);
-    free(dirp);
+    free(dirp->path, mtInternal);
+    free(dirp, mtInternal);
     return 0;
 }
 
@@ -1176,11 +1192,11 @@
     // release the storage
     for (int i = 0 ; i < n ; i++) {
       if (pelements[i] != NULL) {
-        FREE_C_HEAP_ARRAY(char, pelements[i]);
+        FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
       }
     }
     if (pelements != NULL) {
-      FREE_C_HEAP_ARRAY(char*, pelements);
+      FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
     }
   } else {
     jio_snprintf(buffer, buflen, "%s\\%s.dll", pname, fname);
@@ -2637,7 +2653,7 @@
 
   void free_node_list() {
     if (_numa_used_node_list != NULL) {
-      FREE_C_HEAP_ARRAY(int, _numa_used_node_list);
+      FREE_C_HEAP_ARRAY(int, _numa_used_node_list, mtInternal);
     }
   }
 
@@ -2659,7 +2675,7 @@
     ULONG highest_node_number;
     if (!os::Kernel32Dll::GetNumaHighestNodeNumber(&highest_node_number)) return false;
     free_node_list();
-    _numa_used_node_list = NEW_C_HEAP_ARRAY(int, highest_node_number + 1);
+    _numa_used_node_list = NEW_C_HEAP_ARRAY(int, highest_node_number + 1, mtInternal);
     for (unsigned int i = 0; i <= highest_node_number; i++) {
       ULONGLONG proc_mask_numa_node;
       if (!os::Kernel32Dll::GetNumaNodeProcessorMask(i, &proc_mask_numa_node)) return false;
@@ -2918,7 +2934,7 @@
 // On win32, one cannot release just a part of reserved memory, it's an
 // all or nothing deal.  When we split a reservation, we must break the
 // reservation into two reservations.
-void os::split_reserved_memory(char *base, size_t size, size_t split,
+void os::pd_split_reserved_memory(char *base, size_t size, size_t split,
                               bool realloc) {
   if (size > 0) {
     release_memory(base, size);
@@ -2931,7 +2947,7 @@
   }
 }
 
-char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint) {
+char* os::pd_reserve_memory(size_t bytes, char* addr, size_t alignment_hint) {
   assert((size_t)addr % os::vm_allocation_granularity() == 0,
          "reserve alignment");
   assert(bytes % os::vm_allocation_granularity() == 0, "reserve block size");
@@ -2964,7 +2980,7 @@
 
 // Reserve memory at an arbitrary address, only if that area is
 // available (and not reserved for something else).
-char* os::attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
+char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
   // Windows os::reserve_memory() fails of the requested address range is
   // not avilable.
   return reserve_memory(bytes, requested_addr);
@@ -3027,7 +3043,7 @@
 void os::print_statistics() {
 }
 
-bool os::commit_memory(char* addr, size_t bytes, bool exec) {
+bool os::pd_commit_memory(char* addr, size_t bytes, bool exec) {
   if (bytes == 0) {
     // Don't bother the OS with noops.
     return true;
@@ -3075,26 +3091,26 @@
   return true;
 }
 
-bool os::commit_memory(char* addr, size_t size, size_t alignment_hint,
+bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
                        bool exec) {
   return commit_memory(addr, size, exec);
 }
 
-bool os::uncommit_memory(char* addr, size_t bytes) {
+bool os::pd_uncommit_memory(char* addr, size_t bytes) {
   if (bytes == 0) {
     // Don't bother the OS with noops.
     return true;
   }
   assert((size_t) addr % os::vm_page_size() == 0, "uncommit on page boundaries");
   assert(bytes % os::vm_page_size() == 0, "uncommit in page-sized chunks");
-  return VirtualFree(addr, bytes, MEM_DECOMMIT) != 0;
-}
-
-bool os::release_memory(char* addr, size_t bytes) {
+  return (VirtualFree(addr, bytes, MEM_DECOMMIT) != 0);
+}
+
+bool os::pd_release_memory(char* addr, size_t bytes) {
   return VirtualFree(addr, 0, MEM_RELEASE) != 0;
 }
 
-bool os::create_stack_guard_pages(char* addr, size_t size) {
+bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
   return os::commit_memory(addr, size);
 }
 
@@ -3141,8 +3157,8 @@
   return VirtualProtect(addr, bytes, PAGE_READWRITE, &old_status) != 0;
 }
 
-void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { }
-void os::free_memory(char *addr, size_t bytes, size_t alignment_hint)    { }
+void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { }
+void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) { }
 void os::numa_make_global(char *addr, size_t bytes)    { }
 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint)    { }
 bool os::numa_topology_changed()                       { return false; }
@@ -4276,14 +4292,14 @@
     numEvents = MAX_INPUT_EVENTS;
   }
 
-  lpBuffer = (INPUT_RECORD *)os::malloc(numEvents * sizeof(INPUT_RECORD));
+  lpBuffer = (INPUT_RECORD *)os::malloc(numEvents * sizeof(INPUT_RECORD), mtInternal);
   if (lpBuffer == NULL) {
     return FALSE;
   }
 
   error = ::PeekConsoleInput(han, lpBuffer, numEvents, &numEventsRead);
   if (error == 0) {
-    os::free(lpBuffer);
+    os::free(lpBuffer, mtInternal);
     return FALSE;
   }
 
@@ -4304,7 +4320,7 @@
   }
 
   if(lpBuffer != NULL) {
-    os::free(lpBuffer);
+    os::free(lpBuffer, mtInternal);
   }
 
   *pbytes = (long) actualLength;
@@ -4312,7 +4328,7 @@
 }
 
 // Map a block of memory.
-char* os::map_memory(int fd, const char* file_name, size_t file_offset,
+char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
                      char *addr, size_t bytes, bool read_only,
                      bool allow_exec) {
   HANDLE hFile;
@@ -4432,7 +4448,7 @@
 
 
 // Remap a block of memory.
-char* os::remap_memory(int fd, const char* file_name, size_t file_offset,
+char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
                        char *addr, size_t bytes, bool read_only,
                        bool allow_exec) {
   // This OS does not allow existing memory maps to be remapped so we
@@ -4445,15 +4461,15 @@
   // call above and the map_memory() call below where a thread in native
   // code may be able to access an address that is no longer mapped.
 
-  return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
-                        allow_exec);
+  return os::map_memory(fd, file_name, file_offset, addr, bytes,
+           read_only, allow_exec);
 }
 
 
 // Unmap a block of memory.
 // Returns true=success, otherwise false.
 
-bool os::unmap_memory(char* addr, size_t bytes) {
+bool os::pd_unmap_memory(char* addr, size_t bytes) {
   BOOL result = UnmapViewOfFile(addr);
   if (result == 0) {
     if (PrintMiscellaneous && Verbose) {
@@ -4931,11 +4947,15 @@
 typedef LPVOID (WINAPI *VirtualAllocExNuma_Fn) (HANDLE, LPVOID, SIZE_T, DWORD, DWORD, DWORD);
 typedef BOOL (WINAPI *GetNumaHighestNodeNumber_Fn) (PULONG);
 typedef BOOL (WINAPI *GetNumaNodeProcessorMask_Fn) (UCHAR, PULONGLONG);
+typedef USHORT (WINAPI* RtlCaptureStackBackTrace_Fn)(ULONG, ULONG, PVOID*, PULONG);
 
 GetLargePageMinimum_Fn      os::Kernel32Dll::_GetLargePageMinimum = NULL;
 VirtualAllocExNuma_Fn       os::Kernel32Dll::_VirtualAllocExNuma = NULL;
 GetNumaHighestNodeNumber_Fn os::Kernel32Dll::_GetNumaHighestNodeNumber = NULL;
 GetNumaNodeProcessorMask_Fn os::Kernel32Dll::_GetNumaNodeProcessorMask = NULL;
+RtlCaptureStackBackTrace_Fn os::Kernel32Dll::_RtlCaptureStackBackTrace = NULL;
+
+
 BOOL                        os::Kernel32Dll::initialized = FALSE;
 SIZE_T os::Kernel32Dll::GetLargePageMinimum() {
   assert(initialized && _GetLargePageMinimum != NULL,
@@ -4978,6 +4998,19 @@
   return _GetNumaNodeProcessorMask(node, proc_mask);
 }
 
+USHORT os::Kernel32Dll::RtlCaptureStackBackTrace(ULONG FrameToSkip,
+  ULONG FrameToCapture, PVOID* BackTrace, PULONG BackTraceHash) {
+    if (!initialized) {
+      initialize();
+    }
+
+    if (_RtlCaptureStackBackTrace != NULL) {
+      return _RtlCaptureStackBackTrace(FrameToSkip, FrameToCapture,
+        BackTrace, BackTraceHash);
+    } else {
+      return 0;
+    }
+}
 
 void os::Kernel32Dll::initializeCommon() {
   if (!initialized) {
@@ -4987,6 +5020,7 @@
     _VirtualAllocExNuma = (VirtualAllocExNuma_Fn)::GetProcAddress(handle, "VirtualAllocExNuma");
     _GetNumaHighestNodeNumber = (GetNumaHighestNodeNumber_Fn)::GetProcAddress(handle, "GetNumaHighestNodeNumber");
     _GetNumaNodeProcessorMask = (GetNumaNodeProcessorMask_Fn)::GetProcAddress(handle, "GetNumaNodeProcessorMask");
+    _RtlCaptureStackBackTrace = (RtlCaptureStackBackTrace_Fn)::GetProcAddress(handle, "RtlCaptureStackBackTrace");
     initialized = TRUE;
   }
 }
@@ -5101,7 +5135,6 @@
 Module32Next_Fn             os::Kernel32Dll::_Module32Next = NULL;
 GetNativeSystemInfo_Fn      os::Kernel32Dll::_GetNativeSystemInfo = NULL;
 
-
 void os::Kernel32Dll::initialize() {
   if (!initialized) {
     HMODULE handle = ::GetModuleHandle("Kernel32.dll");
@@ -5179,8 +5212,6 @@
   _GetNativeSystemInfo(lpSystemInfo);
 }
 
-
-
 // PSAPI API
 
 
--- a/src/os/windows/vm/os_windows.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/os/windows/vm/os_windows.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -98,7 +98,7 @@
   static LONG WINAPI serialize_fault_filter(struct _EXCEPTION_POINTERS* e);
 };
 
-class PlatformEvent : public CHeapObj {
+class PlatformEvent : public CHeapObj<mtInternal> {
   private:
     double CachePad [4] ;   // increase odds that _Event is sole occupant of cache line
     volatile int _Event ;
@@ -124,7 +124,7 @@
 
 
 
-class PlatformParker : public CHeapObj {
+class PlatformParker : public CHeapObj<mtInternal> {
   protected:
     HANDLE _ParkEvent ;
 
@@ -182,6 +182,9 @@
   static BOOL GetNumaHighestNodeNumber(PULONG);
   static BOOL GetNumaNodeProcessorMask(UCHAR, PULONGLONG);
 
+  // Stack walking
+  static USHORT RtlCaptureStackBackTrace(ULONG, ULONG, PVOID*, PULONG);
+
 private:
   // GetLargePageMinimum available on Windows Vista/Windows Server 2003
   // and later
@@ -191,6 +194,7 @@
   static LPVOID (WINAPI *_VirtualAllocExNuma) (HANDLE, LPVOID, SIZE_T, DWORD, DWORD, DWORD);
   static BOOL (WINAPI *_GetNumaHighestNodeNumber) (PULONG);
   static BOOL (WINAPI *_GetNumaNodeProcessorMask) (UCHAR, PULONGLONG);
+  static USHORT (WINAPI *_RtlCaptureStackBackTrace)(ULONG, ULONG, PVOID*, PULONG);
   static BOOL initialized;
 
   static void initialize();
--- a/src/os/windows/vm/perfMemory_windows.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/os/windows/vm/perfMemory_windows.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -120,7 +120,7 @@
     }
   }
 
-  FREE_C_HEAP_ARRAY(char, destfile);
+  FREE_C_HEAP_ARRAY(char, destfile, mtInternal);
 }
 
 // Shared Memory Implementation Details
@@ -157,7 +157,7 @@
   const char* tmpdir = os::get_temp_directory();
   const char* perfdir = PERFDATA_NAME;
   size_t nbytes = strlen(tmpdir) + strlen(perfdir) + strlen(user) + 3;
-  char* dirname = NEW_C_HEAP_ARRAY(char, nbytes);
+  char* dirname = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
 
   // construct the path name to user specific tmp directory
   _snprintf(dirname, nbytes, "%s\\%s_%s", tmpdir, perfdir, user);
@@ -281,7 +281,7 @@
     }
   }
 
-  char* user_name = NEW_C_HEAP_ARRAY(char, strlen(user)+1);
+  char* user_name = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal);
   strcpy(user_name, user);
 
   return user_name;
@@ -315,7 +315,7 @@
   // to determine the user name for the process id.
   //
   struct dirent* dentry;
-  char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(tmpdirname));
+  char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(tmpdirname), mtInternal);
   errno = 0;
   while ((dentry = os::readdir(tmpdirp, (struct dirent *)tdbuf)) != NULL) {
 
@@ -325,7 +325,7 @@
     }
 
     char* usrdir_name = NEW_C_HEAP_ARRAY(char,
-                              strlen(tmpdirname) + strlen(dentry->d_name) + 2);
+        strlen(tmpdirname) + strlen(dentry->d_name) + 2, mtInternal);
     strcpy(usrdir_name, tmpdirname);
     strcat(usrdir_name, "\\");
     strcat(usrdir_name, dentry->d_name);
@@ -333,7 +333,7 @@
     DIR* subdirp = os::opendir(usrdir_name);
 
     if (subdirp == NULL) {
-      FREE_C_HEAP_ARRAY(char, usrdir_name);
+      FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
       continue;
     }
 
@@ -344,13 +344,13 @@
     // symlink can be exploited.
     //
     if (!is_directory_secure(usrdir_name)) {
-      FREE_C_HEAP_ARRAY(char, usrdir_name);
+      FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
       os::closedir(subdirp);
       continue;
     }
 
     struct dirent* udentry;
-    char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name));
+    char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name), mtInternal);
     errno = 0;
     while ((udentry = os::readdir(subdirp, (struct dirent *)udbuf)) != NULL) {
 
@@ -358,20 +358,20 @@
         struct stat statbuf;
 
         char* filename = NEW_C_HEAP_ARRAY(char,
-                            strlen(usrdir_name) + strlen(udentry->d_name) + 2);
+           strlen(usrdir_name) + strlen(udentry->d_name) + 2, mtInternal);
 
         strcpy(filename, usrdir_name);
         strcat(filename, "\\");
         strcat(filename, udentry->d_name);
 
         if (::stat(filename, &statbuf) == OS_ERR) {
-           FREE_C_HEAP_ARRAY(char, filename);
+           FREE_C_HEAP_ARRAY(char, filename, mtInternal);
            continue;
         }
 
         // skip over files that are not regular files.
         if ((statbuf.st_mode & S_IFMT) != S_IFREG) {
-          FREE_C_HEAP_ARRAY(char, filename);
+          FREE_C_HEAP_ARRAY(char, filename, mtInternal);
           continue;
         }
 
@@ -393,22 +393,22 @@
         if (statbuf.st_ctime > latest_ctime) {
           char* user = strchr(dentry->d_name, '_') + 1;
 
-          if (latest_user != NULL) FREE_C_HEAP_ARRAY(char, latest_user);
-          latest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1);
+          if (latest_user != NULL) FREE_C_HEAP_ARRAY(char, latest_user, mtInternal);
+          latest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal);
 
           strcpy(latest_user, user);
           latest_ctime = statbuf.st_ctime;
         }
 
-        FREE_C_HEAP_ARRAY(char, filename);
+        FREE_C_HEAP_ARRAY(char, filename, mtInternal);
       }
     }
     os::closedir(subdirp);
-    FREE_C_HEAP_ARRAY(char, udbuf);
-    FREE_C_HEAP_ARRAY(char, usrdir_name);
+    FREE_C_HEAP_ARRAY(char, udbuf, mtInternal);
+    FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
   }
   os::closedir(tmpdirp);
-  FREE_C_HEAP_ARRAY(char, tdbuf);
+  FREE_C_HEAP_ARRAY(char, tdbuf, mtInternal);
 
   return(latest_user);
 }
@@ -453,7 +453,7 @@
   // about a name containing a '-' characters.
   //
   nbytes += UINT_CHARS;
-  char* name = NEW_C_HEAP_ARRAY(char, nbytes);
+  char* name = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
   _snprintf(name, nbytes, "%s_%s_%u", PERFDATA_NAME, user, vmid);
 
   return name;
@@ -469,7 +469,7 @@
   // add 2 for the file separator and a null terminator.
   size_t nbytes = strlen(dirname) + UINT_CHARS + 2;
 
-  char* name = NEW_C_HEAP_ARRAY(char, nbytes);
+  char* name = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
   _snprintf(name, nbytes, "%s\\%d", dirname, vmid);
 
   return name;
@@ -485,7 +485,7 @@
 static void remove_file(const char* dirname, const char* filename) {
 
   size_t nbytes = strlen(dirname) + strlen(filename) + 2;
-  char* path = NEW_C_HEAP_ARRAY(char, nbytes);
+  char* path = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
 
   strcpy(path, dirname);
   strcat(path, "\\");
@@ -500,7 +500,7 @@
     }
   }
 
-  FREE_C_HEAP_ARRAY(char, path);
+  FREE_C_HEAP_ARRAY(char, path, mtInternal);
 }
 
 // returns true if the process represented by pid is alive, otherwise
@@ -638,7 +638,7 @@
   // opendir/readdir.
   //
   struct dirent* entry;
-  char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname));
+  char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname), mtInternal);
   errno = 0;
   while ((entry = os::readdir(dirp, (struct dirent *)dbuf)) != NULL) {
 
@@ -681,7 +681,7 @@
     errno = 0;
   }
   os::closedir(dirp);
-  FREE_C_HEAP_ARRAY(char, dbuf);
+  FREE_C_HEAP_ARRAY(char, dbuf, mtInternal);
 }
 
 // create a file mapping object with the requested name, and size
@@ -747,11 +747,11 @@
     // be an ACL we enlisted. free the resources.
     //
     if (success && exists && pACL != NULL && !isdefault) {
-      FREE_C_HEAP_ARRAY(char, pACL);
+      FREE_C_HEAP_ARRAY(char, pACL, mtInternal);
     }
 
     // free the security descriptor
-    FREE_C_HEAP_ARRAY(char, pSD);
+    FREE_C_HEAP_ARRAY(char, pSD, mtInternal);
   }
 }
 
@@ -766,7 +766,7 @@
     lpSA->lpSecurityDescriptor = NULL;
 
     // free the security attributes structure
-    FREE_C_HEAP_ARRAY(char, lpSA);
+    FREE_C_HEAP_ARRAY(char, lpSA, mtInternal);
   }
 }
 
@@ -805,7 +805,7 @@
     }
   }
 
-  token_buf = (PTOKEN_USER) NEW_C_HEAP_ARRAY(char, rsize);
+  token_buf = (PTOKEN_USER) NEW_C_HEAP_ARRAY(char, rsize, mtInternal);
 
   // get the user token information
   if (!GetTokenInformation(hAccessToken, TokenUser, token_buf, rsize, &rsize)) {
@@ -813,28 +813,28 @@
       warning("GetTokenInformation failure: lasterror = %d,"
               " rsize = %d\n", GetLastError(), rsize);
     }
-    FREE_C_HEAP_ARRAY(char, token_buf);
+    FREE_C_HEAP_ARRAY(char, token_buf, mtInternal);
     CloseHandle(hAccessToken);
     return NULL;
   }
 
   DWORD nbytes = GetLengthSid(token_buf->User.Sid);
-  PSID pSID = NEW_C_HEAP_ARRAY(char, nbytes);
+  PSID pSID = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
 
   if (!CopySid(nbytes, pSID, token_buf->User.Sid)) {
     if (PrintMiscellaneous && Verbose) {
       warning("GetTokenInformation failure: lasterror = %d,"
               " rsize = %d\n", GetLastError(), rsize);
     }
-    FREE_C_HEAP_ARRAY(char, token_buf);
-    FREE_C_HEAP_ARRAY(char, pSID);
+    FREE_C_HEAP_ARRAY(char, token_buf, mtInternal);
+    FREE_C_HEAP_ARRAY(char, pSID, mtInternal);
     CloseHandle(hAccessToken);
     return NULL;
   }
 
   // close the access token.
   CloseHandle(hAccessToken);
-  FREE_C_HEAP_ARRAY(char, token_buf);
+  FREE_C_HEAP_ARRAY(char, token_buf, mtInternal);
 
   return pSID;
 }
@@ -912,13 +912,13 @@
   }
 
   // create the new ACL
-  newACL = (PACL) NEW_C_HEAP_ARRAY(char, newACLsize);
+  newACL = (PACL) NEW_C_HEAP_ARRAY(char, newACLsize, mtInternal);
 
   if (!InitializeAcl(newACL, newACLsize, ACL_REVISION)) {
     if (PrintMiscellaneous && Verbose) {
       warning("InitializeAcl failure: lasterror = %d \n", GetLastError());
     }
-    FREE_C_HEAP_ARRAY(char, newACL);
+    FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
     return false;
   }
 
@@ -931,7 +931,7 @@
         if (PrintMiscellaneous && Verbose) {
           warning("InitializeAcl failure: lasterror = %d \n", GetLastError());
         }
-        FREE_C_HEAP_ARRAY(char, newACL);
+        FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
         return false;
       }
       if (((ACCESS_ALLOWED_ACE *)ace)->Header.AceFlags && INHERITED_ACE) {
@@ -958,7 +958,7 @@
           if (PrintMiscellaneous && Verbose) {
             warning("AddAce failure: lasterror = %d \n", GetLastError());
           }
-          FREE_C_HEAP_ARRAY(char, newACL);
+          FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
           return false;
         }
       }
@@ -974,7 +974,7 @@
         warning("AddAccessAllowedAce failure: lasterror = %d \n",
                 GetLastError());
       }
-      FREE_C_HEAP_ARRAY(char, newACL);
+      FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
       return false;
     }
   }
@@ -989,7 +989,7 @@
         if (PrintMiscellaneous && Verbose) {
           warning("InitializeAcl failure: lasterror = %d \n", GetLastError());
         }
-        FREE_C_HEAP_ARRAY(char, newACL);
+        FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
         return false;
       }
       if (!AddAce(newACL, ACL_REVISION, MAXDWORD, ace,
@@ -997,7 +997,7 @@
         if (PrintMiscellaneous && Verbose) {
           warning("AddAce failure: lasterror = %d \n", GetLastError());
         }
-        FREE_C_HEAP_ARRAY(char, newACL);
+        FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
         return false;
       }
       ace_index++;
@@ -1010,7 +1010,7 @@
       warning("SetSecurityDescriptorDacl failure:"
               " lasterror = %d \n", GetLastError());
     }
-    FREE_C_HEAP_ARRAY(char, newACL);
+    FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
     return false;
   }
 
@@ -1030,7 +1030,7 @@
         warning("SetSecurityDescriptorControl failure:"
                 " lasterror = %d \n", GetLastError());
       }
-      FREE_C_HEAP_ARRAY(char, newACL);
+      FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
       return false;
     }
   }
@@ -1054,7 +1054,7 @@
 
   // allocate space for a security descriptor
   PSECURITY_DESCRIPTOR pSD = (PSECURITY_DESCRIPTOR)
-                         NEW_C_HEAP_ARRAY(char, SECURITY_DESCRIPTOR_MIN_LENGTH);
+     NEW_C_HEAP_ARRAY(char, SECURITY_DESCRIPTOR_MIN_LENGTH, mtInternal);
 
   // initialize the security descriptor
   if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) {
@@ -1076,7 +1076,7 @@
   // return it to the caller.
   //
   LPSECURITY_ATTRIBUTES lpSA = (LPSECURITY_ATTRIBUTES)
-                            NEW_C_HEAP_ARRAY(char, sizeof(SECURITY_ATTRIBUTES));
+    NEW_C_HEAP_ARRAY(char, sizeof(SECURITY_ATTRIBUTES), mtInternal);
   lpSA->nLength = sizeof(SECURITY_ATTRIBUTES);
   lpSA->lpSecurityDescriptor = pSD;
   lpSA->bInheritHandle = FALSE;
@@ -1147,7 +1147,7 @@
   // create a security attributes structure with access control
   // entries as initialized above.
   LPSECURITY_ATTRIBUTES lpSA = make_security_attr(aces, 3);
-  FREE_C_HEAP_ARRAY(char, aces[0].pSid);
+  FREE_C_HEAP_ARRAY(char, aces[0].pSid, mtInternal);
   FreeSid(everybodySid);
   FreeSid(administratorsSid);
   return(lpSA);
@@ -1462,15 +1462,15 @@
   assert(((size != 0) && (size % os::vm_page_size() == 0)),
          "unexpected PerfMemry region size");
 
-  FREE_C_HEAP_ARRAY(char, user);
+  FREE_C_HEAP_ARRAY(char, user, mtInternal);
 
   // create the shared memory resources
   sharedmem_fileMapHandle =
                create_sharedmem_resources(dirname, filename, objectname, size);
 
-  FREE_C_HEAP_ARRAY(char, filename);
-  FREE_C_HEAP_ARRAY(char, objectname);
-  FREE_C_HEAP_ARRAY(char, dirname);
+  FREE_C_HEAP_ARRAY(char, filename, mtInternal);
+  FREE_C_HEAP_ARRAY(char, objectname, mtInternal);
+  FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
 
   if (sharedmem_fileMapHandle == NULL) {
     return NULL;
@@ -1621,7 +1621,7 @@
   // store file, we also don't following them when attaching
   //
   if (!is_directory_secure(dirname)) {
-    FREE_C_HEAP_ARRAY(char, dirname);
+    FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
               "Process not found");
   }
@@ -1640,10 +1640,10 @@
   strcpy(robjectname, objectname);
 
   // free the c heap resources that are no longer needed
-  if (luser != user) FREE_C_HEAP_ARRAY(char, luser);
-  FREE_C_HEAP_ARRAY(char, dirname);
-  FREE_C_HEAP_ARRAY(char, filename);
-  FREE_C_HEAP_ARRAY(char, objectname);
+  if (luser != user) FREE_C_HEAP_ARRAY(char, luser, mtInternal);
+  FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
+  FREE_C_HEAP_ARRAY(char, filename, mtInternal);
+  FREE_C_HEAP_ARRAY(char, objectname, mtInternal);
 
   if (*sizep == 0) {
     size = sharedmem_filesize(rfilename, CHECK);
--- a/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -516,7 +516,12 @@
       }
     }
 
-    if (thread->thread_state() == _thread_in_Java) {
+    // We test if stub is already set (by the stack overflow code
+    // above) so it is not overwritten by the code that follows. This
+    // check is not required on other platforms, because on other
+    // platforms we check for SIGSEGV only or SIGBUS only, where here
+    // we have to check for both SIGSEGV and SIGBUS.
+    if (thread->thread_state() == _thread_in_Java && stub == NULL) {
       // Java thread running in Java code => find exception handler if any
       // a fault inside compiled code, the interpreter, or a stub
 
--- a/src/share/vm/adlc/adlparse.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/adlc/adlparse.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -115,6 +115,12 @@
       parse_err(SYNERR, "expected one of - instruct, operand, ins_attrib, op_attrib, source, register, pipeline, encode\n     Found %s",ident);
     }
   }
+  // Add reg_class spill_regs after parsing.
+  RegisterForm *regBlock = _AD.get_registers();
+  if (regBlock == NULL) {
+    parse_err(SEMERR, "Did not declare 'register' definitions");
+  }
+  regBlock->addSpillRegClass();
 
   // Done with parsing, check consistency.
 
@@ -768,11 +774,12 @@
 
 //------------------------------reg_parse--------------------------------------
 void ADLParser::reg_parse(void) {
-
-  // Create the RegisterForm for the architecture description.
-  RegisterForm *regBlock = new RegisterForm();    // Build new Source object
-  regBlock->_linenum = linenum();
-  _AD.addForm(regBlock);
+  RegisterForm *regBlock = _AD.get_registers(); // Information about registers encoding
+  if (regBlock == NULL) {
+    // Create the RegisterForm for the architecture description.
+    regBlock = new RegisterForm();    // Build new Source object
+    _AD.addForm(regBlock);
+  }
 
   skipws();                       // Skip leading whitespace
   if (_curchar == '%' && *(_ptr+1) == '{') {
@@ -796,15 +803,11 @@
     parse_err(SYNERR, "Missing %c{ ... %c} block after register keyword.\n",'%','%');
     return;
   }
-
-  // Add reg_class spill_regs
-  regBlock->addSpillRegClass();
 }
 
 //------------------------------encode_parse-----------------------------------
 void ADLParser::encode_parse(void) {
   EncodeForm *encBlock;         // Information about instruction/operand encoding
-  char       *desc = NULL;      // String representation of encode rule
 
   _AD.getForm(&encBlock);
   if ( encBlock == NULL) {
--- a/src/share/vm/adlc/archDesc.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/adlc/archDesc.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+// Copyright (c) 1997, 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
@@ -911,12 +911,24 @@
   // Find last character in idealOp, it specifies the type
   char  last_char = 0;
   const char *ptr = idealOp;
-  for( ; *ptr != '\0'; ++ptr) {
+  for (; *ptr != '\0'; ++ptr) {
     last_char = *ptr;
   }
 
+  // Match Vector types.
+  if (strncmp(idealOp, "Vec",3)==0) {
+    switch(last_char) {
+    case 'S':  return "TypeVect::VECTS";
+    case 'D':  return "TypeVect::VECTD";
+    case 'X':  return "TypeVect::VECTX";
+    case 'Y':  return "TypeVect::VECTY";
+    default:
+      internal_err("Vector type %s with unrecognized type\n",idealOp);
+    }
+  }
+
   // !!!!!
-  switch( last_char ) {
+  switch(last_char) {
   case 'I':    return "TypeInt::INT";
   case 'P':    return "TypePtr::BOTTOM";
   case 'N':    return "TypeNarrowOop::BOTTOM";
--- a/src/share/vm/adlc/forms.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/adlc/forms.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -265,47 +265,22 @@
   if( strcmp(opType,"LoadN")==0 )  return Form::idealN;
   if( strcmp(opType,"LoadRange")==0 )  return Form::idealI;
   if( strcmp(opType,"LoadS")==0 )  return Form::idealS;
-  if( strcmp(opType,"Load16B")==0 )  return Form::idealB;
-  if( strcmp(opType,"Load8B")==0 )  return Form::idealB;
-  if( strcmp(opType,"Load4B")==0 )  return Form::idealB;
-  if( strcmp(opType,"Load8C")==0 )  return Form::idealC;
-  if( strcmp(opType,"Load4C")==0 )  return Form::idealC;
-  if( strcmp(opType,"Load2C")==0 )  return Form::idealC;
-  if( strcmp(opType,"Load8S")==0 )  return Form::idealS;
-  if( strcmp(opType,"Load4S")==0 )  return Form::idealS;
-  if( strcmp(opType,"Load2S")==0 )  return Form::idealS;
-  if( strcmp(opType,"Load2D")==0 )  return Form::idealD;
-  if( strcmp(opType,"Load4F")==0 )  return Form::idealF;
-  if( strcmp(opType,"Load2F")==0 )  return Form::idealF;
-  if( strcmp(opType,"Load4I")==0 )  return Form::idealI;
-  if( strcmp(opType,"Load2I")==0 )  return Form::idealI;
-  if( strcmp(opType,"Load2L")==0 )  return Form::idealL;
+  if( strcmp(opType,"LoadVector")==0 )  return Form::idealV;
   assert( strcmp(opType,"Load") != 0, "Must type Loads" );
   return Form::none;
 }
 
 Form::DataType Form::is_store_to_memory(const char *opType) const {
   if( strcmp(opType,"StoreB")==0)  return Form::idealB;
-  if( strcmp(opType,"StoreCM")==0)  return Form::idealB;
+  if( strcmp(opType,"StoreCM")==0) return Form::idealB;
   if( strcmp(opType,"StoreC")==0)  return Form::idealC;
   if( strcmp(opType,"StoreD")==0)  return Form::idealD;
   if( strcmp(opType,"StoreF")==0)  return Form::idealF;
   if( strcmp(opType,"StoreI")==0)  return Form::idealI;
   if( strcmp(opType,"StoreL")==0)  return Form::idealL;
   if( strcmp(opType,"StoreP")==0)  return Form::idealP;
-  if( strcmp(opType,"StoreN")==0) return Form::idealN;
-  if( strcmp(opType,"Store16B")==0)  return Form::idealB;
-  if( strcmp(opType,"Store8B")==0)  return Form::idealB;
-  if( strcmp(opType,"Store4B")==0)  return Form::idealB;
-  if( strcmp(opType,"Store8C")==0)  return Form::idealC;
-  if( strcmp(opType,"Store4C")==0)  return Form::idealC;
-  if( strcmp(opType,"Store2C")==0)  return Form::idealC;
-  if( strcmp(opType,"Store2D")==0)  return Form::idealD;
-  if( strcmp(opType,"Store4F")==0)  return Form::idealF;
-  if( strcmp(opType,"Store2F")==0)  return Form::idealF;
-  if( strcmp(opType,"Store4I")==0)  return Form::idealI;
-  if( strcmp(opType,"Store2I")==0)  return Form::idealI;
-  if( strcmp(opType,"Store2L")==0)  return Form::idealL;
+  if( strcmp(opType,"StoreN")==0)  return Form::idealN;
+  if( strcmp(opType,"StoreVector")==0 )  return Form::idealV;
   assert( strcmp(opType,"Store") != 0, "Must type Stores" );
   return Form::none;
 }
--- a/src/share/vm/adlc/forms.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/adlc/forms.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -172,7 +172,8 @@
     idealB      =  6,  // Byte    type
     idealC      =  7,  // Char    type
     idealS      =  8,  // String  type
-    idealN      =  9   // Narrow oop types
+    idealN      =  9,  // Narrow oop types
+    idealV      = 10   // Vector  type
   };
   // Convert ideal name to a DataType, return DataType::none if not a 'ConX'
   Form::DataType  ideal_to_const_type(const char *ideal_type_name) const;
--- a/src/share/vm/adlc/formsopt.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/adlc/formsopt.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -66,7 +66,7 @@
 // for spill-slots/regs.
 void RegisterForm::addSpillRegClass() {
   // Stack slots start at the next available even register number.
-  _reg_ctr = (_reg_ctr+1) & ~1;
+  _reg_ctr = (_reg_ctr+7) & ~7;
   const char *rc_name   = "stack_slots";
   RegClass   *reg_class = new RegClass(rc_name);
   reg_class->_stack_or_reg = true;
@@ -150,9 +150,14 @@
 int RegisterForm::RegMask_Size() {
   // Need at least this many words
   int words_for_regs = (_reg_ctr + 31)>>5;
-  // Add a few for incoming & outgoing arguments to calls.
+  // The array of Register Mask bits should be large enough to cover
+  // all the machine registers and all parameters that need to be passed
+  // on the stack (stack registers) up to some interesting limit.  Methods
+  // that need more parameters will NOT be compiled.  On Intel, the limit
+  // is something like 90+ parameters.
+  // Add a few (3 words == 96 bits) for incoming & outgoing arguments to calls.
   // Round up to the next doubleword size.
-  return (words_for_regs + 2 + 1) & ~1;
+  return (words_for_regs + 3 + 1) & ~1;
 }
 
 void RegisterForm::dump() {                  // Debug printer
--- a/src/share/vm/adlc/formssel.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/adlc/formssel.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -432,6 +432,14 @@
   return  _matrule->is_ideal_store();
 }
 
+// Return 'true' if this instruction matches an ideal vector node
+bool InstructForm::is_vector() const {
+  if( _matrule == NULL ) return false;
+
+  return _matrule->is_vector();
+}
+
+
 // Return the input register that must match the output register
 // If this is not required, return 0
 uint InstructForm::two_address(FormDict &globals) {
@@ -751,6 +759,9 @@
 
   if (needs_base_oop_edge(globals)) return true;
 
+  if (is_vector()) return true;
+  if (is_mach_constant()) return true;
+
   return  false;
 }
 
@@ -3381,11 +3392,8 @@
     "StoreI","StoreL","StoreP","StoreN","StoreD","StoreF" ,
     "StoreB","StoreC","Store" ,"StoreFP",
     "LoadI", "LoadUI2L", "LoadL", "LoadP" ,"LoadN", "LoadD" ,"LoadF"  ,
-    "LoadB" , "LoadUB", "LoadUS" ,"LoadS" ,"Load"   ,
-    "Store4I","Store2I","Store2L","Store2D","Store4F","Store2F","Store16B",
-    "Store8B","Store4B","Store8C","Store4C","Store2C",
-    "Load4I" ,"Load2I" ,"Load2L" ,"Load2D" ,"Load4F" ,"Load2F" ,"Load16B" ,
-    "Load8B" ,"Load4B" ,"Load8C" ,"Load4C" ,"Load2C" ,"Load8S", "Load4S","Load2S",
+    "LoadB" , "LoadUB", "LoadUS" ,"LoadS" ,"Load" ,
+    "StoreVector", "LoadVector",
     "LoadRange", "LoadKlass", "LoadNKlass", "LoadL_unaligned", "LoadD_unaligned",
     "LoadPLocked",
     "StorePConditional", "StoreIConditional", "StoreLConditional",
@@ -3822,6 +3830,10 @@
          strcmp(opType,"RegL")==0 ||
          strcmp(opType,"RegF")==0 ||
          strcmp(opType,"RegD")==0 ||
+         strcmp(opType,"VecS")==0 ||
+         strcmp(opType,"VecD")==0 ||
+         strcmp(opType,"VecX")==0 ||
+         strcmp(opType,"VecY")==0 ||
          strcmp(opType,"Reg" )==0) ) {
       return 1;
     }
@@ -3938,19 +3950,12 @@
         strcmp(opType,"ReverseBytesL")==0 ||
         strcmp(opType,"ReverseBytesUS")==0 ||
         strcmp(opType,"ReverseBytesS")==0 ||
-        strcmp(opType,"Replicate16B")==0 ||
-        strcmp(opType,"Replicate8B")==0 ||
-        strcmp(opType,"Replicate4B")==0 ||
-        strcmp(opType,"Replicate8C")==0 ||
-        strcmp(opType,"Replicate4C")==0 ||
-        strcmp(opType,"Replicate8S")==0 ||
-        strcmp(opType,"Replicate4S")==0 ||
-        strcmp(opType,"Replicate4I")==0 ||
-        strcmp(opType,"Replicate2I")==0 ||
-        strcmp(opType,"Replicate2L")==0 ||
-        strcmp(opType,"Replicate4F")==0 ||
-        strcmp(opType,"Replicate2F")==0 ||
-        strcmp(opType,"Replicate2D")==0 ||
+        strcmp(opType,"ReplicateB")==0 ||
+        strcmp(opType,"ReplicateS")==0 ||
+        strcmp(opType,"ReplicateI")==0 ||
+        strcmp(opType,"ReplicateL")==0 ||
+        strcmp(opType,"ReplicateF")==0 ||
+        strcmp(opType,"ReplicateD")==0 ||
         0 /* 0 to line up columns nicely */ )
       return 1;
   }
@@ -4034,6 +4039,23 @@
   return ideal_load;
 }
 
+bool MatchRule::is_vector() const {
+  if( _rChild ) {
+    const char  *opType = _rChild->_opType;
+    if( strcmp(opType,"ReplicateB")==0 ||
+        strcmp(opType,"ReplicateS")==0 ||
+        strcmp(opType,"ReplicateI")==0 ||
+        strcmp(opType,"ReplicateL")==0 ||
+        strcmp(opType,"ReplicateF")==0 ||
+        strcmp(opType,"ReplicateD")==0 ||
+        strcmp(opType,"LoadVector")==0 ||
+        strcmp(opType,"StoreVector")==0 ||
+        0 /* 0 to line up columns nicely */ )
+      return true;
+  }
+  return false;
+}
+
 
 bool MatchRule::skip_antidep_check() const {
   // Some loads operate on what is effectively immutable memory so we
--- a/src/share/vm/adlc/formssel.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/adlc/formssel.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -160,6 +160,7 @@
   virtual bool        is_ideal_safepoint() const; // node matches 'SafePoint'
   virtual bool        is_ideal_nop() const;     // node matches 'Nop'
   virtual bool        is_ideal_control() const; // control node
+  virtual bool        is_vector() const;        // vector instruction
 
   virtual Form::CallType is_ideal_call() const; // matches ideal 'Call'
   virtual Form::DataType is_ideal_load() const; // node matches ideal 'LoadXNode'
@@ -1011,6 +1012,7 @@
   bool       is_ideal_goto() const;    // node matches ideal 'Goto'
   bool       is_ideal_loopEnd() const; // node matches ideal 'LoopEnd'
   bool       is_ideal_bool() const;    // node matches ideal 'Bool'
+  bool       is_vector() const;        // vector instruction
   Form::DataType is_ideal_load() const;// node matches ideal 'LoadXNode'
   // Should antidep checks be disabled for this rule
   // See definition of MatchRule::skip_antidep_check
--- a/src/share/vm/adlc/main.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/adlc/main.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -250,6 +250,7 @@
   AD.addInclude(AD._HPP_file, "opto/node.hpp");
   AD.addInclude(AD._HPP_file, "opto/regalloc.hpp");
   AD.addInclude(AD._HPP_file, "opto/subnode.hpp");
+  AD.addInclude(AD._HPP_file, "opto/vectornode.hpp");
   AD.addInclude(AD._CPP_CLONE_file, "precompiled.hpp");
   AD.addInclude(AD._CPP_CLONE_file, "adfiles", get_basename(AD._HPP_file._name));
   AD.addInclude(AD._CPP_EXPAND_file, "precompiled.hpp");
--- a/src/share/vm/asm/codeBuffer.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/asm/codeBuffer.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -261,7 +261,7 @@
 
 GrowableArray<int>* CodeBuffer::create_patch_overflow() {
   if (_overflow_arena == NULL) {
-    _overflow_arena = new Arena();
+    _overflow_arena = new (mtCode) Arena();
   }
   return new (_overflow_arena) GrowableArray<int>(_overflow_arena, 8, 0, 0);
 }
@@ -910,7 +910,7 @@
   _comments.add_comment(offset, comment);
 }
 
-class CodeComment: public CHeapObj {
+class CodeComment: public CHeapObj<mtCode> {
  private:
   friend class CodeComments;
   intptr_t     _offset;
@@ -919,13 +919,13 @@
 
   ~CodeComment() {
     assert(_next == NULL, "wrong interface for freeing list");
-    os::free((void*)_comment);
+    os::free((void*)_comment, mtCode);
   }
 
  public:
   CodeComment(intptr_t offset, const char * comment) {
     _offset = offset;
-    _comment = os::strdup(comment);
+    _comment = os::strdup(comment, mtCode);
     _next = NULL;
   }
 
--- a/src/share/vm/c1/c1_CFGPrinter.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/c1/c1_CFGPrinter.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -33,7 +33,7 @@
 #ifndef PRODUCT
 
 
-class CFGPrinterOutput : public CHeapObj {
+class CFGPrinterOutput : public CHeapObj<mtCompiler> {
  private:
   outputStream* _output;
 
@@ -106,7 +106,7 @@
 
 
 CFGPrinterOutput::CFGPrinterOutput()
- : _output(new(ResourceObj::C_HEAP) fileStream("output.cfg"))
+ : _output(new(ResourceObj::C_HEAP, mtCompiler) fileStream("output.cfg"))
 {
 }
 
--- a/src/share/vm/c1/c1_Compiler.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/c1/c1_Compiler.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -55,7 +55,7 @@
 
 void Compiler::initialize_all() {
   BufferBlob* buffer_blob = CompilerThread::current()->get_buffer_blob();
-  Arena* arena = new Arena();
+  Arena* arena = new (mtCompiler) Arena();
   Runtime1::initialize(buffer_blob);
   FrameMap::initialize();
   // initialize data structures
--- a/src/share/vm/c1/c1_GraphBuilder.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/c1/c1_GraphBuilder.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -3505,8 +3505,10 @@
   }
 
   // now perform tests that are based on flag settings
-  if (callee->should_inline()) {
+  if (callee->force_inline() || callee->should_inline()) {
     // ignore heuristic controls on inlining
+    if (callee->force_inline())
+      CompileTask::print_inlining(callee, scope()->level(), bci(), "force inline by annotation");
   } else {
     if (inline_level() > MaxInlineLevel                         ) INLINE_BAILOUT("too-deep inlining");
     if (recursive_inline_level(callee) > MaxRecursiveInlineLevel) INLINE_BAILOUT("too-deep recursive inlining");
@@ -3531,7 +3533,7 @@
   }
 
 #ifndef PRODUCT
-      // printing
+  // printing
   if (PrintInlining) {
     print_inline_result(callee, true);
   }
--- a/src/share/vm/c1/c1_LinearScan.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/c1/c1_LinearScan.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -2467,12 +2467,12 @@
 // Allocate them with new so they are never destroyed (otherwise, a
 // forced exit could destroy these objects while they are still in
 // use).
-ConstantOopWriteValue* LinearScan::_oop_null_scope_value = new (ResourceObj::C_HEAP) ConstantOopWriteValue(NULL);
-ConstantIntValue*      LinearScan::_int_m1_scope_value = new (ResourceObj::C_HEAP) ConstantIntValue(-1);
-ConstantIntValue*      LinearScan::_int_0_scope_value =  new (ResourceObj::C_HEAP) ConstantIntValue(0);
-ConstantIntValue*      LinearScan::_int_1_scope_value =  new (ResourceObj::C_HEAP) ConstantIntValue(1);
-ConstantIntValue*      LinearScan::_int_2_scope_value =  new (ResourceObj::C_HEAP) ConstantIntValue(2);
-LocationValue*         _illegal_value = new (ResourceObj::C_HEAP) LocationValue(Location());
+ConstantOopWriteValue* LinearScan::_oop_null_scope_value = new (ResourceObj::C_HEAP, mtCompiler) ConstantOopWriteValue(NULL);
+ConstantIntValue*      LinearScan::_int_m1_scope_value = new (ResourceObj::C_HEAP, mtCompiler) ConstantIntValue(-1);
+ConstantIntValue*      LinearScan::_int_0_scope_value =  new (ResourceObj::C_HEAP, mtCompiler) ConstantIntValue(0);
+ConstantIntValue*      LinearScan::_int_1_scope_value =  new (ResourceObj::C_HEAP, mtCompiler) ConstantIntValue(1);
+ConstantIntValue*      LinearScan::_int_2_scope_value =  new (ResourceObj::C_HEAP, mtCompiler) ConstantIntValue(2);
+LocationValue*         _illegal_value = new (ResourceObj::C_HEAP, mtCompiler) LocationValue(Location());
 
 void LinearScan::init_compute_debug_info() {
   // cache for frequently used scope values
--- a/src/share/vm/ci/ciMethod.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/ci/ciMethod.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -79,7 +79,7 @@
   _max_locals         = h_m()->max_locals();
   _code_size          = h_m()->code_size();
   _intrinsic_id       = h_m()->intrinsic_id();
-  _handler_count      = h_m()->exception_table()->length() / 4;
+  _handler_count      = h_m()->exception_table_length();
   _uses_monitors      = h_m()->access_flags().has_monitor_bytecodes();
   _balanced_monitors  = !_uses_monitors || h_m()->access_flags().is_monitor_matching();
   _is_c1_compilable   = !h_m()->is_not_c1_compilable();
@@ -198,7 +198,7 @@
   }
 
   // And load the exception table.
-  typeArrayOop exc_table = me->exception_table();
+  ExceptionTable exc_table(me);
 
   // Allocate one extra spot in our list of exceptions.  This
   // last entry will be used to represent the possibility that
@@ -209,13 +209,12 @@
                                          * (_handler_count + 1));
   if (_handler_count > 0) {
     for (int i=0; i<_handler_count; i++) {
-      int base = i*4;
       _exception_handlers[i] = new (arena) ciExceptionHandler(
                                 holder(),
-            /* start    */      exc_table->int_at(base),
-            /* limit    */      exc_table->int_at(base+1),
-            /* goto pc  */      exc_table->int_at(base+2),
-            /* cp index */      exc_table->int_at(base+3));
+            /* start    */      exc_table.start_pc(i),
+            /* limit    */      exc_table.end_pc(i),
+            /* goto pc  */      exc_table.handler_pc(i),
+            /* cp index */      exc_table.catch_type_index(i));
     }
   }
 
--- a/src/share/vm/ci/ciMethod.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/ci/ciMethod.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -160,6 +160,8 @@
   // Code size for inlining decisions.
   int code_size_for_inlining();
 
+  bool force_inline() { return get_methodOop()->force_inline(); }
+
   int comp_level();
   int highest_osr_comp_level();
 
--- a/src/share/vm/ci/ciObjectFactory.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/ci/ciObjectFactory.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -111,7 +111,7 @@
   // This Arena is long lived and exists in the resource mark of the
   // compiler thread that initializes the initial ciObjectFactory which
   // creates the shared ciObjects that all later ciObjectFactories use.
-  Arena* arena = new Arena();
+  Arena* arena = new (mtCompiler) Arena();
   ciEnv initial(arena);
   ciEnv* env = ciEnv::current();
   env->_factory->init_shared_objects();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/classfile/altHashing.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,304 @@
+/*
+ * 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.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "classfile/altHashing.hpp"
+#include "classfile/symbolTable.hpp"
+#include "classfile/systemDictionary.hpp"
+#include "oops/markOop.hpp"
+#include "runtime/thread.hpp"
+
+// Get the hash code of the classes mirror if it exists, otherwise just
+// return a random number, which is one of the possible hash code used for
+// objects.  We don't want to call the synchronizer hash code to install
+// this value because it may safepoint.
+intptr_t object_hash(klassOop k) {
+  intptr_t hc = k->java_mirror()->mark()->hash();
+  return hc != markOopDesc::no_hash ? hc : os::random();
+}
+
+// Seed value used for each alternative hash calculated.
+jint AltHashing::compute_seed() {
+  jlong nanos = os::javaTimeNanos();
+  jlong now = os::javaTimeMillis();
+  jint SEED_MATERIAL[8] = {
+            (jint) object_hash(SystemDictionary::String_klass()),
+            (jint) object_hash(SystemDictionary::System_klass()),
+            (jint) os::random(),  // current thread isn't a java thread
+            (jint) (((julong)nanos) >> 32),
+            (jint) nanos,
+            (jint) (((julong)now) >> 32),
+            (jint) now,
+            (jint) (os::javaTimeNanos() >> 2)
+  };
+
+  return murmur3_32(SEED_MATERIAL, 8);
+}
+
+
+// Murmur3 hashing for Symbol
+jint AltHashing::murmur3_32(jint seed, const jbyte* data, int len) {
+  jint h1 = seed;
+  int count = len;
+  int offset = 0;
+
+  // body
+  while (count >= 4) {
+    jint k1 = (data[offset] & 0x0FF)
+        | (data[offset + 1] & 0x0FF) << 8
+        | (data[offset + 2] & 0x0FF) << 16
+        | data[offset + 3] << 24;
+
+    count -= 4;
+    offset += 4;
+
+    k1 *= 0xcc9e2d51;
+    k1 = Integer_rotateLeft(k1, 15);
+    k1 *= 0x1b873593;
+
+    h1 ^= k1;
+    h1 = Integer_rotateLeft(h1, 13);
+    h1 = h1 * 5 + 0xe6546b64;
+  }
+
+  // tail
+
+  if (count > 0) {
+    jint k1 = 0;
+
+    switch (count) {
+      case 3:
+        k1 ^= (data[offset + 2] & 0xff) << 16;
+      // fall through
+      case 2:
+        k1 ^= (data[offset + 1] & 0xff) << 8;
+      // fall through
+      case 1:
+        k1 ^= (data[offset] & 0xff);
+      // fall through
+      default:
+        k1 *= 0xcc9e2d51;
+        k1 = Integer_rotateLeft(k1, 15);
+        k1 *= 0x1b873593;
+        h1 ^= k1;
+    }
+  }
+
+  // finalization
+  h1 ^= len;
+
+  // finalization mix force all bits of a hash block to avalanche
+  h1 ^= ((unsigned int)h1) >> 16;
+  h1 *= 0x85ebca6b;
+  h1 ^= ((unsigned int)h1) >> 13;
+  h1 *= 0xc2b2ae35;
+  h1 ^= ((unsigned int)h1) >> 16;
+
+  return h1;
+}
+
+// Murmur3 hashing for Strings
+jint AltHashing::murmur3_32(jint seed, const jchar* data, int len) {
+  jint h1 = seed;
+
+  int off = 0;
+  int count = len;
+
+  // body
+  while (count >= 2) {
+    jchar d1 = data[off++] & 0xFFFF;
+    jchar d2 = data[off++];
+    jint k1 = (d1 | d2 << 16);
+
+    count -= 2;
+
+    k1 *= 0xcc9e2d51;
+    k1 = Integer_rotateLeft(k1, 15);
+    k1 *= 0x1b873593;
+
+    h1 ^= k1;
+    h1 = Integer_rotateLeft(h1, 13);
+    h1 = h1 * 5 + 0xe6546b64;
+  }
+
+  // tail
+
+  if (count > 0) {
+    int k1 = data[off];
+
+    k1 *= 0xcc9e2d51;
+    k1 = Integer_rotateLeft(k1, 15);
+    k1 *= 0x1b873593;
+    h1 ^= k1;
+  }
+
+  // finalization
+  h1 ^= len * 2; // (Character.SIZE / Byte.SIZE);
+
+  // finalization mix force all bits of a hash block to avalanche
+  h1 ^= ((unsigned int)h1) >> 16;
+  h1 *= 0x85ebca6b;
+  h1 ^= ((unsigned int)h1) >> 13;
+  h1 *= 0xc2b2ae35;
+  h1 ^= ((unsigned int)h1) >> 16;
+
+  return h1;
+}
+
+// Hash used for the seed.
+jint AltHashing::murmur3_32(jint seed, const int* data, int len) {
+  jint h1 = seed;
+
+  int off = 0;
+  int end = len;
+
+  // body
+  while (off < end) {
+    jint k1 = data[off++];
+
+    k1 *= 0xcc9e2d51;
+    k1 = Integer_rotateLeft(k1, 15);
+    k1 *= 0x1b873593;
+
+    h1 ^= k1;
+    h1 = Integer_rotateLeft(h1, 13);
+    h1 = h1 * 5 + 0xe6546b64;
+  }
+
+  // tail (always empty, as body is always 32-bit chunks)
+
+  // finalization
+
+  h1 ^= len * 4; // (Integer.SIZE / Byte.SIZE);
+
+  // finalization mix force all bits of a hash block to avalanche
+  h1 ^= ((juint)h1) >> 16;
+  h1 *= 0x85ebca6b;
+  h1 ^= ((juint)h1) >> 13;
+  h1 *= 0xc2b2ae35;
+  h1 ^= ((juint)h1) >> 16;
+
+  return h1;
+}
+
+jint AltHashing::murmur3_32(const int* data, int len) {
+  return murmur3_32(0, data, len);
+}
+
+#ifndef PRODUCT
+// Overloaded versions for internal test.
+jint AltHashing::murmur3_32(const jbyte* data, int len) {
+  return murmur3_32(0, data, len);
+}
+
+jint AltHashing::murmur3_32(const jchar* data, int len) {
+  return murmur3_32(0, data, len);
+}
+
+// Internal test for alternate hashing.  Translated from JDK version
+// test/sun/misc/Hashing.java
+static const jbyte ONE_BYTE[] = { (jbyte) 0x80};
+static const jbyte TWO_BYTE[] = { (jbyte) 0x80, (jbyte) 0x81};
+static const jchar ONE_CHAR[] = { (jchar) 0x8180};
+static const jbyte THREE_BYTE[] = { (jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82};
+static const jbyte FOUR_BYTE[] = { (jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82, (jbyte) 0x83};
+static const jchar TWO_CHAR[] = { (jchar) 0x8180, (jchar) 0x8382};
+static const jint ONE_INT[] = { 0x83828180};
+static const jbyte SIX_BYTE[] = { (jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82, (jbyte) 0x83, (jbyte) 0x84, (jbyte) 0x85};
+static const jchar THREE_CHAR[] = { (jchar) 0x8180, (jchar) 0x8382, (jchar) 0x8584};
+static const jbyte EIGHT_BYTE[] = {
+  (jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82,
+  (jbyte) 0x83, (jbyte) 0x84, (jbyte) 0x85,
+  (jbyte) 0x86, (jbyte) 0x87};
+static const jchar FOUR_CHAR[] = {
+  (jchar) 0x8180, (jchar) 0x8382,
+  (jchar) 0x8584, (jchar) 0x8786};
+
+static const jint TWO_INT[] = { 0x83828180, 0x87868584};
+
+static const juint MURMUR3_32_X86_CHECK_VALUE = 0xB0F57EE3;
+
+void AltHashing::testMurmur3_32_ByteArray() {
+  // printf("testMurmur3_32_ByteArray\n");
+
+  jbyte* vector = new jbyte[256];
+  jbyte* hashes = new jbyte[4 * 256];
+
+  for (int i = 0; i < 256; i++) {
+    vector[i] = (jbyte) i;
+  }
+
+  // Hash subranges {}, {0}, {0,1}, {0,1,2}, ..., {0,...,255}
+  for (int i = 0; i < 256; i++) {
+    jint hash = murmur3_32(256 - i, vector, i);
+    hashes[i * 4] = (jbyte) hash;
+    hashes[i * 4 + 1] = (jbyte) (((juint)hash) >> 8);
+    hashes[i * 4 + 2] = (jbyte) (((juint)hash) >> 16);
+    hashes[i * 4 + 3] = (jbyte) (((juint)hash) >> 24);
+  }
+
+  // hash to get const result.
+  juint final_hash = murmur3_32(hashes, 4*256);
+
+  assert (MURMUR3_32_X86_CHECK_VALUE == final_hash,
+    err_msg(
+        "Calculated hash result not as expected. Expected %08X got %08X\n",
+        MURMUR3_32_X86_CHECK_VALUE,
+        final_hash));
+}
+
+void AltHashing::testEquivalentHashes() {
+  jint jbytes, jchars, ints;
+
+  // printf("testEquivalentHashes\n");
+
+  jbytes = murmur3_32(TWO_BYTE, 2);
+  jchars = murmur3_32(ONE_CHAR, 1);
+  assert (jbytes == jchars,
+    err_msg("Hashes did not match. b:%08x != c:%08x\n", jbytes, jchars));
+
+  jbytes = murmur3_32(FOUR_BYTE, 4);
+  jchars = murmur3_32(TWO_CHAR, 2);
+  ints = murmur3_32(ONE_INT, 1);
+  assert ((jbytes == jchars) && (jbytes == ints),
+    err_msg("Hashes did not match. b:%08x != c:%08x != i:%08x\n", jbytes, jchars, ints));
+
+  jbytes = murmur3_32(SIX_BYTE, 6);
+  jchars = murmur3_32(THREE_CHAR, 3);
+  assert (jbytes == jchars,
+    err_msg("Hashes did not match. b:%08x != c:%08x\n", jbytes, jchars));
+
+  jbytes = murmur3_32(EIGHT_BYTE, 8);
+  jchars = murmur3_32(FOUR_CHAR, 4);
+  ints = murmur3_32(TWO_INT, 2);
+  assert ((jbytes == jchars) && (jbytes == ints),
+    err_msg("Hashes did not match. b:%08x != c:%08x != i:%08x\n", jbytes, jchars, ints));
+}
+
+// Returns true if the alternate hashcode is correct
+void AltHashing::test_alt_hash() {
+  testMurmur3_32_ByteArray();
+  testEquivalentHashes();
+}
+#endif // PRODUCT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/classfile/altHashing.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,62 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_CLASSFILE_ALTHASHING_HPP
+#define SHARE_VM_CLASSFILE_ALTHASHING_HPP
+
+#include "prims/jni.h"
+#include "classfile/symbolTable.hpp"
+
+/**
+ * Hashing utilities.
+ *
+ * Implementation of Murmur3 hashing.
+ * This code was translated from src/share/classes/sun/misc/Hashing.java
+ * code in the JDK.
+ */
+
+class AltHashing : AllStatic {
+
+  // utility function copied from java/lang/Integer
+  static jint Integer_rotateLeft(jint i, int distance) {
+    return (i << distance) | (((juint)i) >> (32-distance));
+  }
+  static jint murmur3_32(const int* data, int len);
+  static jint murmur3_32(jint seed, const int* data, int len);
+
+#ifndef PRODUCT
+  // Hashing functions used for internal testing
+  static jint murmur3_32(const jbyte* data, int len);
+  static jint murmur3_32(const jchar* data, int len);
+  static void testMurmur3_32_ByteArray();
+  static void testEquivalentHashes();
+#endif // PRODUCT
+
+ public:
+  static jint compute_seed();
+  static jint murmur3_32(jint seed, const jbyte* data, int len);
+  static jint murmur3_32(jint seed, const jchar* data, int len);
+  NOT_PRODUCT(static void test_alt_hash();)
+};
+#endif // SHARE_VM_CLASSFILE_ALTHASHING_HPP
--- a/src/share/vm/classfile/classFileParser.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/classFileParser.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -318,6 +318,13 @@
 
 bool inline valid_cp_range(int index, int length) { return (index > 0 && index < length); }
 
+inline Symbol* check_symbol_at(constantPoolHandle cp, int index) {
+  if (valid_cp_range(index, cp->length()) && cp->tag_at(index).is_utf8())
+    return cp->symbol_at(index);
+  else
+    return NULL;
+}
+
 constantPoolHandle ClassFileParser::parse_constant_pool(Handle class_loader, TRAPS) {
   ClassFileStream* cfs = stream();
   constantPoolHandle nullHandle;
@@ -902,6 +909,7 @@
                                              bool* is_synthetic_addr,
                                              u2* generic_signature_index_addr,
                                              typeArrayHandle* field_annotations,
+                                             ClassFileParser::FieldAnnotationCollector* parsed_annotations,
                                              TRAPS) {
   ClassFileStream* cfs = stream();
   assert(attributes_count > 0, "length should be greater than 0");
@@ -1142,12 +1150,14 @@
     bool is_synthetic = false;
     u2 generic_signature_index = 0;
     bool is_static = access_flags.is_static();
+    FieldAnnotationCollector parsed_annotations;
 
     u2 attributes_count = cfs->get_u2_fast();
     if (attributes_count > 0) {
       parse_field_attributes(cp, attributes_count, is_static, signature_index,
                              &constantvalue_index, &is_synthetic,
                              &generic_signature_index, &field_annotations,
+                             &parsed_annotations,
                              CHECK_(nullHandle));
       if (field_annotations.not_null()) {
         if (fields_annotations->is_null()) {
@@ -1173,6 +1183,8 @@
                       signature_index,
                       constantvalue_index,
                       0);
+    if (parsed_annotations.has_any_annotations())
+      parsed_annotations.apply_to(field);
 
     BasicType type = cp->basic_type_for_signature_at(signature_index);
 
@@ -1284,42 +1296,38 @@
 }
 
 
-typeArrayHandle ClassFileParser::parse_exception_table(u4 code_length,
-                                                       u4 exception_table_length,
-                                                       constantPoolHandle cp,
-                                                       TRAPS) {
+u2* ClassFileParser::parse_exception_table(u4 code_length,
+                                           u4 exception_table_length,
+                                           constantPoolHandle cp,
+                                           TRAPS) {
   ClassFileStream* cfs = stream();
-  typeArrayHandle nullHandle;
-
-  // 4-tuples of ints [start_pc, end_pc, handler_pc, catch_type index]
-  typeArrayOop eh = oopFactory::new_permanent_intArray(exception_table_length*4, CHECK_(nullHandle));
-  typeArrayHandle exception_handlers = typeArrayHandle(THREAD, eh);
-
-  int index = 0;
-  cfs->guarantee_more(8 * exception_table_length, CHECK_(nullHandle)); // start_pc, end_pc, handler_pc, catch_type_index
-  for (unsigned int i = 0; i < exception_table_length; i++) {
-    u2 start_pc = cfs->get_u2_fast();
-    u2 end_pc = cfs->get_u2_fast();
-    u2 handler_pc = cfs->get_u2_fast();
-    u2 catch_type_index = cfs->get_u2_fast();
-    // Will check legal target after parsing code array in verifier.
-    if (_need_verify) {
+
+  u2* exception_table_start = cfs->get_u2_buffer();
+  assert(exception_table_start != NULL, "null exception table");
+  cfs->guarantee_more(8 * exception_table_length, CHECK_NULL); // start_pc, end_pc, handler_pc, catch_type_index
+  // Will check legal target after parsing code array in verifier.
+  if (_need_verify) {
+    for (unsigned int i = 0; i < exception_table_length; i++) {
+      u2 start_pc = cfs->get_u2_fast();
+      u2 end_pc = cfs->get_u2_fast();
+      u2 handler_pc = cfs->get_u2_fast();
+      u2 catch_type_index = cfs->get_u2_fast();
       guarantee_property((start_pc < end_pc) && (end_pc <= code_length),
-                         "Illegal exception table range in class file %s", CHECK_(nullHandle));
+                         "Illegal exception table range in class file %s",
+                         CHECK_NULL);
       guarantee_property(handler_pc < code_length,
-                         "Illegal exception table handler in class file %s", CHECK_(nullHandle));
+                         "Illegal exception table handler in class file %s",
+                         CHECK_NULL);
       if (catch_type_index != 0) {
         guarantee_property(valid_cp_range(catch_type_index, cp->length()) &&
                            is_klass_reference(cp, catch_type_index),
-                           "Catch type in exception table has bad constant type in class file %s", CHECK_(nullHandle));
+                           "Catch type in exception table has bad constant type in class file %s", CHECK_NULL);
       }
     }
-    exception_handlers->int_at_put(index++, start_pc);
-    exception_handlers->int_at_put(index++, end_pc);
-    exception_handlers->int_at_put(index++, handler_pc);
-    exception_handlers->int_at_put(index++, catch_type_index);
+  } else {
+    cfs->skip_u2_fast(exception_table_length * 4);
   }
-  return exception_handlers;
+  return exception_table_start;
 }
 
 void ClassFileParser::parse_linenumber_table(
@@ -1368,7 +1376,7 @@
 };
 
 
-class LVT_Hash: public CHeapObj {
+class LVT_Hash: public CHeapObj<mtClass> {
  public:
   LocalVariableTableElement  *_elem;  // element
   LVT_Hash*                   _next;  // Next entry in hash table
@@ -1638,12 +1646,158 @@
       name->as_C_string(), _class_name->as_C_string(), sig->as_C_string());
 }
 
+// Skip an annotation.  Return >=limit if there is any problem.
+int ClassFileParser::skip_annotation(u1* buffer, int limit, int index) {
+  // annotation := atype:u2 do(nmem:u2) {member:u2 value}
+  // value := switch (tag:u1) { ... }
+  index += 2;  // skip atype
+  if ((index += 2) >= limit)  return limit;  // read nmem
+  int nmem = Bytes::get_Java_u2(buffer+index-2);
+  while (--nmem >= 0 && index < limit) {
+    index += 2; // skip member
+    index = skip_annotation_value(buffer, limit, index);
+  }
+  return index;
+}
+
+// Skip an annotation value.  Return >=limit if there is any problem.
+int ClassFileParser::skip_annotation_value(u1* buffer, int limit, int index) {
+  // value := switch (tag:u1) {
+  //   case B, C, I, S, Z, D, F, J, c: con:u2;
+  //   case e: e_class:u2 e_name:u2;
+  //   case s: s_con:u2;
+  //   case [: do(nval:u2) {value};
+  //   case @: annotation;
+  //   case s: s_con:u2;
+  // }
+  if ((index += 1) >= limit)  return limit;  // read tag
+  u1 tag = buffer[index-1];
+  switch (tag) {
+  case 'B': case 'C': case 'I': case 'S': case 'Z':
+  case 'D': case 'F': case 'J': case 'c': case 's':
+    index += 2;  // skip con or s_con
+    break;
+  case 'e':
+    index += 4;  // skip e_class, e_name
+    break;
+  case '[':
+    {
+      if ((index += 2) >= limit)  return limit;  // read nval
+      int nval = Bytes::get_Java_u2(buffer+index-2);
+      while (--nval >= 0 && index < limit) {
+        index = skip_annotation_value(buffer, limit, index);
+      }
+    }
+    break;
+  case '@':
+    index = skip_annotation(buffer, limit, index);
+    break;
+  default:
+    assert(false, "annotation tag");
+    return limit;  //  bad tag byte
+  }
+  return index;
+}
+
+// Sift through annotations, looking for those significant to the VM:
+void ClassFileParser::parse_annotations(u1* buffer, int limit,
+                                        constantPoolHandle cp,
+                                        ClassFileParser::AnnotationCollector* coll,
+                                        TRAPS) {
+  // annotations := do(nann:u2) {annotation}
+  int index = 0;
+  if ((index += 2) >= limit)  return;  // read nann
+  int nann = Bytes::get_Java_u2(buffer+index-2);
+  enum {  // initial annotation layout
+    atype_off = 0,      // utf8 such as 'Ljava/lang/annotation/Retention;'
+    count_off = 2,      // u2   such as 1 (one value)
+    member_off = 4,     // utf8 such as 'value'
+    tag_off = 6,        // u1   such as 'c' (type) or 'e' (enum)
+    e_tag_val = 'e',
+      e_type_off = 7,   // utf8 such as 'Ljava/lang/annotation/RetentionPolicy;'
+      e_con_off = 9,    // utf8 payload, such as 'SOURCE', 'CLASS', 'RUNTIME'
+      e_size = 11,     // end of 'e' annotation
+    c_tag_val = 'c',
+      c_con_off = 7,    // utf8 payload, such as 'I' or 'Ljava/lang/String;'
+      c_size = 9,       // end of 'c' annotation
+    min_size = 6        // smallest possible size (zero members)
+  };
+  while ((--nann) >= 0 && (index-2 + min_size <= limit)) {
+    int index0 = index;
+    index = skip_annotation(buffer, limit, index);
+    u1* abase = buffer + index0;
+    int atype = Bytes::get_Java_u2(abase + atype_off);
+    int count = Bytes::get_Java_u2(abase + count_off);
+    Symbol* aname = check_symbol_at(cp, atype);
+    if (aname == NULL)  break;  // invalid annotation name
+    Symbol* member = NULL;
+    if (count >= 1) {
+      int member_index = Bytes::get_Java_u2(abase + member_off);
+      member = check_symbol_at(cp, member_index);
+      if (member == NULL)  break;  // invalid member name
+    }
+
+    // Here is where parsing particular annotations will take place.
+    AnnotationCollector::ID id = coll->annotation_index(aname);
+    if (id == AnnotationCollector::_unknown)  continue;
+    coll->set_annotation(id);
+    // If there are no values, just set the bit and move on:
+    if (count == 0)   continue;
+
+    // For the record, here is how annotation payloads can be collected.
+    // Suppose we want to capture @Retention.value.  Here is how:
+    //if (id == AnnotationCollector::_class_Retention) {
+    //  Symbol* payload = NULL;
+    //  if (count == 1
+    //      && e_size == (index0 - index)  // match size
+    //      && e_tag_val == *(abase + tag_off)
+    //      && (check_symbol_at(cp, Bytes::get_Java_u2(abase + e_type_off))
+    //          == vmSymbols::RetentionPolicy_signature())
+    //      && member == vmSymbols::value_name()) {
+    //    payload = check_symbol_at(cp, Bytes::get_Java_u2(abase + e_con_off));
+    //  }
+    //  check_property(payload != NULL,
+    //                 "Invalid @Retention annotation at offset %u in class file %s",
+    //                 index0, CHECK);
+    //  if (payload != NULL) {
+    //      payload->increment_refcount();
+    //      coll->_class_RetentionPolicy = payload;
+    //  }
+    //}
+  }
+}
+
+ClassFileParser::AnnotationCollector::ID ClassFileParser::AnnotationCollector::annotation_index(Symbol* name) {
+  vmSymbols::SID sid = vmSymbols::find_sid(name);
+  switch (sid) {
+  case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_ForceInline_signature):
+    if (_location != _in_method)  break;  // only allow for methods
+    return _method_ForceInline;
+  default: break;
+  }
+  return AnnotationCollector::_unknown;
+}
+
+void ClassFileParser::FieldAnnotationCollector::apply_to(FieldInfo* f) {
+  fatal("no field annotations yet");
+}
+
+void ClassFileParser::MethodAnnotationCollector::apply_to(methodHandle m) {
+  if (has_annotation(_method_ForceInline))
+    m->set_force_inline(true);
+}
+
+void ClassFileParser::ClassAnnotationCollector::apply_to(instanceKlassHandle k) {
+  fatal("no class annotations yet");
+}
+
+
 #define MAX_ARGS_SIZE 255
 #define MAX_CODE_SIZE 65535
 #define INITIAL_MAX_LVT_NUMBER 256
 
 // Note: the parse_method below is big and clunky because all parsing of the code and exceptions
-// attribute is inlined. This is curbersome to avoid since we inline most of the parts in the
+// attribute is inlined. This is cumbersome to avoid since we inline most of the parts in the
 // methodOop to save footprint, so we only know the size of the resulting methodOop when the
 // entire method attribute is parsed.
 //
@@ -1712,6 +1866,7 @@
   u4 code_length = 0;
   u1* code_start = 0;
   u2 exception_table_length = 0;
+  u2* exception_table_start = NULL;
   typeArrayHandle exception_handlers(THREAD, Universe::the_empty_int_array());
   u2 checked_exceptions_length = 0;
   u2* checked_exceptions_start = NULL;
@@ -1733,6 +1888,7 @@
   // stackmap attribute - JDK1.5
   typeArrayHandle stackmap_data;
   u2 generic_signature_index = 0;
+  MethodAnnotationCollector parsed_annotations;
   u1* runtime_visible_annotations = NULL;
   int runtime_visible_annotations_length = 0;
   u1* runtime_invisible_annotations = NULL;
@@ -1798,7 +1954,7 @@
       cfs->guarantee_more(2, CHECK_(nullHandle));  // exception_table_length
       exception_table_length = cfs->get_u2_fast();
       if (exception_table_length > 0) {
-        exception_handlers =
+        exception_table_start =
               parse_exception_table(code_length, exception_table_length, cp, CHECK_(nullHandle));
       }
 
@@ -1959,6 +2115,7 @@
         runtime_visible_annotations_length = method_attribute_length;
         runtime_visible_annotations = cfs->get_u1_buffer();
         assert(runtime_visible_annotations != NULL, "null visible annotations");
+        parse_annotations(runtime_visible_annotations, runtime_visible_annotations_length, cp, &parsed_annotations, CHECK_(nullHandle));
         cfs->skip_u1(runtime_visible_annotations_length, CHECK_(nullHandle));
       } else if (PreserveAllAnnotations && method_attribute_name == vmSymbols::tag_runtime_invisible_annotations()) {
         runtime_invisible_annotations_length = method_attribute_length;
@@ -2002,9 +2159,13 @@
   }
 
   // All sizing information for a methodOop is finally available, now create it
-  methodOop m_oop  = oopFactory::new_method(code_length, access_flags, linenumber_table_length,
-                                            total_lvt_length, checked_exceptions_length,
-                                            oopDesc::IsSafeConc, CHECK_(nullHandle));
+  methodOop m_oop  = oopFactory::new_method(code_length, access_flags,
+                                            linenumber_table_length,
+                                            total_lvt_length,
+                                            exception_table_length,
+                                            checked_exceptions_length,
+                                            oopDesc::IsSafeConc,
+                                            CHECK_(nullHandle));
   methodHandle m (THREAD, m_oop);
 
   ClassLoadingService::add_class_method_size(m_oop->size()*HeapWordSize);
@@ -2035,16 +2196,15 @@
   // Fill in code attribute information
   m->set_max_stack(max_stack);
   m->set_max_locals(max_locals);
-  m->constMethod()->set_stackmap_data(stackmap_data());
 
   /**
-   * The exception_table field is the flag used to indicate
+   * The stackmap_data field is the flag used to indicate
    * that the methodOop and it's associated constMethodOop are partially
    * initialized and thus are exempt from pre/post GC verification.  Once
    * the field is set, the oops are considered fully initialized so make
    * sure that the oops can pass verification when this field is set.
    */
-  m->set_exception_table(exception_handlers());
+  m->constMethod()->set_stackmap_data(stackmap_data());
 
   // Copy byte codes
   m->set_code(code_start);
@@ -2055,6 +2215,14 @@
            linenumber_table->buffer(), linenumber_table_length);
   }
 
+  // Copy exception table
+  if (exception_table_length > 0) {
+    int size =
+      exception_table_length * sizeof(ExceptionTableElement) / sizeof(u2);
+    copy_u2_with_conversion((u2*) m->exception_table_start(),
+                             exception_table_start, size);
+  }
+
   // Copy checked exceptions
   if (checked_exceptions_length > 0) {
     int size = checked_exceptions_length * sizeof(CheckedExceptionElement) / sizeof(u2);
@@ -2136,6 +2304,8 @@
     clear_hashtable(lvt_Hash);
   }
 
+  if (parsed_annotations.has_any_annotations())
+    parsed_annotations.apply_to(m);
   *method_annotations = assemble_annotations(runtime_visible_annotations,
                                              runtime_visible_annotations_length,
                                              runtime_invisible_annotations,
@@ -2314,7 +2484,7 @@
 }
 
 
-void ClassFileParser::parse_classfile_sourcefile_attribute(constantPoolHandle cp, instanceKlassHandle k, TRAPS) {
+void ClassFileParser::parse_classfile_sourcefile_attribute(constantPoolHandle cp, TRAPS) {
   ClassFileStream* cfs = stream();
   cfs->guarantee_more(2, CHECK);  // sourcefile_index
   u2 sourcefile_index = cfs->get_u2_fast();
@@ -2323,13 +2493,12 @@
       cp->tag_at(sourcefile_index).is_utf8(),
     "Invalid SourceFile attribute at constant pool index %u in class file %s",
     sourcefile_index, CHECK);
-  k->set_source_file_name(cp->symbol_at(sourcefile_index));
+  set_class_sourcefile(cp->symbol_at(sourcefile_index));
 }
 
 
 
 void ClassFileParser::parse_classfile_source_debug_extension_attribute(constantPoolHandle cp,
-                                                                       instanceKlassHandle k,
                                                                        int length, TRAPS) {
   ClassFileStream* cfs = stream();
   u1* sde_buffer = cfs->get_u1_buffer();
@@ -2337,12 +2506,13 @@
 
   // Don't bother storing it if there is no way to retrieve it
   if (JvmtiExport::can_get_source_debug_extension()) {
-    // Optimistically assume that only 1 byte UTF format is used
-    // (common case)
-    TempNewSymbol sde_symbol = SymbolTable::new_symbol((const char*)sde_buffer, length, CHECK);
-    k->set_source_debug_extension(sde_symbol);
-    // Note that set_source_debug_extension() increments the reference count
-    // for its copy of the Symbol*, so use a TempNewSymbol here.
+    assert((length+1) > length, "Overflow checking");
+    u1* sde = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, u1, length+1);
+    for (int i = 0; i < length; i++) {
+      sde[i] = sde_buffer[i];
+    }
+    sde[length] = '\0';
+    set_class_sde_buffer((char*)sde, length);
   }
   // Got utf8 string, set stream position forward
   cfs->skip_u1(length, CHECK);
@@ -2358,7 +2528,7 @@
                                                             u2 enclosing_method_class_index,
                                                             u2 enclosing_method_method_index,
                                                             constantPoolHandle cp,
-                                                            instanceKlassHandle k, TRAPS) {
+                                                            TRAPS) {
   ClassFileStream* cfs = stream();
   u1* current_mark = cfs->current();
   u2 length = 0;
@@ -2449,7 +2619,7 @@
   assert(index == size, "wrong size");
 
   // Update instanceKlass with inner class info.
-  k->set_inner_classes(inner_classes());
+  set_class_inner_classes(inner_classes);
 
   // Restore buffer's current position.
   cfs->set_current(current_mark);
@@ -2457,11 +2627,11 @@
   return length;
 }
 
-void ClassFileParser::parse_classfile_synthetic_attribute(constantPoolHandle cp, instanceKlassHandle k, TRAPS) {
-  k->set_is_synthetic();
+void ClassFileParser::parse_classfile_synthetic_attribute(constantPoolHandle cp, TRAPS) {
+  set_class_synthetic_flag(true);
 }
 
-void ClassFileParser::parse_classfile_signature_attribute(constantPoolHandle cp, instanceKlassHandle k, TRAPS) {
+void ClassFileParser::parse_classfile_signature_attribute(constantPoolHandle cp, TRAPS) {
   ClassFileStream* cfs = stream();
   u2 signature_index = cfs->get_u2(CHECK);
   check_property(
@@ -2469,10 +2639,10 @@
       cp->tag_at(signature_index).is_utf8(),
     "Invalid constant pool index %u in Signature attribute in class file %s",
     signature_index, CHECK);
-  k->set_generic_signature(cp->symbol_at(signature_index));
+  set_class_generic_signature(cp->symbol_at(signature_index));
 }
 
-void ClassFileParser::parse_classfile_bootstrap_methods_attribute(constantPoolHandle cp, instanceKlassHandle k,
+void ClassFileParser::parse_classfile_bootstrap_methods_attribute(constantPoolHandle cp,
                                                                   u4 attribute_byte_length, TRAPS) {
   ClassFileStream* cfs = stream();
   u1* current_start = cfs->current();
@@ -2544,10 +2714,12 @@
 }
 
 
-void ClassFileParser::parse_classfile_attributes(constantPoolHandle cp, instanceKlassHandle k, TRAPS) {
+void ClassFileParser::parse_classfile_attributes(constantPoolHandle cp,
+                                                 ClassFileParser::ClassAnnotationCollector* parsed_annotations,
+                                                 TRAPS) {
   ClassFileStream* cfs = stream();
   // Set inner classes attribute to default sentinel
-  k->set_inner_classes(Universe::the_empty_short_array());
+  set_class_inner_classes(typeArrayHandle(THREAD, Universe::the_empty_short_array()));
   cfs->guarantee_more(2, CHECK);  // attributes_count
   u2 attributes_count = cfs->get_u2_fast();
   bool parsed_sourcefile_attribute = false;
@@ -2583,10 +2755,10 @@
       } else {
         parsed_sourcefile_attribute = true;
       }
-      parse_classfile_sourcefile_attribute(cp, k, CHECK);
+      parse_classfile_sourcefile_attribute(cp, CHECK);
     } else if (tag == vmSymbols::tag_source_debug_extension()) {
       // Check for SourceDebugExtension tag
-      parse_classfile_source_debug_extension_attribute(cp, k, (int)attribute_length, CHECK);
+      parse_classfile_source_debug_extension_attribute(cp, (int)attribute_length, CHECK);
     } else if (tag == vmSymbols::tag_inner_classes()) {
       // Check for InnerClasses tag
       if (parsed_innerclasses_attribute) {
@@ -2605,7 +2777,7 @@
           "Invalid Synthetic classfile attribute length %u in class file %s",
           attribute_length, CHECK);
       }
-      parse_classfile_synthetic_attribute(cp, k, CHECK);
+      parse_classfile_synthetic_attribute(cp, CHECK);
     } else if (tag == vmSymbols::tag_deprecated()) {
       // Check for Deprecatd tag - 4276120
       if (attribute_length != 0) {
@@ -2620,11 +2792,16 @@
             "Wrong Signature attribute length %u in class file %s",
             attribute_length, CHECK);
         }
-        parse_classfile_signature_attribute(cp, k, CHECK);
+        parse_classfile_signature_attribute(cp, CHECK);
       } else if (tag == vmSymbols::tag_runtime_visible_annotations()) {
         runtime_visible_annotations_length = attribute_length;
         runtime_visible_annotations = cfs->get_u1_buffer();
         assert(runtime_visible_annotations != NULL, "null visible annotations");
+        parse_annotations(runtime_visible_annotations,
+                          runtime_visible_annotations_length,
+                          cp,
+                          parsed_annotations,
+                          CHECK);
         cfs->skip_u1(runtime_visible_annotations_length, CHECK);
       } else if (PreserveAllAnnotations && tag == vmSymbols::tag_runtime_invisible_annotations()) {
         runtime_invisible_annotations_length = attribute_length;
@@ -2658,7 +2835,7 @@
         if (parsed_bootstrap_methods_attribute)
           classfile_parse_error("Multiple BootstrapMethods attributes in class file %s", CHECK);
         parsed_bootstrap_methods_attribute = true;
-        parse_classfile_bootstrap_methods_attribute(cp, k, attribute_length, CHECK);
+        parse_classfile_bootstrap_methods_attribute(cp, attribute_length, CHECK);
       } else {
         // Unknown attribute
         cfs->skip_u1(attribute_length, CHECK);
@@ -2673,7 +2850,7 @@
                                                      runtime_invisible_annotations,
                                                      runtime_invisible_annotations_length,
                                                      CHECK);
-  k->set_class_annotations(annotations());
+  set_class_annotations(annotations);
 
   if (parsed_innerclasses_attribute || parsed_enclosingmethod_attribute) {
     u2 num_of_classes = parse_classfile_inner_classes_attribute(
@@ -2681,7 +2858,7 @@
                             parsed_innerclasses_attribute,
                             enclosing_method_class_index,
                             enclosing_method_method_index,
-                            cp, k, CHECK);
+                            cp, CHECK);
     if (parsed_innerclasses_attribute &&_need_verify && _major_version >= JAVA_1_5_VERSION) {
       guarantee_property(
         inner_classes_attribute_length == sizeof(num_of_classes) + 4 * sizeof(u2) * num_of_classes,
@@ -2695,6 +2872,23 @@
   }
 }
 
+void ClassFileParser::apply_parsed_class_attributes(instanceKlassHandle k) {
+  if (_synthetic_flag)
+    k->set_is_synthetic();
+  if (_sourcefile != NULL) {
+    _sourcefile->increment_refcount();
+    k->set_source_file_name(_sourcefile);
+  }
+  if (_generic_signature != NULL) {
+    _generic_signature->increment_refcount();
+    k->set_generic_signature(_generic_signature);
+  }
+  if (_sde_buffer != NULL) {
+    k->set_source_debug_extension(_sde_buffer, _sde_length);
+  }
+  k->set_inner_classes(_inner_classes());
+  k->set_class_annotations(_annotations());
+}
 
 typeArrayHandle ClassFileParser::assemble_annotations(u1* runtime_visible_annotations,
                                                       int runtime_visible_annotations_length,
@@ -2745,8 +2939,7 @@
                             jt->get_thread_stat()->perf_timers_addr(),
                             PerfClassTraceTime::PARSE_CLASS);
 
-  _has_finalizer = _has_empty_finalizer = _has_vanilla_constructor = false;
-  _max_bootstrap_specifier_index = -1;
+  init_parsed_class_attributes();
 
   if (JvmtiExport::should_post_class_file_load_hook()) {
     // Get the cached class file bytes (if any) from the class that
@@ -2979,6 +3172,13 @@
     objArrayHandle methods_parameter_annotations(THREAD, methods_parameter_annotations_oop);
     objArrayHandle methods_default_annotations(THREAD, methods_default_annotations_oop);
 
+    // Additional attributes
+    ClassAnnotationCollector parsed_annotations;
+    parse_classfile_attributes(cp, &parsed_annotations, CHECK_(nullHandle));
+
+    // Make sure this is the end of class file stream
+    guarantee_property(cfs->at_eos(), "Extra bytes at the end of class file %s", CHECK_(nullHandle));
+
     // We check super class after class file is parsed and format is checked
     if (super_class_index > 0 && super_klass.is_null()) {
       Symbol*  sk  = cp->klass_name_at(super_class_index);
@@ -3467,11 +3667,10 @@
       this_klass->set_has_miranda_methods(); // then set a flag
     }
 
-    // Additional attributes
-    parse_classfile_attributes(cp, this_klass, CHECK_(nullHandle));
-
-    // Make sure this is the end of class file stream
-    guarantee_property(cfs->at_eos(), "Extra bytes at the end of class file %s", CHECK_(nullHandle));
+    // Fill in field values obtained by parse_classfile_attributes
+    if (parsed_annotations.has_any_annotations())
+      parsed_annotations.apply_to(this_klass);
+    apply_parsed_class_attributes(this_klass);
 
     // VerifyOops believes that once this has been set, the object is completely loaded.
     // Compute transitive closure of interfaces this class implements
@@ -3486,6 +3685,7 @@
     // Do final class setup
     fill_oop_maps(this_klass, nonstatic_oop_map_count, nonstatic_oop_offsets, nonstatic_oop_counts);
 
+    // Fill in has_finalizer, has_vanilla_constructor, and layout_helper
     set_precomputed_flags(this_klass);
 
     // reinitialize modifiers, using the InnerClasses attribute
--- a/src/share/vm/classfile/classFileParser.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/classFileParser.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -31,8 +31,8 @@
 #include "oops/typeArrayOop.hpp"
 #include "runtime/handles.inline.hpp"
 #include "utilities/accessFlags.hpp"
+#include "classfile/symbolTable.hpp"
 
-class TempNewSymbol;
 class FieldAllocationCount;
 
 
@@ -50,11 +50,80 @@
   KlassHandle _host_klass;
   GrowableArray<Handle>* _cp_patches; // overrides for CP entries
 
+  // precomputed flags
   bool _has_finalizer;
   bool _has_empty_finalizer;
   bool _has_vanilla_constructor;
+  int _max_bootstrap_specifier_index;  // detects BSS values
 
-  int _max_bootstrap_specifier_index;
+  // class attributes parsed before the instance klass is created:
+  bool       _synthetic_flag;
+  Symbol*    _sourcefile;
+  Symbol*    _generic_signature;
+  char*      _sde_buffer;
+  int        _sde_length;
+  typeArrayHandle _inner_classes;
+  typeArrayHandle _annotations;
+
+  void set_class_synthetic_flag(bool x)           { _synthetic_flag = x; }
+  void set_class_sourcefile(Symbol* x)            { _sourcefile = x; }
+  void set_class_generic_signature(Symbol* x)     { _generic_signature = x; }
+  void set_class_sde_buffer(char* x, int len)     { _sde_buffer = x; _sde_length = len; }
+  void set_class_inner_classes(typeArrayHandle x) { _inner_classes = x; }
+  void set_class_annotations(typeArrayHandle x)   { _annotations = x; }
+  void init_parsed_class_attributes() {
+    _synthetic_flag = false;
+    _sourcefile = NULL;
+    _generic_signature = NULL;
+    _sde_buffer = NULL;
+    _sde_length = 0;
+    // initialize the other flags too:
+    _has_finalizer = _has_empty_finalizer = _has_vanilla_constructor = false;
+    _max_bootstrap_specifier_index = -1;
+  }
+  void apply_parsed_class_attributes(instanceKlassHandle k);  // update k
+
+  class AnnotationCollector {
+  public:
+    enum Location { _in_field, _in_method, _in_class };
+    enum ID {
+      _unknown = 0,
+      _method_ForceInline,
+      _annotation_LIMIT
+    };
+    const Location _location;
+    int _annotations_present;
+    AnnotationCollector(Location location)
+    : _location(location), _annotations_present(0)
+    {
+      assert((int)_annotation_LIMIT <= (int)sizeof(_annotations_present) * BitsPerByte, "");
+    }
+    // If this annotation name has an ID, report it (or _none).
+    ID annotation_index(Symbol* name);
+    // Set the annotation name:
+    void set_annotation(ID id) {
+      assert((int)id >= 0 && (int)id < (int)_annotation_LIMIT, "oob");
+      _annotations_present |= nth_bit((int)id);
+    }
+    // Report if the annotation is present.
+    bool has_any_annotations() { return _annotations_present != 0; }
+    bool has_annotation(ID id) { return (nth_bit((int)id) & _annotations_present) != 0; }
+  };
+  class FieldAnnotationCollector: public AnnotationCollector {
+  public:
+    FieldAnnotationCollector() : AnnotationCollector(_in_field) { }
+    void apply_to(FieldInfo* f);
+  };
+  class MethodAnnotationCollector: public AnnotationCollector {
+  public:
+    MethodAnnotationCollector() : AnnotationCollector(_in_method) { }
+    void apply_to(methodHandle m);
+  };
+  class ClassAnnotationCollector: public AnnotationCollector {
+  public:
+    ClassAnnotationCollector() : AnnotationCollector(_in_class) { }
+    void apply_to(instanceKlassHandle k);
+  };
 
   enum { fixed_buffer_size = 128 };
   u_char linenumbertable_buffer[fixed_buffer_size];
@@ -87,7 +156,9 @@
                               u2* constantvalue_index_addr,
                               bool* is_synthetic_addr,
                               u2* generic_signature_index_addr,
-                              typeArrayHandle* field_annotations, TRAPS);
+                              typeArrayHandle* field_annotations,
+                              FieldAnnotationCollector* parsed_annotations,
+                              TRAPS);
   typeArrayHandle parse_fields(Symbol* class_name,
                                constantPoolHandle cp, bool is_interface,
                                FieldAllocationCount *fac,
@@ -113,8 +184,8 @@
                                 objArrayHandle methods_parameter_annotations,
                                 objArrayHandle methods_default_annotations,
                                 TRAPS);
-  typeArrayHandle parse_exception_table(u4 code_length, u4 exception_table_length,
-                                        constantPoolHandle cp, TRAPS);
+  u2* parse_exception_table(u4 code_length, u4 exception_table_length,
+                            constantPoolHandle cp, TRAPS);
   void parse_linenumber_table(
       u4 code_attribute_length, u4 code_length,
       CompressedLineNumberWriteStream** write_stream, TRAPS);
@@ -128,25 +199,32 @@
   typeArrayOop parse_stackmap_table(u4 code_attribute_length, TRAPS);
 
   // Classfile attribute parsing
-  void parse_classfile_sourcefile_attribute(constantPoolHandle cp, instanceKlassHandle k, TRAPS);
-  void parse_classfile_source_debug_extension_attribute(constantPoolHandle cp,
-                                                instanceKlassHandle k, int length, TRAPS);
+  void parse_classfile_sourcefile_attribute(constantPoolHandle cp, TRAPS);
+  void parse_classfile_source_debug_extension_attribute(constantPoolHandle cp, int length, TRAPS);
   u2   parse_classfile_inner_classes_attribute(u1* inner_classes_attribute_start,
                                                bool parsed_enclosingmethod_attribute,
                                                u2 enclosing_method_class_index,
                                                u2 enclosing_method_method_index,
                                                constantPoolHandle cp,
-                                               instanceKlassHandle k, TRAPS);
-  void parse_classfile_attributes(constantPoolHandle cp, instanceKlassHandle k, TRAPS);
-  void parse_classfile_synthetic_attribute(constantPoolHandle cp, instanceKlassHandle k, TRAPS);
-  void parse_classfile_signature_attribute(constantPoolHandle cp, instanceKlassHandle k, TRAPS);
-  void parse_classfile_bootstrap_methods_attribute(constantPoolHandle cp, instanceKlassHandle k, u4 attribute_length, TRAPS);
+                                               TRAPS);
+  void parse_classfile_attributes(constantPoolHandle cp,
+                                  ClassAnnotationCollector* parsed_annotations,
+                                  TRAPS);
+  void parse_classfile_synthetic_attribute(constantPoolHandle cp, TRAPS);
+  void parse_classfile_signature_attribute(constantPoolHandle cp, TRAPS);
+  void parse_classfile_bootstrap_methods_attribute(constantPoolHandle cp, u4 attribute_length, TRAPS);
 
   // Annotations handling
   typeArrayHandle assemble_annotations(u1* runtime_visible_annotations,
                                        int runtime_visible_annotations_length,
                                        u1* runtime_invisible_annotations,
                                        int runtime_invisible_annotations_length, TRAPS);
+  int skip_annotation(u1* buffer, int limit, int index);
+  int skip_annotation_value(u1* buffer, int limit, int index);
+  void parse_annotations(u1* buffer, int limit, constantPoolHandle cp,
+                         /* Results (currently, only one result is supported): */
+                         AnnotationCollector* result,
+                         TRAPS);
 
   // Final setup
   unsigned int compute_oop_map_count(instanceKlassHandle super,
--- a/src/share/vm/classfile/classLoader.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/classLoader.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -153,7 +153,7 @@
     _meta_package_names = NULL;
     _num_meta_package_names = 0;
   } else {
-    _meta_package_names = NEW_C_HEAP_ARRAY(char*, num_meta_package_names);
+    _meta_package_names = NEW_C_HEAP_ARRAY(char*, num_meta_package_names, mtClass);
     _num_meta_package_names = num_meta_package_names;
     memcpy(_meta_package_names, meta_package_names, num_meta_package_names * sizeof(char*));
   }
@@ -161,7 +161,7 @@
 
 
 MetaIndex::~MetaIndex() {
-  FREE_C_HEAP_ARRAY(char*, _meta_package_names);
+  FREE_C_HEAP_ARRAY(char*, _meta_package_names, mtClass);
 }
 
 
@@ -192,7 +192,7 @@
 }
 
 ClassPathDirEntry::ClassPathDirEntry(char* dir) : ClassPathEntry() {
-  _dir = NEW_C_HEAP_ARRAY(char, strlen(dir)+1);
+  _dir = NEW_C_HEAP_ARRAY(char, strlen(dir)+1, mtClass);
   strcpy(_dir, dir);
 }
 
@@ -229,7 +229,7 @@
 
 ClassPathZipEntry::ClassPathZipEntry(jzfile* zip, const char* zip_name) : ClassPathEntry() {
   _zip = zip;
-  _zip_name = NEW_C_HEAP_ARRAY(char, strlen(zip_name)+1);
+  _zip_name = NEW_C_HEAP_ARRAY(char, strlen(zip_name)+1, mtClass);
   strcpy(_zip_name, zip_name);
 }
 
@@ -237,7 +237,7 @@
   if (ZipClose != NULL) {
     (*ZipClose)(_zip);
   }
-  FREE_C_HEAP_ARRAY(char, _zip_name);
+  FREE_C_HEAP_ARRAY(char, _zip_name, mtClass);
 }
 
 ClassFileStream* ClassPathZipEntry::open_stream(const char* name) {
@@ -454,11 +454,11 @@
     while (sys_class_path[end] && sys_class_path[end] != os::path_separator()[0]) {
       end++;
     }
-    char* path = NEW_C_HEAP_ARRAY(char, end-start+1);
+    char* path = NEW_C_HEAP_ARRAY(char, end-start+1, mtClass);
     strncpy(path, &sys_class_path[start], end-start);
     path[end-start] = '\0';
     update_class_path_entry_list(path, false);
-    FREE_C_HEAP_ARRAY(char, path);
+    FREE_C_HEAP_ARRAY(char, path, mtClass);
     while (sys_class_path[end] == os::path_separator()[0]) {
       end++;
     }
@@ -652,13 +652,13 @@
 // in the classpath must be the same files, in the same order, even
 // though the exact name is not the same.
 
-class PackageInfo: public BasicHashtableEntry {
+class PackageInfo: public BasicHashtableEntry<mtClass> {
 public:
   const char* _pkgname;       // Package name
   int _classpath_index;       // Index of directory or JAR file loaded from
 
   PackageInfo* next() {
-    return (PackageInfo*)BasicHashtableEntry::next();
+    return (PackageInfo*)BasicHashtableEntry<mtClass>::next();
   }
 
   const char* pkgname()           { return _pkgname; }
@@ -674,7 +674,7 @@
 };
 
 
-class PackageHashtable : public BasicHashtable {
+class PackageHashtable : public BasicHashtable<mtClass> {
 private:
   inline unsigned int compute_hash(const char *s, int n) {
     unsigned int val = 0;
@@ -685,7 +685,7 @@
   }
 
   PackageInfo* bucket(int index) {
-    return (PackageInfo*)BasicHashtable::bucket(index);
+    return (PackageInfo*)BasicHashtable<mtClass>::bucket(index);
   }
 
   PackageInfo* get_entry(int index, unsigned int hash,
@@ -702,10 +702,10 @@
 
 public:
   PackageHashtable(int table_size)
-    : BasicHashtable(table_size, sizeof(PackageInfo)) {}
+    : BasicHashtable<mtClass>(table_size, sizeof(PackageInfo)) {}
 
-  PackageHashtable(int table_size, HashtableBucket* t, int number_of_entries)
-    : BasicHashtable(table_size, sizeof(PackageInfo), t, number_of_entries) {}
+  PackageHashtable(int table_size, HashtableBucket<mtClass>* t, int number_of_entries)
+    : BasicHashtable<mtClass>(table_size, sizeof(PackageInfo), t, number_of_entries) {}
 
   PackageInfo* get_entry(const char* pkgname, int n) {
     unsigned int hash = compute_hash(pkgname, n);
@@ -715,14 +715,14 @@
   PackageInfo* new_entry(char* pkgname, int n) {
     unsigned int hash = compute_hash(pkgname, n);
     PackageInfo* pp;
-    pp = (PackageInfo*)BasicHashtable::new_entry(hash);
+    pp = (PackageInfo*)BasicHashtable<mtClass>::new_entry(hash);
     pp->set_pkgname(pkgname);
     return pp;
   }
 
   void add_entry(PackageInfo* pp) {
     int index = hash_to_index(pp->hash());
-    BasicHashtable::add_entry(index, pp);
+    BasicHashtable<mtClass>::add_entry(index, pp);
   }
 
   void copy_pkgnames(const char** packages) {
@@ -742,7 +742,7 @@
 void PackageHashtable::copy_table(char** top, char* end,
                                   PackageHashtable* table) {
   // Copy (relocate) the table to the shared space.
-  BasicHashtable::copy_table(top, end);
+  BasicHashtable<mtClass>::copy_table(top, end);
 
   // Calculate the space needed for the package name strings.
   int i;
@@ -815,7 +815,7 @@
       // Package prefix found
       int n = cp - pkgname + 1;
 
-      char* new_pkgname = NEW_C_HEAP_ARRAY(char, n + 1);
+      char* new_pkgname = NEW_C_HEAP_ARRAY(char, n + 1, mtClass);
       if (new_pkgname == NULL) {
         return false;
       }
@@ -929,10 +929,10 @@
 }
 
 
-void ClassLoader::create_package_info_table(HashtableBucket *t, int length,
+void ClassLoader::create_package_info_table(HashtableBucket<mtClass> *t, int length,
                                             int number_of_entries) {
   assert(_package_hash_table == NULL, "One package info table allowed.");
-  assert(length == package_hash_table_size * sizeof(HashtableBucket),
+  assert(length == package_hash_table_size * sizeof(HashtableBucket<mtClass>),
          "bad shared package info size.");
   _package_hash_table = new PackageHashtable(package_hash_table_size, t,
                                              number_of_entries);
--- a/src/share/vm/classfile/classLoader.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/classLoader.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -33,7 +33,7 @@
 
 
 // Meta-index (optional, to be able to skip opening boot classpath jar files)
-class MetaIndex: public CHeapObj {
+class MetaIndex: public CHeapObj<mtClass> {
  private:
   char** _meta_package_names;
   int    _num_meta_package_names;
@@ -46,7 +46,7 @@
 
 // Class path entry (directory or zip file)
 
-class ClassPathEntry: public CHeapObj {
+class ClassPathEntry: public CHeapObj<mtClass> {
  private:
   ClassPathEntry* _next;
  public:
@@ -141,7 +141,7 @@
 
 class PackageHashtable;
 class PackageInfo;
-class HashtableBucket;
+template <MEMFLAGS F> class HashtableBucket;
 
 class ClassLoader: AllStatic {
  public:
@@ -299,7 +299,7 @@
   // Initialization
   static void initialize();
   static void create_package_info_table();
-  static void create_package_info_table(HashtableBucket *t, int length,
+  static void create_package_info_table(HashtableBucket<mtClass> *t, int length,
                                         int number_of_entries);
   static int compute_Object_vtable();
 
--- a/src/share/vm/classfile/dictionary.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/dictionary.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -36,16 +36,16 @@
 
 
 Dictionary::Dictionary(int table_size)
-  : TwoOopHashtable<klassOop>(table_size, sizeof(DictionaryEntry)) {
+  : TwoOopHashtable<klassOop, mtClass>(table_size, sizeof(DictionaryEntry)) {
   _current_class_index = 0;
   _current_class_entry = NULL;
 };
 
 
 
-Dictionary::Dictionary(int table_size, HashtableBucket* t,
+Dictionary::Dictionary(int table_size, HashtableBucket<mtClass>* t,
                        int number_of_entries)
-  : TwoOopHashtable<klassOop>(table_size, sizeof(DictionaryEntry), t, number_of_entries) {
+  : TwoOopHashtable<klassOop, mtClass>(table_size, sizeof(DictionaryEntry), t, number_of_entries) {
   _current_class_index = 0;
   _current_class_entry = NULL;
 };
@@ -54,7 +54,7 @@
 DictionaryEntry* Dictionary::new_entry(unsigned int hash, klassOop klass,
                                        oop loader) {
   DictionaryEntry* entry;
-  entry = (DictionaryEntry*)Hashtable<klassOop>::new_entry(hash, klass);
+  entry = (DictionaryEntry*)Hashtable<klassOop, mtClass>::new_entry(hash, klass);
   entry->set_loader(loader);
   entry->set_pd_set(NULL);
   return entry;
@@ -62,7 +62,7 @@
 
 
 DictionaryEntry* Dictionary::new_entry() {
-  DictionaryEntry* entry = (DictionaryEntry*)Hashtable<klassOop>::new_entry(0L, NULL);
+  DictionaryEntry* entry = (DictionaryEntry*)Hashtable<klassOop, mtClass>::new_entry(0L, NULL);
   entry->set_loader(NULL);
   entry->set_pd_set(NULL);
   return entry;
@@ -76,7 +76,7 @@
     entry->set_pd_set(to_delete->next());
     delete to_delete;
   }
-  Hashtable<klassOop>::free_entry(entry);
+  Hashtable<klassOop, mtClass>::free_entry(entry);
 }
 
 
@@ -554,12 +554,12 @@
 }
 
 SymbolPropertyTable::SymbolPropertyTable(int table_size)
-  : Hashtable<Symbol*>(table_size, sizeof(SymbolPropertyEntry))
+  : Hashtable<Symbol*, mtSymbol>(table_size, sizeof(SymbolPropertyEntry))
 {
 }
-SymbolPropertyTable::SymbolPropertyTable(int table_size, HashtableBucket* t,
+SymbolPropertyTable::SymbolPropertyTable(int table_size, HashtableBucket<mtSymbol>* t,
                                          int number_of_entries)
-  : Hashtable<Symbol*>(table_size, sizeof(SymbolPropertyEntry), t, number_of_entries)
+  : Hashtable<Symbol*, mtSymbol>(table_size, sizeof(SymbolPropertyEntry), t, number_of_entries)
 {
 }
 
@@ -584,7 +584,7 @@
   assert(find_entry(index, hash, sym, sym_mode) == NULL, "no double entry");
 
   SymbolPropertyEntry* p = new_entry(hash, sym, sym_mode);
-  Hashtable<Symbol*>::add_entry(index, p);
+  Hashtable<Symbol*, mtSymbol>::add_entry(index, p);
   return p;
 }
 
--- a/src/share/vm/classfile/dictionary.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/dictionary.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -36,7 +36,7 @@
 // The data structure for the system dictionary (and the shared system
 // dictionary).
 
-class Dictionary : public TwoOopHashtable<klassOop> {
+class Dictionary : public TwoOopHashtable<klassOop, mtClass> {
   friend class VMStructs;
 private:
   // current iteration index.
@@ -48,22 +48,22 @@
                              Symbol* name, Handle loader);
 
   DictionaryEntry* bucket(int i) {
-    return (DictionaryEntry*)Hashtable<klassOop>::bucket(i);
+    return (DictionaryEntry*)Hashtable<klassOop, mtClass>::bucket(i);
   }
 
   // The following method is not MT-safe and must be done under lock.
   DictionaryEntry** bucket_addr(int i) {
-    return (DictionaryEntry**)Hashtable<klassOop>::bucket_addr(i);
+    return (DictionaryEntry**)Hashtable<klassOop, mtClass>::bucket_addr(i);
   }
 
   void add_entry(int index, DictionaryEntry* new_entry) {
-    Hashtable<klassOop>::add_entry(index, (HashtableEntry<oop>*)new_entry);
+    Hashtable<klassOop, mtClass>::add_entry(index, (HashtableEntry<oop, mtClass>*)new_entry);
   }
 
 
 public:
   Dictionary(int table_size);
-  Dictionary(int table_size, HashtableBucket* t, int number_of_entries);
+  Dictionary(int table_size, HashtableBucket<mtClass>* t, int number_of_entries);
 
   DictionaryEntry* new_entry(unsigned int hash, klassOop klass, oop loader);
 
@@ -129,7 +129,7 @@
 // The following classes can be in dictionary.cpp, but we need these
 // to be in header file so that SA's vmStructs can access.
 
-class ProtectionDomainEntry :public CHeapObj {
+class ProtectionDomainEntry :public CHeapObj<mtClass> {
   friend class VMStructs;
  public:
   ProtectionDomainEntry* _next;
@@ -147,7 +147,7 @@
 // An entry in the system dictionary, this describes a class as
 // { klassOop, loader, protection_domain }.
 
-class DictionaryEntry : public HashtableEntry<klassOop> {
+class DictionaryEntry : public HashtableEntry<klassOop, mtClass> {
   friend class VMStructs;
  private:
   // Contains the set of approved protection domains that can access
@@ -166,11 +166,11 @@
   klassOop* klass_addr() { return (klassOop*)literal_addr(); }
 
   DictionaryEntry* next() const {
-    return (DictionaryEntry*)HashtableEntry<klassOop>::next();
+    return (DictionaryEntry*)HashtableEntry<klassOop, mtClass>::next();
   }
 
   DictionaryEntry** next_addr() {
-    return (DictionaryEntry**)HashtableEntry<klassOop>::next_addr();
+    return (DictionaryEntry**)HashtableEntry<klassOop, mtClass>::next_addr();
   }
 
   oop loader() const { return _loader; }
@@ -228,7 +228,7 @@
 
 // Entry in a SymbolPropertyTable, mapping a single Symbol*
 // to a managed and an unmanaged pointer.
-class SymbolPropertyEntry : public HashtableEntry<Symbol*> {
+class SymbolPropertyEntry : public HashtableEntry<Symbol*, mtSymbol> {
   friend class VMStructs;
  private:
   intptr_t _symbol_mode;  // secondary key
@@ -248,11 +248,11 @@
   void set_property_data(address p) { _property_data = p; }
 
   SymbolPropertyEntry* next() const {
-    return (SymbolPropertyEntry*)HashtableEntry<Symbol*>::next();
+    return (SymbolPropertyEntry*)HashtableEntry<Symbol*, mtSymbol>::next();
   }
 
   SymbolPropertyEntry** next_addr() {
-    return (SymbolPropertyEntry**)HashtableEntry<Symbol*>::next_addr();
+    return (SymbolPropertyEntry**)HashtableEntry<Symbol*, mtSymbol>::next_addr();
   }
 
   oop* property_oop_addr()          { return &_property_oop; }
@@ -278,16 +278,16 @@
 // A system-internal mapping of symbols to pointers, both managed
 // and unmanaged.  Used to record the auto-generation of each method
 // MethodHandle.invoke(S)T, for all signatures (S)T.
-class SymbolPropertyTable : public Hashtable<Symbol*> {
+class SymbolPropertyTable : public Hashtable<Symbol*, mtSymbol> {
   friend class VMStructs;
 private:
   SymbolPropertyEntry* bucket(int i) {
-    return (SymbolPropertyEntry*) Hashtable<Symbol*>::bucket(i);
+    return (SymbolPropertyEntry*) Hashtable<Symbol*, mtSymbol>::bucket(i);
   }
 
   // The following method is not MT-safe and must be done under lock.
   SymbolPropertyEntry** bucket_addr(int i) {
-    return (SymbolPropertyEntry**) Hashtable<Symbol*>::bucket_addr(i);
+    return (SymbolPropertyEntry**) Hashtable<Symbol*, mtSymbol>::bucket_addr(i);
   }
 
   void add_entry(int index, SymbolPropertyEntry* new_entry) {
@@ -298,7 +298,7 @@
   }
 
   SymbolPropertyEntry* new_entry(unsigned int hash, Symbol* symbol, intptr_t symbol_mode) {
-    SymbolPropertyEntry* entry = (SymbolPropertyEntry*) Hashtable<Symbol*>::new_entry(hash, symbol);
+    SymbolPropertyEntry* entry = (SymbolPropertyEntry*) Hashtable<Symbol*, mtSymbol>::new_entry(hash, symbol);
     // Hashtable with Symbol* literal must increment and decrement refcount.
     symbol->increment_refcount();
     entry->set_symbol_mode(symbol_mode);
@@ -309,17 +309,17 @@
 
 public:
   SymbolPropertyTable(int table_size);
-  SymbolPropertyTable(int table_size, HashtableBucket* t, int number_of_entries);
+  SymbolPropertyTable(int table_size, HashtableBucket<mtSymbol>* t, int number_of_entries);
 
   void free_entry(SymbolPropertyEntry* entry) {
     // decrement Symbol refcount here because hashtable doesn't.
     entry->literal()->decrement_refcount();
-    Hashtable<Symbol*>::free_entry(entry);
+    Hashtable<Symbol*, mtSymbol>::free_entry(entry);
   }
 
   unsigned int compute_hash(Symbol* sym, intptr_t symbol_mode) {
     // Use the regular identity_hash.
-    return Hashtable<Symbol*>::compute_hash(sym) ^ symbol_mode;
+    return Hashtable<Symbol*, mtSymbol>::compute_hash(sym) ^ symbol_mode;
   }
 
   int index_for(Symbol* name, intptr_t symbol_mode) {
--- a/src/share/vm/classfile/javaAssertions.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/javaAssertions.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -58,7 +58,7 @@
   // it is never freed, so will be leaked (along with other option strings -
   // e.g., bootclasspath) if a process creates/destroys multiple VMs.
   int len = (int)strlen(name);
-  char *name_copy = NEW_C_HEAP_ARRAY(char, len + 1);
+  char *name_copy = NEW_C_HEAP_ARRAY(char, len + 1, mtClass);
   strcpy(name_copy, name);
 
   // Figure out which list the new item should go on.  Names that end in "..."
--- a/src/share/vm/classfile/javaAssertions.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/javaAssertions.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -68,7 +68,7 @@
   static OptionList*    _packages;      // Options for package trees.
 };
 
-class JavaAssertions::OptionList: public CHeapObj {
+class JavaAssertions::OptionList: public CHeapObj<mtClass> {
 public:
   inline OptionList(const char* name, bool enable, OptionList* next);
 
--- a/src/share/vm/classfile/javaClasses.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/javaClasses.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -23,6 +23,7 @@
  */
 
 #include "precompiled.hpp"
+#include "classfile/altHashing.hpp"
 #include "classfile/javaClasses.hpp"
 #include "classfile/symbolTable.hpp"
 #include "classfile/vmSymbols.hpp"
@@ -347,13 +348,26 @@
   return result;
 }
 
-unsigned int java_lang_String::hash_string(oop java_string) {
+unsigned int java_lang_String::to_hash(oop java_string) {
+  int          length = java_lang_String::length(java_string);
+  // Zero length string will hash to zero with String.toHash() function.
+  if (length == 0) return 0;
+
   typeArrayOop value  = java_lang_String::value(java_string);
   int          offset = java_lang_String::offset(java_string);
+  return java_lang_String::to_hash(value->char_at_addr(offset), length);
+}
+
+unsigned int java_lang_String::hash_string(oop java_string) {
   int          length = java_lang_String::length(java_string);
-
-  if (length == 0) return 0;
-  return hash_string(value->char_at_addr(offset), length);
+  // Zero length string doesn't hash necessarily hash to zero.
+  if (length == 0) {
+    return StringTable::hash_string(NULL, 0);
+  }
+
+  typeArrayOop value  = java_lang_String::value(java_string);
+  int          offset = java_lang_String::offset(java_string);
+  return StringTable::hash_string(value->char_at_addr(offset), length);
 }
 
 Symbol* java_lang_String::as_symbol(Handle java_string, TRAPS) {
@@ -2724,17 +2738,6 @@
   if (k != NULL) {
     compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_lang_invoke_MethodHandle_signature());
   }
-
-  // Disallow compilation of CallSite.setTargetNormal and CallSite.setTargetVolatile
-  // (For C2:  keep this until we have throttling logic for uncommon traps.)
-  if (k != NULL) {
-    instanceKlass* ik = instanceKlass::cast(k);
-    methodOop m_normal   = ik->lookup_method(vmSymbols::setTargetNormal_name(),   vmSymbols::setTarget_signature());
-    methodOop m_volatile = ik->lookup_method(vmSymbols::setTargetVolatile_name(), vmSymbols::setTarget_signature());
-    guarantee(m_normal != NULL && m_volatile != NULL, "must exist");
-    m_normal->set_not_compilable_quietly();
-    m_volatile->set_not_compilable_quietly();
-  }
 }
 
 
--- a/src/share/vm/classfile/javaClasses.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/javaClasses.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -158,20 +158,16 @@
   static jchar* as_unicode_string(oop java_string, int& length);
 
   // Compute the hash value for a java.lang.String object which would
-  // contain the characters passed in. This hash value is used for at
-  // least two purposes.
-  //
-  // (a) As the hash value used by the StringTable for bucket selection
-  //     and comparison (stored in the HashtableEntry structures).  This
-  //     is used in the String.intern() method.
+  // contain the characters passed in.
   //
-  // (b) As the hash value used by the String object itself, in
-  //     String.hashCode().  This value is normally calculate in Java code
-  //     in the String.hashCode method(), but is precomputed for String
-  //     objects in the shared archive file.
+  // As the hash value used by the String object itself, in
+  // String.hashCode().  This value is normally calculated in Java code
+  // in the String.hashCode method(), but is precomputed for String
+  // objects in the shared archive file.
+  // hash P(31) from Kernighan & Ritchie
   //
-  //     For this reason, THIS ALGORITHM MUST MATCH String.hashCode().
-  static unsigned int hash_string(jchar* s, int len) {
+  // For this reason, THIS ALGORITHM MUST MATCH String.toHash().
+  template <typename T> static unsigned int to_hash(T* s, int len) {
     unsigned int h = 0;
     while (len-- > 0) {
       h = 31*h + (unsigned int) *s;
@@ -179,6 +175,10 @@
     }
     return h;
   }
+  static unsigned int to_hash(oop java_string);
+
+  // This is the string hash code used by the StringTable, which may be
+  // the same as String.toHash or an alternate hash code.
   static unsigned int hash_string(oop java_string);
 
   static bool equals(oop java_string, jchar* chars, int len);
--- a/src/share/vm/classfile/loaderConstraints.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/loaderConstraints.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -31,7 +31,7 @@
 #include "utilities/hashtable.inline.hpp"
 
 LoaderConstraintTable::LoaderConstraintTable(int nof_buckets)
-  : Hashtable<klassOop>(nof_buckets, sizeof(LoaderConstraintEntry)) {};
+  : Hashtable<klassOop, mtClass>(nof_buckets, sizeof(LoaderConstraintEntry)) {};
 
 
 LoaderConstraintEntry* LoaderConstraintTable::new_entry(
@@ -39,7 +39,7 @@
                                  klassOop klass, int num_loaders,
                                  int max_loaders) {
   LoaderConstraintEntry* entry;
-  entry = (LoaderConstraintEntry*)Hashtable<klassOop>::new_entry(hash, klass);
+  entry = (LoaderConstraintEntry*)Hashtable<klassOop, mtClass>::new_entry(hash, klass);
   entry->set_name(name);
   entry->set_num_loaders(num_loaders);
   entry->set_max_loaders(max_loaders);
@@ -49,7 +49,7 @@
 void LoaderConstraintTable::free_entry(LoaderConstraintEntry *entry) {
   // decrement name refcount before freeing
   entry->name()->decrement_refcount();
-  Hashtable<klassOop>::free_entry(entry);
+  Hashtable<klassOop, mtClass>::free_entry(entry);
 }
 
 
@@ -164,7 +164,7 @@
 
         // Purge entry
         *p = probe->next();
-        FREE_C_HEAP_ARRAY(oop, probe->loaders());
+        FREE_C_HEAP_ARRAY(oop, probe->loaders(), mtClass);
         free_entry(probe);
       } else {
 #ifdef ASSERT
@@ -224,7 +224,7 @@
         int index = hash_to_index(hash);
         LoaderConstraintEntry* p;
         p = new_entry(hash, class_name, klass, 2, 2);
-        p->set_loaders(NEW_C_HEAP_ARRAY(oop, 2));
+        p->set_loaders(NEW_C_HEAP_ARRAY(oop, 2, mtClass));
         p->set_loader(0, class_loader1());
         p->set_loader(1, class_loader2());
         p->set_klass(klass);
@@ -340,10 +340,10 @@
                                                     int nfree) {
     if (p->max_loaders() - p->num_loaders() < nfree) {
         int n = nfree + p->num_loaders();
-        oop* new_loaders = NEW_C_HEAP_ARRAY(oop, n);
+        oop* new_loaders = NEW_C_HEAP_ARRAY(oop, n, mtClass);
         memcpy(new_loaders, p->loaders(), sizeof(oop) * p->num_loaders());
         p->set_max_loaders(n);
-        FREE_C_HEAP_ARRAY(oop, p->loaders());
+        FREE_C_HEAP_ARRAY(oop, p->loaders(), mtClass);
         p->set_loaders(new_loaders);
     }
 }
@@ -425,7 +425,7 @@
   }
 
   *pp2 = p2->next();
-  FREE_C_HEAP_ARRAY(oop, p2->loaders());
+  FREE_C_HEAP_ARRAY(oop, p2->loaders(), mtClass);
   free_entry(p2);
   return;
 }
--- a/src/share/vm/classfile/loaderConstraints.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/loaderConstraints.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -31,7 +31,7 @@
 
 class LoaderConstraintEntry;
 
-class LoaderConstraintTable : public Hashtable<klassOop> {
+class LoaderConstraintTable : public Hashtable<klassOop, mtClass> {
   friend class VMStructs;
 private:
 
@@ -53,11 +53,11 @@
   void free_entry(LoaderConstraintEntry *entry);
 
   LoaderConstraintEntry* bucket(int i) {
-    return (LoaderConstraintEntry*)Hashtable<klassOop>::bucket(i);
+    return (LoaderConstraintEntry*)Hashtable<klassOop, mtClass>::bucket(i);
   }
 
   LoaderConstraintEntry** bucket_addr(int i) {
-    return (LoaderConstraintEntry**)Hashtable<klassOop>::bucket_addr(i);
+    return (LoaderConstraintEntry**)Hashtable<klassOop, mtClass>::bucket_addr(i);
   }
 
   // GC support
@@ -94,7 +94,7 @@
 #endif
 };
 
-class LoaderConstraintEntry : public HashtableEntry<klassOop> {
+class LoaderConstraintEntry : public HashtableEntry<klassOop, mtClass> {
   friend class VMStructs;
 private:
   Symbol*                _name;                   // class name
@@ -109,14 +109,14 @@
   void set_klass(klassOop k) { set_literal(k); }
 
   LoaderConstraintEntry* next() {
-    return (LoaderConstraintEntry*)HashtableEntry<klassOop>::next();
+    return (LoaderConstraintEntry*)HashtableEntry<klassOop, mtClass>::next();
   }
 
   LoaderConstraintEntry** next_addr() {
-    return (LoaderConstraintEntry**)HashtableEntry<klassOop>::next_addr();
+    return (LoaderConstraintEntry**)HashtableEntry<klassOop, mtClass>::next_addr();
   }
   void set_next(LoaderConstraintEntry* next) {
-    HashtableEntry<klassOop>::set_next(next);
+    HashtableEntry<klassOop, mtClass>::set_next(next);
   }
 
   Symbol* name() { return _name; }
--- a/src/share/vm/classfile/placeholders.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/placeholders.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -34,7 +34,7 @@
 PlaceholderEntry* PlaceholderTable::new_entry(int hash, Symbol* name,
                                               oop loader, bool havesupername,
                                               Symbol* supername) {
-  PlaceholderEntry* entry = (PlaceholderEntry*)Hashtable<Symbol*>::new_entry(hash, name);
+  PlaceholderEntry* entry = (PlaceholderEntry*)Hashtable<Symbol*, mtClass>::new_entry(hash, name);
   // Hashtable with Symbol* literal must increment and decrement refcount.
   name->increment_refcount();
   entry->set_loader(loader);
@@ -52,7 +52,7 @@
   // decrement Symbol refcount here because Hashtable doesn't.
   entry->literal()->decrement_refcount();
   if (entry->supername() != NULL) entry->supername()->decrement_refcount();
-  Hashtable<Symbol*>::free_entry(entry);
+  Hashtable<Symbol*, mtClass>::free_entry(entry);
 }
 
 
@@ -166,7 +166,7 @@
   }
 
 PlaceholderTable::PlaceholderTable(int table_size)
-    : TwoOopHashtable<Symbol*>(table_size, sizeof(PlaceholderEntry)) {
+    : TwoOopHashtable<Symbol*, mtClass>(table_size, sizeof(PlaceholderEntry)) {
 }
 
 
--- a/src/share/vm/classfile/placeholders.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/placeholders.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -34,7 +34,7 @@
 // being loaded, as well as arrays of primitives.
 //
 
-class PlaceholderTable : public TwoOopHashtable<Symbol*> {
+class PlaceholderTable : public TwoOopHashtable<Symbol*, mtClass> {
   friend class VMStructs;
 
 public:
@@ -44,15 +44,15 @@
   void free_entry(PlaceholderEntry* entry);
 
   PlaceholderEntry* bucket(int i) {
-    return (PlaceholderEntry*)Hashtable<Symbol*>::bucket(i);
+    return (PlaceholderEntry*)Hashtable<Symbol*, mtClass>::bucket(i);
   }
 
   PlaceholderEntry** bucket_addr(int i) {
-    return (PlaceholderEntry**)Hashtable<Symbol*>::bucket_addr(i);
+    return (PlaceholderEntry**)Hashtable<Symbol*, mtClass>::bucket_addr(i);
   }
 
   void add_entry(int index, PlaceholderEntry* new_entry) {
-    Hashtable<Symbol*>::add_entry(index, (HashtableEntry<Symbol*>*)new_entry);
+    Hashtable<Symbol*, mtClass>::add_entry(index, (HashtableEntry<Symbol*, mtClass>*)new_entry);
   }
 
   void add_entry(int index, unsigned int hash, Symbol* name,
@@ -116,7 +116,7 @@
 // For DEFINE_CLASS, the head of the queue owns the
 // define token and the rest of the threads wait to return the
 // result the first thread gets.
-class SeenThread: public CHeapObj {
+class SeenThread: public CHeapObj<mtInternal> {
 private:
    Thread *_thread;
    SeenThread* _stnext;
@@ -152,7 +152,7 @@
 // on store ordering here.
 // The system dictionary is the only user of this class.
 
-class PlaceholderEntry : public HashtableEntry<Symbol*> {
+class PlaceholderEntry : public HashtableEntry<Symbol*, mtClass> {
   friend class VMStructs;
 
 
@@ -206,11 +206,11 @@
   void               set_defineThreadQ(SeenThread* SeenThread) { _defineThreadQ = SeenThread; }
 
   PlaceholderEntry* next() const {
-    return (PlaceholderEntry*)HashtableEntry<Symbol*>::next();
+    return (PlaceholderEntry*)HashtableEntry<Symbol*, mtClass>::next();
   }
 
   PlaceholderEntry** next_addr() {
-    return (PlaceholderEntry**)HashtableEntry<Symbol*>::next_addr();
+    return (PlaceholderEntry**)HashtableEntry<Symbol*, mtClass>::next_addr();
   }
 
   // Test for equality
--- a/src/share/vm/classfile/resolutionErrors.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/resolutionErrors.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -67,7 +67,7 @@
 ResolutionErrorEntry* ResolutionErrorTable::new_entry(int hash, constantPoolOop pool,
                                                       int cp_index, Symbol* error)
 {
-  ResolutionErrorEntry* entry = (ResolutionErrorEntry*)Hashtable<constantPoolOop>::new_entry(hash, pool);
+  ResolutionErrorEntry* entry = (ResolutionErrorEntry*)Hashtable<constantPoolOop, mtClass>::new_entry(hash, pool);
   entry->set_cp_index(cp_index);
   NOT_PRODUCT(entry->set_error(NULL);)
   entry->set_error(error);
@@ -79,13 +79,13 @@
   // decrement error refcount
   assert(entry->error() != NULL, "error should be set");
   entry->error()->decrement_refcount();
-  Hashtable<constantPoolOop>::free_entry(entry);
+  Hashtable<constantPoolOop, mtClass>::free_entry(entry);
 }
 
 
 // create resolution error table
 ResolutionErrorTable::ResolutionErrorTable(int table_size)
-    : Hashtable<constantPoolOop>(table_size, sizeof(ResolutionErrorEntry)) {
+    : Hashtable<constantPoolOop, mtClass>(table_size, sizeof(ResolutionErrorEntry)) {
 }
 
 // GC support
--- a/src/share/vm/classfile/resolutionErrors.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/resolutionErrors.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -33,7 +33,7 @@
 // ResolutionError objects are used to record errors encountered during
 // constant pool resolution (JVMS 5.4.3).
 
-class ResolutionErrorTable : public Hashtable<constantPoolOop> {
+class ResolutionErrorTable : public Hashtable<constantPoolOop, mtClass> {
 
 public:
   ResolutionErrorTable(int table_size);
@@ -42,15 +42,16 @@
   void free_entry(ResolutionErrorEntry *entry);
 
   ResolutionErrorEntry* bucket(int i) {
-    return (ResolutionErrorEntry*)Hashtable<constantPoolOop>::bucket(i);
+    return (ResolutionErrorEntry*)Hashtable<constantPoolOop, mtClass>::bucket(i);
   }
 
   ResolutionErrorEntry** bucket_addr(int i) {
-    return (ResolutionErrorEntry**)Hashtable<constantPoolOop>::bucket_addr(i);
+    return (ResolutionErrorEntry**)Hashtable<constantPoolOop, mtClass>::bucket_addr(i);
   }
 
   void add_entry(int index, ResolutionErrorEntry* new_entry) {
-    Hashtable<constantPoolOop>::add_entry(index, (HashtableEntry<constantPoolOop>*)new_entry);
+    Hashtable<constantPoolOop, mtClass>::add_entry(index,
+      (HashtableEntry<constantPoolOop, mtClass>*)new_entry);
   }
 
   void add_entry(int index, unsigned int hash,
@@ -74,7 +75,7 @@
 };
 
 
-class ResolutionErrorEntry : public HashtableEntry<constantPoolOop> {
+class ResolutionErrorEntry : public HashtableEntry<constantPoolOop, mtClass> {
  private:
   int               _cp_index;
   Symbol*           _error;
@@ -90,11 +91,11 @@
   void               set_error(Symbol* e);
 
   ResolutionErrorEntry* next() const {
-    return (ResolutionErrorEntry*)HashtableEntry<constantPoolOop>::next();
+    return (ResolutionErrorEntry*)HashtableEntry<constantPoolOop, mtClass>::next();
   }
 
   ResolutionErrorEntry** next_addr() {
-    return (ResolutionErrorEntry**)HashtableEntry<constantPoolOop>::next_addr();
+    return (ResolutionErrorEntry**)HashtableEntry<constantPoolOop, mtClass>::next_addr();
   }
 
   // GC support
--- a/src/share/vm/classfile/symbolTable.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/symbolTable.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -23,6 +23,7 @@
  */
 
 #include "precompiled.hpp"
+#include "classfile/altHashing.hpp"
 #include "classfile/javaClasses.hpp"
 #include "classfile/symbolTable.hpp"
 #include "classfile/systemDictionary.hpp"
@@ -34,19 +35,18 @@
 #include "oops/oop.inline2.hpp"
 #include "runtime/mutexLocker.hpp"
 #include "utilities/hashtable.inline.hpp"
+#include "utilities/numberSeq.hpp"
 
 // --------------------------------------------------------------------------
 
 SymbolTable* SymbolTable::_the_table = NULL;
 // Static arena for symbols that are not deallocated
 Arena* SymbolTable::_arena = NULL;
+bool SymbolTable::_needs_rehashing = false;
 
 Symbol* SymbolTable::allocate_symbol(const u1* name, int len, bool c_heap, TRAPS) {
-  // Don't allow symbols to be created which cannot fit in a Symbol*.
-  if (len > Symbol::max_length()) {
-    THROW_MSG_0(vmSymbols::java_lang_InternalError(),
-                "name is too long to represent");
-  }
+  assert (len <= Symbol::max_length(), "should be checked by caller");
+
   Symbol* sym;
   // Allocate symbols in the C heap when dumping shared spaces in case there
   // are temporary symbols we can remove.
@@ -63,9 +63,9 @@
 void SymbolTable::initialize_symbols(int arena_alloc_size) {
   // Initialize the arena for global symbols, size passed in depends on CDS.
   if (arena_alloc_size == 0) {
-    _arena = new Arena();
+    _arena = new (mtSymbol) Arena();
   } else {
-    _arena = new Arena(arena_alloc_size);
+    _arena = new (mtSymbol) Arena(arena_alloc_size);
   }
 }
 
@@ -73,7 +73,7 @@
 void SymbolTable::symbols_do(SymbolClosure *cl) {
   const int n = the_table()->table_size();
   for (int i = 0; i < n; i++) {
-    for (HashtableEntry<Symbol*>* p = the_table()->bucket(i);
+    for (HashtableEntry<Symbol*, mtSymbol>* p = the_table()->bucket(i);
          p != NULL;
          p = p->next()) {
       cl->do_symbol(p->literal_addr());
@@ -91,9 +91,14 @@
   int total = 0;
   size_t memory_total = 0;
   for (int i = 0; i < the_table()->table_size(); ++i) {
-    for (HashtableEntry<Symbol*>** p = the_table()->bucket_addr(i); *p != NULL; ) {
-      HashtableEntry<Symbol*>* entry = *p;
-      if (entry->is_shared()) {
+    HashtableEntry<Symbol*, mtSymbol>** p = the_table()->bucket_addr(i);
+    HashtableEntry<Symbol*, mtSymbol>* entry = the_table()->bucket(i);
+    while (entry != NULL) {
+      // Shared entries are normally at the end of the bucket and if we run into
+      // a shared entry, then there is nothing more to remove. However, if we
+      // have rehashed the table, then the shared entries are no longer at the
+      // end of the bucket.
+      if (entry->is_shared() && !use_alternate_hashcode()) {
         break;
       }
       Symbol* s = entry->literal();
@@ -102,6 +107,7 @@
       assert(s != NULL, "just checking");
       // If reference count is zero, remove.
       if (s->refcount() == 0) {
+        assert(!entry->is_shared(), "shared entries should be kept live");
         delete s;
         removed++;
         *p = entry->next();
@@ -109,6 +115,8 @@
       } else {
         p = entry->next_addr();
       }
+      // get next entry
+      entry = (HashtableEntry<Symbol*, mtSymbol>*)HashtableEntry<Symbol*, mtSymbol>::make_ptr(*p);
     }
   }
   symbols_removed += removed;
@@ -121,12 +129,32 @@
   }
 }
 
+// Create a new table and using alternate hash code, populate the new table
+// with the existing strings.   Set flag to use the alternate hash code afterwards.
+void SymbolTable::rehash_table() {
+  assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
+  // This should never happen with -Xshare:dump but it might in testing mode.
+  if (DumpSharedSpaces) return;
+  // Create a new symbol table
+  SymbolTable* new_table = new SymbolTable();
+
+  the_table()->move_to(new_table);
+
+  // Delete the table and buckets (entries are reused in new table).
+  delete _the_table;
+  // Don't check if we need rehashing until the table gets unbalanced again.
+  // Then rehash with a new global seed.
+  _needs_rehashing = false;
+  _the_table = new_table;
+}
 
 // Lookup a symbol in a bucket.
 
 Symbol* SymbolTable::lookup(int index, const char* name,
                               int len, unsigned int hash) {
-  for (HashtableEntry<Symbol*>* e = bucket(index); e != NULL; e = e->next()) {
+  int count = 0;
+  for (HashtableEntry<Symbol*, mtSymbol>* e = bucket(index); e != NULL; e = e->next()) {
+    count++;  // count all entries in this bucket, not just ones with same hash
     if (e->hash() == hash) {
       Symbol* sym = e->literal();
       if (sym->equals(name, len)) {
@@ -136,9 +164,20 @@
       }
     }
   }
+  // If the bucket size is too deep check if this hash code is insufficient.
+  if (count >= BasicHashtable<mtSymbol>::rehash_count && !needs_rehashing()) {
+    _needs_rehashing = check_rehash_table(count);
+  }
   return NULL;
 }
 
+// Pick hashing algorithm.
+unsigned int SymbolTable::hash_symbol(const char* s, int len) {
+  return use_alternate_hashcode() ?
+           AltHashing::murmur3_32(seed(), (const jbyte*)s, len) :
+           java_lang_String::to_hash(s, len);
+}
+
 
 // We take care not to be blocking while holding the
 // SymbolTable_lock. Otherwise, the system might deadlock, since the
@@ -156,6 +195,9 @@
   // Found
   if (s != NULL) return s;
 
+  // Grab SymbolTable_lock first.
+  MutexLocker ml(SymbolTable_lock, THREAD);
+
   // Otherwise, add to symbol to table
   return the_table()->basic_add(index, (u1*)name, len, hashValue, true, CHECK_NULL);
 }
@@ -193,6 +235,9 @@
   // We can't include the code in No_Safepoint_Verifier because of the
   // ResourceMark.
 
+  // Grab SymbolTable_lock first.
+  MutexLocker ml(SymbolTable_lock, THREAD);
+
   return the_table()->basic_add(index, (u1*)buffer, len, hashValue, true, CHECK_NULL);
 }
 
@@ -212,7 +257,7 @@
   unsigned int hash = hash_symbol((char*)sym->bytes(), sym->utf8_length());
   int index = the_table()->hash_to_index(hash);
 
-  for (HashtableEntry<Symbol*>* e = the_table()->bucket(index); e != NULL; e = e->next()) {
+  for (HashtableEntry<Symbol*, mtSymbol>* e = the_table()->bucket(index); e != NULL; e = e->next()) {
     if (e->hash() == hash) {
       Symbol* literal_sym = e->literal();
       if (sym == literal_sym) {
@@ -261,6 +306,9 @@
                       int names_count,
                       const char** names, int* lengths, int* cp_indices,
                       unsigned int* hashValues, TRAPS) {
+  // Grab SymbolTable_lock first.
+  MutexLocker ml(SymbolTable_lock, THREAD);
+
   SymbolTable* table = the_table();
   bool added = table->basic_add(class_loader, cp, names_count, names, lengths,
                                 cp_indices, hashValues, CHECK);
@@ -281,18 +329,39 @@
   if (result != NULL) {
     return result;
   }
+  // Grab SymbolTable_lock first.
+  MutexLocker ml(SymbolTable_lock, THREAD);
+
   SymbolTable* table = the_table();
   int index = table->hash_to_index(hash);
   return table->basic_add(index, (u1*)name, (int)strlen(name), hash, false, THREAD);
 }
 
-Symbol* SymbolTable::basic_add(int index, u1 *name, int len,
-                               unsigned int hashValue, bool c_heap, TRAPS) {
+Symbol* SymbolTable::basic_add(int index_arg, u1 *name, int len,
+                               unsigned int hashValue_arg, bool c_heap, TRAPS) {
   assert(!Universe::heap()->is_in_reserved(name) || GC_locker::is_active(),
          "proposed name of symbol must be stable");
 
-  // Grab SymbolTable_lock first.
-  MutexLocker ml(SymbolTable_lock, THREAD);
+  // Don't allow symbols to be created which cannot fit in a Symbol*.
+  if (len > Symbol::max_length()) {
+    THROW_MSG_0(vmSymbols::java_lang_InternalError(),
+                "name is too long to represent");
+  }
+
+  // Cannot hit a safepoint in this function because the "this" pointer can move.
+  No_Safepoint_Verifier nsv;
+
+  // Check if the symbol table has been rehashed, if so, need to recalculate
+  // the hash value and index.
+  unsigned int hashValue;
+  int index;
+  if (use_alternate_hashcode()) {
+    hashValue = hash_symbol((const char*)name, len);
+    index = hash_to_index(hashValue);
+  } else {
+    hashValue = hashValue_arg;
+    index = index_arg;
+  }
 
   // Since look-up was done lock-free, we need to check if another
   // thread beat us in the race to insert the symbol.
@@ -307,7 +376,7 @@
   Symbol* sym = allocate_symbol(name, len, c_heap, CHECK_NULL);
   assert(sym->equals((char*)name, len), "symbol must be properly initialized");
 
-  HashtableEntry<Symbol*>* entry = new_entry(hashValue, sym);
+  HashtableEntry<Symbol*, mtSymbol>* entry = new_entry(hashValue, sym);
   add_entry(index, entry);
   return sym;
 }
@@ -328,14 +397,22 @@
     }
   }
 
-  // Hold SymbolTable_lock through the symbol creation
-  MutexLocker ml(SymbolTable_lock, THREAD);
+  // Cannot hit a safepoint in this function because the "this" pointer can move.
+  No_Safepoint_Verifier nsv;
 
   for (int i=0; i<names_count; i++) {
+    // Check if the symbol table has been rehashed, if so, need to recalculate
+    // the hash value.
+    unsigned int hashValue;
+    if (use_alternate_hashcode()) {
+      hashValue = hash_symbol(names[i], lengths[i]);
+    } else {
+      hashValue = hashValues[i];
+    }
     // Since look-up was done lock-free, we need to check if another
     // thread beat us in the race to insert the symbol.
-    int index = hash_to_index(hashValues[i]);
-    Symbol* test = lookup(index, names[i], lengths[i], hashValues[i]);
+    int index = hash_to_index(hashValue);
+    Symbol* test = lookup(index, names[i], lengths[i], hashValue);
     if (test != NULL) {
       // A race occurred and another thread introduced the symbol, this one
       // will be dropped and collected. Use test instead.
@@ -347,7 +424,7 @@
       bool c_heap = class_loader() != NULL;
       Symbol* sym = allocate_symbol((const u1*)names[i], lengths[i], c_heap, CHECK_(false));
       assert(sym->equals(names[i], lengths[i]), "symbol must be properly initialized");  // why wouldn't it be???
-      HashtableEntry<Symbol*>* entry = new_entry(hashValues[i], sym);
+      HashtableEntry<Symbol*, mtSymbol>* entry = new_entry(hashValue, sym);
       add_entry(index, entry);
       cp->symbol_at_put(cp_indices[i], sym);
     }
@@ -358,7 +435,7 @@
 
 void SymbolTable::verify() {
   for (int i = 0; i < the_table()->table_size(); ++i) {
-    HashtableEntry<Symbol*>* p = the_table()->bucket(i);
+    HashtableEntry<Symbol*, mtSymbol>* p = the_table()->bucket(i);
     for ( ; p != NULL; p = p->next()) {
       Symbol* s = (Symbol*)(p->literal());
       guarantee(s != NULL, "symbol is NULL");
@@ -370,6 +447,24 @@
   }
 }
 
+void SymbolTable::dump(outputStream* st) {
+  NumberSeq summary;
+  for (int i = 0; i < the_table()->table_size(); ++i) {
+    int count = 0;
+    for (HashtableEntry<Symbol*, mtSymbol>* e = the_table()->bucket(i);
+       e != NULL; e = e->next()) {
+      count++;
+    }
+    summary.add((double)count);
+  }
+  st->print_cr("SymbolTable statistics:");
+  st->print_cr("Number of buckets       : %7d", summary.num());
+  st->print_cr("Average bucket size     : %7.0f", summary.avg());
+  st->print_cr("Variance of bucket size : %7.0f", summary.variance());
+  st->print_cr("Std. dev. of bucket size: %7.0f", summary.sd());
+  st->print_cr("Maximum bucket size     : %7.0f", summary.maximum());
+}
+
 
 //---------------------------------------------------------------------------
 // Non-product code
@@ -393,7 +488,7 @@
   int memory_total = 0;
   int count = 0;
   for (i = 0; i < the_table()->table_size(); i++) {
-    HashtableEntry<Symbol*>* p = the_table()->bucket(i);
+    HashtableEntry<Symbol*, mtSymbol>* p = the_table()->bucket(i);
     for ( ; p != NULL; p = p->next()) {
       memory_total += p->literal()->object_size();
       count++;
@@ -454,21 +549,20 @@
 
 void SymbolTable::print() {
   for (int i = 0; i < the_table()->table_size(); ++i) {
-    HashtableEntry<Symbol*>** p = the_table()->bucket_addr(i);
-    HashtableEntry<Symbol*>* entry = the_table()->bucket(i);
+    HashtableEntry<Symbol*, mtSymbol>** p = the_table()->bucket_addr(i);
+    HashtableEntry<Symbol*, mtSymbol>* entry = the_table()->bucket(i);
     if (entry != NULL) {
       while (entry != NULL) {
         tty->print(PTR_FORMAT " ", entry->literal());
         entry->literal()->print();
         tty->print(" %d", entry->literal()->refcount());
         p = entry->next_addr();
-        entry = (HashtableEntry<Symbol*>*)HashtableEntry<Symbol*>::make_ptr(*p);
+        entry = (HashtableEntry<Symbol*, mtSymbol>*)HashtableEntry<Symbol*, mtSymbol>::make_ptr(*p);
       }
       tty->cr();
     }
   }
 }
-
 #endif // PRODUCT
 
 // --------------------------------------------------------------------------
@@ -514,21 +608,87 @@
 // --------------------------------------------------------------------------
 StringTable* StringTable::_the_table = NULL;
 
+bool StringTable::_needs_rehashing = false;
+
+// Pick hashing algorithm
+unsigned int StringTable::hash_string(const jchar* s, int len) {
+  return use_alternate_hashcode() ? AltHashing::murmur3_32(seed(), s, len) :
+                                    java_lang_String::to_hash(s, len);
+}
+
 oop StringTable::lookup(int index, jchar* name,
                         int len, unsigned int hash) {
-  for (HashtableEntry<oop>* l = bucket(index); l != NULL; l = l->next()) {
+  int count = 0;
+  for (HashtableEntry<oop, mtSymbol>* l = bucket(index); l != NULL; l = l->next()) {
+    count++;
     if (l->hash() == hash) {
       if (java_lang_String::equals(l->literal(), name, len)) {
         return l->literal();
       }
     }
   }
+  // If the bucket size is too deep check if this hash code is insufficient.
+  if (count >= BasicHashtable<mtSymbol>::rehash_count && !needs_rehashing()) {
+    _needs_rehashing = check_rehash_table(count);
+  }
   return NULL;
 }
 
 
-oop StringTable::basic_add(int index, Handle string_or_null, jchar* name,
-                           int len, unsigned int hashValue, TRAPS) {
+oop StringTable::basic_add(int index_arg, Handle string, jchar* name,
+                           int len, unsigned int hashValue_arg, TRAPS) {
+
+  assert(java_lang_String::equals(string(), name, len),
+         "string must be properly initialized");
+  // Cannot hit a safepoint in this function because the "this" pointer can move.
+  No_Safepoint_Verifier nsv;
+
+  // Check if the symbol table has been rehashed, if so, need to recalculate
+  // the hash value and index before second lookup.
+  unsigned int hashValue;
+  int index;
+  if (use_alternate_hashcode()) {
+    hashValue = hash_string(name, len);
+    index = hash_to_index(hashValue);
+  } else {
+    hashValue = hashValue_arg;
+    index = index_arg;
+  }
+
+  // Since look-up was done lock-free, we need to check if another
+  // thread beat us in the race to insert the symbol.
+
+  oop test = lookup(index, name, len, hashValue); // calls lookup(u1*, int)
+  if (test != NULL) {
+    // Entry already added
+    return test;
+  }
+
+  HashtableEntry<oop, mtSymbol>* entry = new_entry(hashValue, string());
+  add_entry(index, entry);
+  return string();
+}
+
+
+oop StringTable::lookup(Symbol* symbol) {
+  ResourceMark rm;
+  int length;
+  jchar* chars = symbol->as_unicode(length);
+  unsigned int hashValue = hash_string(chars, length);
+  int index = the_table()->hash_to_index(hashValue);
+  return the_table()->lookup(index, chars, length, hashValue);
+}
+
+
+oop StringTable::intern(Handle string_or_null, jchar* name,
+                        int len, TRAPS) {
+  unsigned int hashValue = hash_string(name, len);
+  int index = the_table()->hash_to_index(hashValue);
+  oop found_string = the_table()->lookup(index, name, len, hashValue);
+
+  // Found
+  if (found_string != NULL) return found_string;
+
   debug_only(StableMemoryChecker smc(name, len * sizeof(name[0])));
   assert(!Universe::heap()->is_in_reserved(name) || GC_locker::is_active(),
          "proposed name of symbol must be stable");
@@ -541,48 +701,12 @@
     string = java_lang_String::create_tenured_from_unicode(name, len, CHECK_NULL);
   }
 
-  // Allocation must be done before grapping the SymbolTable_lock lock
+  // Grab the StringTable_lock before getting the_table() because it could
+  // change at safepoint.
   MutexLocker ml(StringTable_lock, THREAD);
 
-  assert(java_lang_String::equals(string(), name, len),
-         "string must be properly initialized");
-
-  // Since look-up was done lock-free, we need to check if another
-  // thread beat us in the race to insert the symbol.
-
-  oop test = lookup(index, name, len, hashValue); // calls lookup(u1*, int)
-  if (test != NULL) {
-    // Entry already added
-    return test;
-  }
-
-  HashtableEntry<oop>* entry = new_entry(hashValue, string());
-  add_entry(index, entry);
-  return string();
-}
-
-
-oop StringTable::lookup(Symbol* symbol) {
-  ResourceMark rm;
-  int length;
-  jchar* chars = symbol->as_unicode(length);
-  unsigned int hashValue = java_lang_String::hash_string(chars, length);
-  int index = the_table()->hash_to_index(hashValue);
-  return the_table()->lookup(index, chars, length, hashValue);
-}
-
-
-oop StringTable::intern(Handle string_or_null, jchar* name,
-                        int len, TRAPS) {
-  unsigned int hashValue = java_lang_String::hash_string(name, len);
-  int index = the_table()->hash_to_index(hashValue);
-  oop string = the_table()->lookup(index, name, len, hashValue);
-
-  // Found
-  if (string != NULL) return string;
-
   // Otherwise, add to symbol to table
-  return the_table()->basic_add(index, string_or_null, name, len,
+  return the_table()->basic_add(index, string, name, len,
                                 hashValue, CHECK_NULL);
 }
 
@@ -625,26 +749,32 @@
   // entries at a safepoint.
   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
   for (int i = 0; i < the_table()->table_size(); ++i) {
-    for (HashtableEntry<oop>** p = the_table()->bucket_addr(i); *p != NULL; ) {
-      HashtableEntry<oop>* entry = *p;
-      if (entry->is_shared()) {
+    HashtableEntry<oop, mtSymbol>** p = the_table()->bucket_addr(i);
+    HashtableEntry<oop, mtSymbol>* entry = the_table()->bucket(i);
+    while (entry != NULL) {
+      // Shared entries are normally at the end of the bucket and if we run into
+      // a shared entry, then there is nothing more to remove. However, if we
+      // have rehashed the table, then the shared entries are no longer at the
+      // end of the bucket.
+      if (entry->is_shared() && !use_alternate_hashcode()) {
         break;
       }
       assert(entry->literal() != NULL, "just checking");
-      if (is_alive->do_object_b(entry->literal())) {
+      if (entry->is_shared() || is_alive->do_object_b(entry->literal())) {
         p = entry->next_addr();
       } else {
         *p = entry->next();
         the_table()->free_entry(entry);
       }
+      entry = (HashtableEntry<oop, mtSymbol>*)HashtableEntry<oop, mtSymbol>::make_ptr(*p);
     }
   }
 }
 
 void StringTable::oops_do(OopClosure* f) {
   for (int i = 0; i < the_table()->table_size(); ++i) {
-    HashtableEntry<oop>** p = the_table()->bucket_addr(i);
-    HashtableEntry<oop>* entry = the_table()->bucket(i);
+    HashtableEntry<oop, mtSymbol>** p = the_table()->bucket_addr(i);
+    HashtableEntry<oop, mtSymbol>* entry = the_table()->bucket(i);
     while (entry != NULL) {
       f->do_oop((oop*)entry->literal_addr());
 
@@ -656,14 +786,14 @@
       } else {
         p = entry->next_addr();
       }
-      entry = (HashtableEntry<oop>*)HashtableEntry<oop>::make_ptr(*p);
+      entry = (HashtableEntry<oop, mtSymbol>*)HashtableEntry<oop, mtSymbol>::make_ptr(*p);
     }
   }
 }
 
 void StringTable::verify() {
   for (int i = 0; i < the_table()->table_size(); ++i) {
-    HashtableEntry<oop>* p = the_table()->bucket(i);
+    HashtableEntry<oop, mtSymbol>* p = the_table()->bucket(i);
     for ( ; p != NULL; p = p->next()) {
       oop s = p->literal();
       guarantee(s != NULL, "interned string is NULL");
@@ -675,3 +805,41 @@
     }
   }
 }
+
+void StringTable::dump(outputStream* st) {
+  NumberSeq summary;
+  for (int i = 0; i < the_table()->table_size(); ++i) {
+    HashtableEntry<oop, mtSymbol>* p = the_table()->bucket(i);
+    int count = 0;
+    for ( ; p != NULL; p = p->next()) {
+      count++;
+    }
+    summary.add((double)count);
+  }
+  st->print_cr("StringTable statistics:");
+  st->print_cr("Number of buckets       : %7d", summary.num());
+  st->print_cr("Average bucket size     : %7.0f", summary.avg());
+  st->print_cr("Variance of bucket size : %7.0f", summary.variance());
+  st->print_cr("Std. dev. of bucket size: %7.0f", summary.sd());
+  st->print_cr("Maximum bucket size     : %7.0f", summary.maximum());
+}
+
+
+// Create a new table and using alternate hash code, populate the new table
+// with the existing strings.   Set flag to use the alternate hash code afterwards.
+void StringTable::rehash_table() {
+  assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
+  // This should never happen with -Xshare:dump but it might in testing mode.
+  if (DumpSharedSpaces) return;
+  StringTable* new_table = new StringTable();
+
+  // Rehash the table
+  the_table()->move_to(new_table);
+
+  // Delete the table and buckets (entries are reused in new table).
+  delete _the_table;
+  // Don't check if we need rehashing until the table gets unbalanced again.
+  // Then rehash with a new global seed.
+  _needs_rehashing = false;
+  _the_table = new_table;
+}
--- a/src/share/vm/classfile/symbolTable.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/symbolTable.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -40,6 +40,7 @@
 //  - symbolTableEntrys are allocated in blocks to reduce the space overhead.
 
 class BoolObjectClosure;
+class outputStream;
 
 
 // Class to hold a newly created or referenced Symbol* temporarily in scope.
@@ -70,7 +71,7 @@
   operator Symbol*()                             { return _temp; }
 };
 
-class SymbolTable : public Hashtable<Symbol*> {
+class SymbolTable : public Hashtable<Symbol*, mtSymbol> {
   friend class VMStructs;
   friend class ClassFileParser;
 
@@ -78,6 +79,9 @@
   // The symbol table
   static SymbolTable* _the_table;
 
+  // Set if one bucket is out of balance due to hash algorithm deficiency
+  static bool _needs_rehashing;
+
   // For statistics
   static int symbols_removed;
   static int symbols_counted;
@@ -108,10 +112,10 @@
   Symbol* lookup(int index, const char* name, int len, unsigned int hash);
 
   SymbolTable()
-    : Hashtable<Symbol*>(symbol_table_size, sizeof (HashtableEntry<Symbol*>)) {}
+    : Hashtable<Symbol*, mtSymbol>(symbol_table_size, sizeof (HashtableEntry<Symbol*, mtSymbol>)) {}
 
-  SymbolTable(HashtableBucket* t, int number_of_entries)
-    : Hashtable<Symbol*>(symbol_table_size, sizeof (HashtableEntry<Symbol*>), t,
+  SymbolTable(HashtableBucket<mtSymbol>* t, int number_of_entries)
+    : Hashtable<Symbol*, mtSymbol>(symbol_table_size, sizeof (HashtableEntry<Symbol*, mtSymbol>), t,
                 number_of_entries) {}
 
   // Arena for permanent symbols (null class loader) that are never unloaded
@@ -135,10 +139,10 @@
     initialize_symbols(symbol_alloc_arena_size);
   }
 
-  static void create_table(HashtableBucket* t, int length,
+  static void create_table(HashtableBucket<mtSymbol>* t, int length,
                            int number_of_entries) {
     assert(_the_table == NULL, "One symbol table allowed.");
-    assert(length == symbol_table_size * sizeof(HashtableBucket),
+    assert(length == symbol_table_size * sizeof(HashtableBucket<mtSymbol>),
            "bad shared symbol size.");
     _the_table = new SymbolTable(t, number_of_entries);
     // if CDS give symbol table a default arena size since most symbols
@@ -146,6 +150,8 @@
     initialize_symbols();
   }
 
+  static unsigned int hash_symbol(const char* s, int len);
+
   static Symbol* lookup(const char* name, int len, TRAPS);
   // lookup only, won't add. Also calculate hash.
   static Symbol* lookup_only(const char* name, int len, unsigned int& hash);
@@ -208,39 +214,46 @@
 
   // Debugging
   static void verify();
+  static void dump(outputStream* st);
 
   // Sharing
   static void copy_buckets(char** top, char*end) {
-    the_table()->Hashtable<Symbol*>::copy_buckets(top, end);
+    the_table()->Hashtable<Symbol*, mtSymbol>::copy_buckets(top, end);
   }
   static void copy_table(char** top, char*end) {
-    the_table()->Hashtable<Symbol*>::copy_table(top, end);
+    the_table()->Hashtable<Symbol*, mtSymbol>::copy_table(top, end);
   }
   static void reverse(void* boundary = NULL) {
-    the_table()->Hashtable<Symbol*>::reverse(boundary);
+    the_table()->Hashtable<Symbol*, mtSymbol>::reverse(boundary);
   }
+
+  // Rehash the symbol table if it gets out of balance
+  static void rehash_table();
+  static bool needs_rehashing()         { return _needs_rehashing; }
 };
 
-class StringTable : public Hashtable<oop> {
+class StringTable : public Hashtable<oop, mtSymbol> {
   friend class VMStructs;
 
 private:
   // The string table
   static StringTable* _the_table;
 
+  // Set if one bucket is out of balance due to hash algorithm deficiency
+  static bool _needs_rehashing;
+
   static oop intern(Handle string_or_null, jchar* chars, int length, TRAPS);
   oop basic_add(int index, Handle string_or_null, jchar* name, int len,
                 unsigned int hashValue, TRAPS);
 
   oop lookup(int index, jchar* chars, int length, unsigned int hashValue);
 
-  StringTable() : Hashtable<oop>((int)StringTableSize,
-                                 sizeof (HashtableEntry<oop>)) {}
+  StringTable() : Hashtable<oop, mtSymbol>((int)StringTableSize,
+                              sizeof (HashtableEntry<oop, mtSymbol>)) {}
 
-  StringTable(HashtableBucket* t, int number_of_entries)
-    : Hashtable<oop>((int)StringTableSize, sizeof (HashtableEntry<oop>), t,
+  StringTable(HashtableBucket<mtSymbol>* t, int number_of_entries)
+    : Hashtable<oop, mtSymbol>((int)StringTableSize, sizeof (HashtableEntry<oop, mtSymbol>), t,
                      number_of_entries) {}
-
 public:
   // The string table
   static StringTable* the_table() { return _the_table; }
@@ -250,10 +263,10 @@
     _the_table = new StringTable();
   }
 
-  static void create_table(HashtableBucket* t, int length,
+  static void create_table(HashtableBucket<mtSymbol>* t, int length,
                            int number_of_entries) {
     assert(_the_table == NULL, "One string table allowed.");
-    assert((size_t)length == StringTableSize * sizeof(HashtableBucket),
+    assert((size_t)length == StringTableSize * sizeof(HashtableBucket<mtSymbol>),
            "bad shared string size.");
     _the_table = new StringTable(t, number_of_entries);
   }
@@ -265,6 +278,14 @@
   // Invoke "f->do_oop" on the locations of all oops in the table.
   static void oops_do(OopClosure* f);
 
+  // Hashing algorithm, used as the hash value used by the
+  //     StringTable for bucket selection and comparison (stored in the
+  //     HashtableEntry structures).  This is used in the String.intern() method.
+  static unsigned int hash_string(const jchar* s, int len);
+
+  // Internal test.
+  static void test_alt_hash() PRODUCT_RETURN;
+
   // Probing
   static oop lookup(Symbol* symbol);
 
@@ -275,17 +296,21 @@
 
   // Debugging
   static void verify();
+  static void dump(outputStream* st);
 
   // Sharing
   static void copy_buckets(char** top, char*end) {
-    the_table()->Hashtable<oop>::copy_buckets(top, end);
+    the_table()->Hashtable<oop, mtSymbol>::copy_buckets(top, end);
   }
   static void copy_table(char** top, char*end) {
-    the_table()->Hashtable<oop>::copy_table(top, end);
+    the_table()->Hashtable<oop, mtSymbol>::copy_table(top, end);
   }
   static void reverse() {
-    the_table()->Hashtable<oop>::reverse();
+    the_table()->Hashtable<oop, mtSymbol>::reverse();
   }
+
+  // Rehash the symbol table if it gets out of balance
+  static void rehash_table();
+  static bool needs_rehashing() { return _needs_rehashing; }
 };
-
 #endif // SHARE_VM_CLASSFILE_SYMBOLTABLE_HPP
--- a/src/share/vm/classfile/systemDictionary.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/systemDictionary.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1168,9 +1168,9 @@
 }
 
 
-void SystemDictionary::set_shared_dictionary(HashtableBucket* t, int length,
+void SystemDictionary::set_shared_dictionary(HashtableBucket<mtClass>* t, int length,
                                              int number_of_entries) {
-  assert(length == _nof_buckets * sizeof(HashtableBucket),
+  assert(length == _nof_buckets * sizeof(HashtableBucket<mtClass>),
          "bad shared dictionary size.");
   _shared_dictionary = new Dictionary(_nof_buckets, t, number_of_entries);
 }
@@ -2770,7 +2770,6 @@
     nmethods++;
     method_size += m->size();
     // class loader uses same objArray for empty vectors, so don't count these
-    if (m->exception_table()->length() != 0)   method_size += m->exception_table()->size();
     if (m->has_stackmap_table()) {
       method_size += m->stackmap_data()->size();
     }
--- a/src/share/vm/classfile/systemDictionary.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/systemDictionary.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -32,6 +32,7 @@
 #include "runtime/java.hpp"
 #include "runtime/reflectionUtils.hpp"
 #include "utilities/hashtable.hpp"
+#include "utilities/hashtable.inline.hpp"
 
 // The system dictionary stores all loaded classes and maps:
 //
@@ -72,7 +73,7 @@
 class Dictionary;
 class PlaceholderTable;
 class LoaderConstraintTable;
-class HashtableBucket;
+template <MEMFLAGS F> class HashtableBucket;
 class ResolutionErrorTable;
 class SymbolPropertyTable;
 
@@ -363,7 +364,7 @@
   static void copy_buckets(char** top, char* end);
   static void copy_table(char** top, char* end);
   static void reverse();
-  static void set_shared_dictionary(HashtableBucket* t, int length,
+  static void set_shared_dictionary(HashtableBucket<mtClass>* t, int length,
                                     int number_of_entries);
   // Printing
   static void print()                   PRODUCT_RETURN;
--- a/src/share/vm/classfile/verifier.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/verifier.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -1368,47 +1368,48 @@
 }
 
 void ClassVerifier::verify_exception_handler_table(u4 code_length, char* code_data, int& min, int& max, TRAPS) {
-  typeArrayHandle exhandlers (THREAD, _method->exception_table());
+  ExceptionTable exhandlers(_method());
+  int exlength = exhandlers.length();
   constantPoolHandle cp (THREAD, _method->constants());
 
-  if (exhandlers() != NULL) {
-    for(int i = 0; i < exhandlers->length();) {
-      u2 start_pc = exhandlers->int_at(i++);
-      u2 end_pc = exhandlers->int_at(i++);
-      u2 handler_pc = exhandlers->int_at(i++);
-      if (start_pc >= code_length || code_data[start_pc] == 0) {
-        class_format_error("Illegal exception table start_pc %d", start_pc);
+  for(int i = 0; i < exlength; i++) {
+    //reacquire the table in case a GC happened
+    ExceptionTable exhandlers(_method());
+    u2 start_pc = exhandlers.start_pc(i);
+    u2 end_pc = exhandlers.end_pc(i);
+    u2 handler_pc = exhandlers.handler_pc(i);
+    if (start_pc >= code_length || code_data[start_pc] == 0) {
+      class_format_error("Illegal exception table start_pc %d", start_pc);
+      return;
+    }
+    if (end_pc != code_length) {   // special case: end_pc == code_length
+      if (end_pc > code_length || code_data[end_pc] == 0) {
+        class_format_error("Illegal exception table end_pc %d", end_pc);
         return;
       }
-      if (end_pc != code_length) {   // special case: end_pc == code_length
-        if (end_pc > code_length || code_data[end_pc] == 0) {
-          class_format_error("Illegal exception table end_pc %d", end_pc);
-          return;
-        }
-      }
-      if (handler_pc >= code_length || code_data[handler_pc] == 0) {
-        class_format_error("Illegal exception table handler_pc %d", handler_pc);
+    }
+    if (handler_pc >= code_length || code_data[handler_pc] == 0) {
+      class_format_error("Illegal exception table handler_pc %d", handler_pc);
+      return;
+    }
+    int catch_type_index = exhandlers.catch_type_index(i);
+    if (catch_type_index != 0) {
+      VerificationType catch_type = cp_index_to_type(
+        catch_type_index, cp, CHECK_VERIFY(this));
+      VerificationType throwable =
+        VerificationType::reference_type(vmSymbols::java_lang_Throwable());
+      bool is_subclass = throwable.is_assignable_from(
+        catch_type, this, CHECK_VERIFY(this));
+      if (!is_subclass) {
+        // 4286534: should throw VerifyError according to recent spec change
+        verify_error(
+          "Catch type is not a subclass of Throwable in handler %d",
+          handler_pc);
         return;
       }
-      int catch_type_index = exhandlers->int_at(i++);
-      if (catch_type_index != 0) {
-        VerificationType catch_type = cp_index_to_type(
-          catch_type_index, cp, CHECK_VERIFY(this));
-        VerificationType throwable =
-          VerificationType::reference_type(vmSymbols::java_lang_Throwable());
-        bool is_subclass = throwable.is_assignable_from(
-          catch_type, this, CHECK_VERIFY(this));
-        if (!is_subclass) {
-          // 4286534: should throw VerifyError according to recent spec change
-          verify_error(
-            "Catch type is not a subclass of Throwable in handler %d",
-            handler_pc);
-          return;
-        }
-      }
-      if (start_pc < min) min = start_pc;
-      if (end_pc > max) max = end_pc;
     }
+    if (start_pc < min) min = start_pc;
+    if (end_pc > max) max = end_pc;
   }
 }
 
@@ -1474,35 +1475,36 @@
 void ClassVerifier::verify_exception_handler_targets(u2 bci, bool this_uninit, StackMapFrame* current_frame,
                                                      StackMapTable* stackmap_table, TRAPS) {
   constantPoolHandle cp (THREAD, _method->constants());
-  typeArrayHandle exhandlers (THREAD, _method->exception_table());
-  if (exhandlers() != NULL) {
-    for(int i = 0; i < exhandlers->length();) {
-      u2 start_pc = exhandlers->int_at(i++);
-      u2 end_pc = exhandlers->int_at(i++);
-      u2 handler_pc = exhandlers->int_at(i++);
-      int catch_type_index = exhandlers->int_at(i++);
-      if(bci >= start_pc && bci < end_pc) {
-        u1 flags = current_frame->flags();
-        if (this_uninit) {  flags |= FLAG_THIS_UNINIT; }
-        StackMapFrame* new_frame = current_frame->frame_in_exception_handler(flags);
-        if (catch_type_index != 0) {
-          // We know that this index refers to a subclass of Throwable
-          VerificationType catch_type = cp_index_to_type(
-            catch_type_index, cp, CHECK_VERIFY(this));
-          new_frame->push_stack(catch_type, CHECK_VERIFY(this));
-        } else {
-          VerificationType throwable =
-            VerificationType::reference_type(vmSymbols::java_lang_Throwable());
-          new_frame->push_stack(throwable, CHECK_VERIFY(this));
-        }
-        bool match = stackmap_table->match_stackmap(
-          new_frame, handler_pc, true, false, CHECK_VERIFY(this));
-        if (!match) {
-          verify_error(bci,
-            "Stack map does not match the one at exception handler %d",
-            handler_pc);
-          return;
-        }
+  ExceptionTable exhandlers(_method());
+  int exlength = exhandlers.length();
+  for(int i = 0; i < exlength; i++) {
+    //reacquire the table in case a GC happened
+    ExceptionTable exhandlers(_method());
+    u2 start_pc = exhandlers.start_pc(i);
+    u2 end_pc = exhandlers.end_pc(i);
+    u2 handler_pc = exhandlers.handler_pc(i);
+    int catch_type_index = exhandlers.catch_type_index(i);
+    if(bci >= start_pc && bci < end_pc) {
+      u1 flags = current_frame->flags();
+      if (this_uninit) {  flags |= FLAG_THIS_UNINIT; }
+      StackMapFrame* new_frame = current_frame->frame_in_exception_handler(flags);
+      if (catch_type_index != 0) {
+        // We know that this index refers to a subclass of Throwable
+        VerificationType catch_type = cp_index_to_type(
+          catch_type_index, cp, CHECK_VERIFY(this));
+        new_frame->push_stack(catch_type, CHECK_VERIFY(this));
+      } else {
+        VerificationType throwable =
+          VerificationType::reference_type(vmSymbols::java_lang_Throwable());
+        new_frame->push_stack(throwable, CHECK_VERIFY(this));
+      }
+      bool match = stackmap_table->match_stackmap(
+        new_frame, handler_pc, true, false, CHECK_VERIFY(this));
+      if (!match) {
+        verify_error(bci,
+          "Stack map does not match the one at exception handler %d",
+          handler_pc);
+        return;
       }
     }
   }
--- a/src/share/vm/classfile/vmSymbols.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/classfile/vmSymbols.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -111,6 +111,10 @@
   template(getBootClassPathEntryForClass_name,        "getBootClassPathEntryForClass")            \
   template(sun_misc_PostVMInitHook,                   "sun/misc/PostVMInitHook")                  \
                                                                                                   \
+  /* Java runtime version access */                                                               \
+  template(sun_misc_Version,                          "sun/misc/Version")                         \
+  template(java_runtime_name_name,                    "java_runtime_name")                        \
+                                                                                                  \
   /* class file format tags */                                                                    \
   template(tag_source_file,                           "SourceFile")                               \
   template(tag_inner_classes,                         "InnerClasses")                             \
@@ -253,6 +257,7 @@
   template(java_lang_invoke_BoundMethodHandle,        "java/lang/invoke/BoundMethodHandle")       \
   template(java_lang_invoke_DirectMethodHandle,       "java/lang/invoke/DirectMethodHandle")      \
   template(java_lang_invoke_CountingMethodHandle,     "java/lang/invoke/CountingMethodHandle")    \
+  template(java_lang_invoke_ForceInline_signature,    "Ljava/lang/invoke/ForceInline;")           \
   /* internal up-calls made only by the JVM, via class sun.invoke.MethodHandleNatives: */         \
   template(findMethodHandleType_name,                 "findMethodHandleType")                     \
   template(findMethodHandleType_signature,       "(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;") \
--- a/src/share/vm/code/codeBlob.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/code/codeBlob.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -144,7 +144,7 @@
   // chunk of memory, its your job to free it.
   if (p != NULL) {
     // We need to allocate a chunk big enough to hold the OopMapSet and all of its OopMaps
-    _oop_maps = (OopMapSet* )NEW_C_HEAP_ARRAY(unsigned char, p->heap_size());
+    _oop_maps = (OopMapSet* )NEW_C_HEAP_ARRAY(unsigned char, p->heap_size(), mtCode);
     p->copy_to((address)_oop_maps);
   } else {
     _oop_maps = NULL;
@@ -180,7 +180,7 @@
 
 void CodeBlob::flush() {
   if (_oop_maps) {
-    FREE_C_HEAP_ARRAY(unsigned char, _oop_maps);
+    FREE_C_HEAP_ARRAY(unsigned char, _oop_maps, mtCode);
     _oop_maps = NULL;
   }
   _comments.free();
--- a/src/share/vm/code/codeCache.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/code/codeCache.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -856,7 +856,7 @@
 
   int bucketSize = 512;
   int bucketLimit = maxCodeSize / bucketSize + 1;
-  int *buckets = NEW_C_HEAP_ARRAY(int, bucketLimit);
+  int *buckets = NEW_C_HEAP_ARRAY(int, bucketLimit, mtCode);
   memset(buckets,0,sizeof(int) * bucketLimit);
 
   for (cb = first(); cb != NULL; cb = next(cb)) {
@@ -893,7 +893,7 @@
     }
   }
 
-  FREE_C_HEAP_ARRAY(int, buckets);
+  FREE_C_HEAP_ARRAY(int, buckets, mtCode);
 }
 
 void CodeCache::print() {
--- a/src/share/vm/code/codeCache.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/code/codeCache.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -88,6 +88,9 @@
   // Lookup that does not fail if you lookup a zombie method (if you call this, be sure to know
   // what you are doing)
   static CodeBlob* find_blob_unsafe(void* start) {
+    // NMT can walk the stack before code cache is created
+    if (_heap == NULL) return NULL;
+
     CodeBlob* result = (CodeBlob*)_heap->find_start(start);
     // this assert is too strong because the heap code will return the
     // heapblock containing start. That block can often be larger than
--- a/src/share/vm/code/nmethod.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/code/nmethod.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -31,7 +31,7 @@
 // This class is used internally by nmethods, to cache
 // exception/pc/handler information.
 
-class ExceptionCache : public CHeapObj {
+class ExceptionCache : public CHeapObj<mtCode> {
   friend class VMStructs;
  private:
   enum { cache_size = 16 };
--- a/src/share/vm/code/stubs.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/code/stubs.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -101,7 +101,7 @@
 // of the concrete stub (see also macro below). There's exactly
 // one stub interface instance required per stub queue.
 
-class StubInterface: public CHeapObj {
+class StubInterface: public CHeapObj<mtCode> {
  public:
   // Initialization/finalization
   virtual void    initialize(Stub* self, int size)         = 0; // called after creation (called twice if allocated via (request, commit))
@@ -152,7 +152,7 @@
 // A StubQueue maintains a queue of stubs.
 // Note: All sizes (spaces) are given in bytes.
 
-class StubQueue: public CHeapObj {
+class StubQueue: public CHeapObj<mtCode> {
   friend class VMStructs;
  private:
   StubInterface* _stub_interface;                // the interface prototype
--- a/src/share/vm/code/vmreg.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/code/vmreg.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -27,7 +27,7 @@
 #include "code/vmreg.hpp"
 
 // First VMReg value that could refer to a stack slot
-VMReg VMRegImpl::stack0 = (VMReg)(intptr_t)((ConcreteRegisterImpl::number_of_registers + 1) & ~1);
+VMReg VMRegImpl::stack0 = (VMReg)(intptr_t)((ConcreteRegisterImpl::number_of_registers + 7) & ~7);
 
 // VMRegs are 4 bytes wide on all platforms
 const int VMRegImpl::stack_slot_size = 4;
--- a/src/share/vm/code/vmreg.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/code/vmreg.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -131,6 +131,10 @@
     assert((is_reg() && value() < stack0->value() - 1) || is_stack(), "must be");
     return (VMReg)(intptr_t)(value() + 1);
   }
+  VMReg next(int i) {
+    assert((is_reg() && value() < stack0->value() - i) || is_stack(), "must be");
+    return (VMReg)(intptr_t)(value() + i);
+  }
   VMReg prev() {
     assert((is_stack() && value() > stack0->value()) || (is_reg() && value() != 0), "must be");
     return (VMReg)(intptr_t)(value() - 1);
--- a/src/share/vm/compiler/abstractCompiler.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/compiler/abstractCompiler.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -29,7 +29,7 @@
 
 typedef void (*initializer)(void);
 
-class AbstractCompiler : public CHeapObj {
+class AbstractCompiler : public CHeapObj<mtCompiler> {
  private:
   bool _is_initialized; // Mark whether compiler object is initialized
 
--- a/src/share/vm/compiler/compileBroker.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/compiler/compileBroker.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -951,7 +951,7 @@
   int compiler_count = c1_compiler_count + c2_compiler_count;
 
   _method_threads =
-    new (ResourceObj::C_HEAP) GrowableArray<CompilerThread*>(compiler_count, true);
+    new (ResourceObj::C_HEAP, mtCompiler) GrowableArray<CompilerThread*>(compiler_count, true);
 
   char name_buffer[256];
   for (int i = 0; i < c2_compiler_count; i++) {
@@ -1627,7 +1627,7 @@
       }
       fp = fopen(fileBuf, "at");
       if (fp != NULL) {
-        file = NEW_C_HEAP_ARRAY(char, strlen(fileBuf)+1);
+        file = NEW_C_HEAP_ARRAY(char, strlen(fileBuf)+1, mtCompiler);
         strcpy(file, fileBuf);
         break;
       }
@@ -1637,7 +1637,7 @@
     } else {
       if (LogCompilation && Verbose)
         tty->print_cr("Opening compilation log %s", file);
-      CompileLog* log = new(ResourceObj::C_HEAP) CompileLog(file, fp, thread_id);
+      CompileLog* log = new(ResourceObj::C_HEAP, mtCompiler) CompileLog(file, fp, thread_id);
       thread->init_log(log);
 
       if (xtty != NULL) {
--- a/src/share/vm/compiler/compileBroker.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/compiler/compileBroker.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -36,7 +36,7 @@
 //
 // An entry in the compile queue.  It represents a pending or current
 // compilation.
-class CompileTask : public CHeapObj {
+class CompileTask : public CHeapObj<mtCompiler> {
   friend class VMStructs;
 
  private:
@@ -131,7 +131,7 @@
 //
 // Per Compiler Performance Counters.
 //
-class CompilerCounters : public CHeapObj {
+class CompilerCounters : public CHeapObj<mtCompiler> {
 
   public:
     enum {
@@ -175,7 +175,7 @@
 // CompileQueue
 //
 // A list of CompileTasks.
-class CompileQueue : public CHeapObj {
+class CompileQueue : public CHeapObj<mtCompiler> {
  private:
   const char* _name;
   Monitor*    _lock;
--- a/src/share/vm/compiler/compileLog.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/compiler/compileLog.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -37,14 +37,14 @@
 CompileLog::CompileLog(const char* file, FILE* fp, intx thread_id)
   : _context(_context_buffer, sizeof(_context_buffer))
 {
-  initialize(new(ResourceObj::C_HEAP) fileStream(fp));
+  initialize(new(ResourceObj::C_HEAP, mtCompiler) fileStream(fp));
   _file = file;
   _file_end = 0;
   _thread_id = thread_id;
 
   _identities_limit = 0;
   _identities_capacity = 400;
-  _identities = NEW_C_HEAP_ARRAY(char, _identities_capacity);
+  _identities = NEW_C_HEAP_ARRAY(char, _identities_capacity, mtCompiler);
 
   // link into the global list
   { MutexLocker locker(CompileTaskAlloc_lock);
@@ -56,7 +56,7 @@
 CompileLog::~CompileLog() {
   delete _out;
   _out = NULL;
-  FREE_C_HEAP_ARRAY(char, _identities);
+  FREE_C_HEAP_ARRAY(char, _identities, mtCompiler);
 }
 
 
@@ -109,7 +109,7 @@
   if (id >= _identities_capacity) {
     int new_cap = _identities_capacity * 2;
     if (new_cap <= id)  new_cap = id + 100;
-    _identities = REALLOC_C_HEAP_ARRAY(char, _identities, new_cap);
+    _identities = REALLOC_C_HEAP_ARRAY(char, _identities, new_cap, mtCompiler);
     _identities_capacity = new_cap;
   }
   while (id >= _identities_limit) {
--- a/src/share/vm/compiler/compilerOracle.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/compiler/compilerOracle.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -34,7 +34,7 @@
 #include "runtime/handles.inline.hpp"
 #include "runtime/jniHandles.hpp"
 
-class MethodMatcher : public CHeapObj {
+class MethodMatcher : public CHeapObj<mtCompiler> {
  public:
   enum Mode {
     Exact,
@@ -550,10 +550,12 @@
   }
 }
 
+static const char* default_cc_file = ".hotspot_compiler";
+
 static const char* cc_file() {
 #ifdef ASSERT
   if (CompileCommandFile == NULL)
-    return ".hotspot_compiler";
+    return default_cc_file;
 #endif
   return CompileCommandFile;
 }
@@ -636,10 +638,17 @@
   CompilerOracle::parse_from_string(CompileOnly, CompilerOracle::parse_compile_only);
   if (CompilerOracle::has_command_file()) {
     CompilerOracle::parse_from_file();
+  } else {
+    struct stat buf;
+    if (os::stat(default_cc_file, &buf) == 0) {
+      warning("%s file is present but has been ignored.  "
+              "Run with -XX:CompileCommandFile=%s to load the file.",
+              default_cc_file, default_cc_file);
+    }
   }
   if (lists[PrintCommand] != NULL) {
     if (PrintAssembly) {
-      warning("CompileCommand and/or .hotspot_compiler file contains 'print' commands, but PrintAssembly is also enabled");
+      warning("CompileCommand and/or %s file contains 'print' commands, but PrintAssembly is also enabled", default_cc_file);
     } else if (FLAG_IS_DEFAULT(DebugNonSafepoints)) {
       warning("printing of assembly code is enabled; turning on DebugNonSafepoints to gain additional output");
       DebugNonSafepoints = true;
--- a/src/share/vm/compiler/oopMap.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/compiler/oopMap.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -599,7 +599,7 @@
 
 #ifdef COMPILER2
 
-class DerivedPointerEntry : public CHeapObj {
+class DerivedPointerEntry : public CHeapObj<mtCompiler> {
  private:
   oop*     _location; // Location of derived pointer (also pointing to the base)
   intptr_t _offset;   // Offset from base pointer
@@ -621,7 +621,7 @@
   assert (!_active, "should not be active");
   assert(_list == NULL || _list->length() == 0, "table not empty");
   if (_list == NULL) {
-    _list = new (ResourceObj::C_HEAP) GrowableArray<DerivedPointerEntry*>(10, true); // Allocated on C heap
+    _list = new (ResourceObj::C_HEAP, mtCompiler) GrowableArray<DerivedPointerEntry*>(10, true); // Allocated on C heap
   }
   _active = true;
 }
--- a/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -617,7 +617,7 @@
 
 // A parallel-GC-thread-local allocation buffer for allocation into a
 // CompactibleFreeListSpace.
-class CFLS_LAB : public CHeapObj {
+class CFLS_LAB : public CHeapObj<mtGC> {
   // The space that this buffer allocates into.
   CompactibleFreeListSpace* _cfls;
 
--- a/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -174,7 +174,7 @@
 
 // This struct contains per-thread things necessary to support parallel
 // young-gen collection.
-class CMSParGCThreadState: public CHeapObj {
+class CMSParGCThreadState: public CHeapObj<mtGC> {
  public:
   CFLS_LAB lab;
   PromotionInfo promo;
@@ -229,7 +229,7 @@
   if (CollectedHeap::use_parallel_gc_threads()) {
     typedef CMSParGCThreadState* CMSParGCThreadStatePtr;
     _par_gc_thread_states =
-      NEW_C_HEAP_ARRAY(CMSParGCThreadStatePtr, ParallelGCThreads);
+      NEW_C_HEAP_ARRAY(CMSParGCThreadStatePtr, ParallelGCThreads, mtGC);
     if (_par_gc_thread_states == NULL) {
       vm_exit_during_initialization("Could not allocate par gc structs");
     }
@@ -687,7 +687,7 @@
         warning("task_queues allocation failure.");
         return;
       }
-      _hash_seed = NEW_C_HEAP_ARRAY(int, num_queues);
+      _hash_seed = NEW_C_HEAP_ARRAY(int, num_queues, mtGC);
       if (_hash_seed == NULL) {
         warning("_hash_seed array allocation failure");
         return;
@@ -737,7 +737,7 @@
     assert(_young_gen != NULL, "no _young_gen");
     _eden_chunk_index = 0;
     _eden_chunk_capacity = (_young_gen->max_capacity()+CMSSamplingGrain)/CMSSamplingGrain;
-    _eden_chunk_array = NEW_C_HEAP_ARRAY(HeapWord*, _eden_chunk_capacity);
+    _eden_chunk_array = NEW_C_HEAP_ARRAY(HeapWord*, _eden_chunk_capacity, mtGC);
     if (_eden_chunk_array == NULL) {
       _eden_chunk_capacity = 0;
       warning("GC/CMS: _eden_chunk_array allocation failure");
@@ -750,35 +750,35 @@
     const size_t max_plab_samples =
       ((DefNewGeneration*)_young_gen)->max_survivor_size()/MinTLABSize;
 
-    _survivor_plab_array  = NEW_C_HEAP_ARRAY(ChunkArray, ParallelGCThreads);
-    _survivor_chunk_array = NEW_C_HEAP_ARRAY(HeapWord*, 2*max_plab_samples);
-    _cursor               = NEW_C_HEAP_ARRAY(size_t, ParallelGCThreads);
+    _survivor_plab_array  = NEW_C_HEAP_ARRAY(ChunkArray, ParallelGCThreads, mtGC);
+    _survivor_chunk_array = NEW_C_HEAP_ARRAY(HeapWord*, 2*max_plab_samples, mtGC);
+    _cursor               = NEW_C_HEAP_ARRAY(size_t, ParallelGCThreads, mtGC);
     if (_survivor_plab_array == NULL || _survivor_chunk_array == NULL
         || _cursor == NULL) {
       warning("Failed to allocate survivor plab/chunk array");
       if (_survivor_plab_array  != NULL) {
-        FREE_C_HEAP_ARRAY(ChunkArray, _survivor_plab_array);
+        FREE_C_HEAP_ARRAY(ChunkArray, _survivor_plab_array, mtGC);
         _survivor_plab_array = NULL;
       }
       if (_survivor_chunk_array != NULL) {
-        FREE_C_HEAP_ARRAY(HeapWord*, _survivor_chunk_array);
+        FREE_C_HEAP_ARRAY(HeapWord*, _survivor_chunk_array, mtGC);
         _survivor_chunk_array = NULL;
       }
       if (_cursor != NULL) {
-        FREE_C_HEAP_ARRAY(size_t, _cursor);
+        FREE_C_HEAP_ARRAY(size_t, _cursor, mtGC);
         _cursor = NULL;
       }
     } else {
       _survivor_chunk_capacity = 2*max_plab_samples;
       for (uint i = 0; i < ParallelGCThreads; i++) {
-        HeapWord** vec = NEW_C_HEAP_ARRAY(HeapWord*, max_plab_samples);
+        HeapWord** vec = NEW_C_HEAP_ARRAY(HeapWord*, max_plab_samples, mtGC);
         if (vec == NULL) {
           warning("Failed to allocate survivor plab array");
           for (int j = i; j > 0; j--) {
-            FREE_C_HEAP_ARRAY(HeapWord*, _survivor_plab_array[j-1].array());
+            FREE_C_HEAP_ARRAY(HeapWord*, _survivor_plab_array[j-1].array(), mtGC);
           }
-          FREE_C_HEAP_ARRAY(ChunkArray, _survivor_plab_array);
-          FREE_C_HEAP_ARRAY(HeapWord*, _survivor_chunk_array);
+          FREE_C_HEAP_ARRAY(ChunkArray, _survivor_plab_array, mtGC);
+          FREE_C_HEAP_ARRAY(HeapWord*, _survivor_chunk_array, mtGC);
           _survivor_plab_array = NULL;
           _survivor_chunk_array = NULL;
           _survivor_chunk_capacity = 0;
--- a/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -161,7 +161,7 @@
 
 // Represents a marking stack used by the CMS collector.
 // Ideally this should be GrowableArray<> just like MSC's marking stack(s).
-class CMSMarkStack: public CHeapObj  {
+class CMSMarkStack: public CHeapObj<mtGC>  {
   //
   friend class CMSCollector;   // to get at expasion stats further below
   //
@@ -265,7 +265,7 @@
 
 // Survivor Chunk Array in support of parallelization of
 // Survivor Space rescan.
-class ChunkArray: public CHeapObj {
+class ChunkArray: public CHeapObj<mtGC> {
   size_t _index;
   size_t _capacity;
   size_t _overflows;
@@ -506,7 +506,7 @@
 };
 
 
-class CMSCollector: public CHeapObj {
+class CMSCollector: public CHeapObj<mtGC> {
   friend class VMStructs;
   friend class ConcurrentMarkSweepThread;
   friend class ConcurrentMarkSweepGeneration;
@@ -553,8 +553,8 @@
   // The following array-pair keeps track of mark words
   // displaced for accomodating overflow list above.
   // This code will likely be revisited under RFE#4922830.
-  Stack<oop>     _preserved_oop_stack;
-  Stack<markOop> _preserved_mark_stack;
+  Stack<oop, mtGC>     _preserved_oop_stack;
+  Stack<markOop, mtGC> _preserved_mark_stack;
 
   int*             _hash_seed;
 
--- a/src/share/vm/gc_implementation/g1/collectionSetChooser.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/collectionSetChooser.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -28,7 +28,7 @@
 #include "gc_implementation/g1/heapRegion.hpp"
 #include "utilities/growableArray.hpp"
 
-class CollectionSetChooser: public CHeapObj {
+class CollectionSetChooser: public CHeapObj<mtGC> {
 
   GrowableArray<HeapRegion*> _regions;
 
--- a/src/share/vm/gc_implementation/g1/concurrentG1Refine.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/concurrentG1Refine.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -27,6 +27,7 @@
 #include "gc_implementation/g1/concurrentG1RefineThread.hpp"
 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
 #include "gc_implementation/g1/g1CollectorPolicy.hpp"
+#include "gc_implementation/g1/g1GCPhaseTimes.hpp"
 #include "gc_implementation/g1/g1RemSet.hpp"
 #include "gc_implementation/g1/heapRegionSeq.inline.hpp"
 #include "memory/space.inline.hpp"
@@ -79,7 +80,7 @@
   _n_threads = _n_worker_threads + 1;
   reset_threshold_step();
 
-  _threads = NEW_C_HEAP_ARRAY(ConcurrentG1RefineThread*, _n_threads);
+  _threads = NEW_C_HEAP_ARRAY(ConcurrentG1RefineThread*, _n_threads, mtGC);
   int worker_id_offset = (int)DirtyCardQueueSet::num_par_ids();
   ConcurrentG1RefineThread *next = NULL;
   for (int i = _n_threads - 1; i >= 0; i--) {
@@ -157,7 +158,7 @@
     _def_use_cache = true;
     _use_cache = true;
     _hot_cache_size = (1 << G1ConcRSLogCacheSize);
-    _hot_cache = NEW_C_HEAP_ARRAY(jbyte*, _hot_cache_size);
+    _hot_cache = NEW_C_HEAP_ARRAY(jbyte*, _hot_cache_size, mtGC);
     _n_hot = 0;
     _hot_cache_idx = 0;
 
@@ -191,18 +192,18 @@
     // Please see the comment in allocate_card_count_cache
     // for why we call os::malloc() and os::free() directly.
     assert(_card_counts != NULL, "Logic");
-    os::free(_card_counts);
+    os::free(_card_counts, mtGC);
     assert(_card_epochs != NULL, "Logic");
-    os::free(_card_epochs);
+    os::free(_card_epochs, mtGC);
 
     assert(_hot_cache != NULL, "Logic");
-    FREE_C_HEAP_ARRAY(jbyte*, _hot_cache);
+    FREE_C_HEAP_ARRAY(jbyte*, _hot_cache, mtGC);
   }
   if (_threads != NULL) {
     for (int i = 0; i < _n_threads; i++) {
       delete _threads[i];
     }
-    FREE_C_HEAP_ARRAY(ConcurrentG1RefineThread*, _threads);
+    FREE_C_HEAP_ARRAY(ConcurrentG1RefineThread*, _threads, mtGC);
   }
 }
 
@@ -436,17 +437,17 @@
   size_t counts_size = n * sizeof(CardCountCacheEntry);
   size_t epochs_size = n * sizeof(CardEpochCacheEntry);
 
-  *counts = (CardCountCacheEntry*) os::malloc(counts_size);
+  *counts = (CardCountCacheEntry*) os::malloc(counts_size, mtGC);
   if (*counts == NULL) {
     // allocation was unsuccessful
     return false;
   }
 
-  *epochs = (CardEpochCacheEntry*) os::malloc(epochs_size);
+  *epochs = (CardEpochCacheEntry*) os::malloc(epochs_size, mtGC);
   if (*epochs == NULL) {
     // allocation was unsuccessful - free counts array
     assert(*counts != NULL, "must be");
-    os::free(*counts);
+    os::free(*counts, mtGC);
     *counts = NULL;
     return false;
   }
@@ -479,8 +480,8 @@
         // Allocation was successful.
         // We can just free the old arrays; we're
         // not interested in preserving the contents
-        if (_card_counts != NULL) os::free(_card_counts);
-        if (_card_epochs != NULL) os::free(_card_epochs);
+        if (_card_counts != NULL) os::free(_card_counts, mtGC);
+        if (_card_epochs != NULL) os::free(_card_epochs, mtGC);
 
         // Cache the size of the arrays and the index that got us there.
         _n_card_counts = cache_size;
@@ -500,11 +501,11 @@
 }
 
 void ConcurrentG1Refine::clear_and_record_card_counts() {
-  if (G1ConcRSLogCacheSize == 0) return;
+  if (G1ConcRSLogCacheSize == 0) {
+    return;
+  }
 
-#ifndef PRODUCT
   double start = os::elapsedTime();
-#endif
 
   if (_expand_card_counts) {
     int new_idx = _cache_size_index + 1;
@@ -523,11 +524,8 @@
   assert((this_epoch+1) <= max_jint, "to many periods");
   // Update epoch
   _n_periods++;
-
-#ifndef PRODUCT
-  double elapsed = os::elapsedTime() - start;
-  _g1h->g1_policy()->record_cc_clear_time(elapsed * 1000.0);
-#endif
+  double cc_clear_time_ms = (os::elapsedTime() - start) * 1000;
+  _g1h->g1_policy()->phase_times()->record_cc_clear_time_ms(cc_clear_time_ms);
 }
 
 void ConcurrentG1Refine::print_worker_threads_on(outputStream* st) const {
--- a/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -34,7 +34,7 @@
 class ConcurrentG1RefineThread;
 class G1RemSet;
 
-class ConcurrentG1Refine: public CHeapObj {
+class ConcurrentG1Refine: public CHeapObj<mtGC> {
   ConcurrentG1RefineThread** _threads;
   int _n_threads;
   int _n_worker_threads;
--- a/src/share/vm/gc_implementation/g1/concurrentMark.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/concurrentMark.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -42,6 +42,7 @@
 #include "oops/oop.inline.hpp"
 #include "runtime/handles.inline.hpp"
 #include "runtime/java.hpp"
+#include "services/memTracker.hpp"
 
 // Concurrent marking bit map wrapper
 
@@ -53,6 +54,8 @@
   ReservedSpace brs(ReservedSpace::allocation_align_size_up(
                      (_bmWordSize >> (_shifter + LogBitsPerByte)) + 1));
 
+  MemTracker::record_virtual_memory_type((address)brs.base(), mtGC);
+
   guarantee(brs.is_reserved(), "couldn't allocate concurrent marking bit map");
   // For now we'll just commit all of the bit map up fromt.
   // Later on we'll try to be more parsimonious with swap.
@@ -161,7 +164,7 @@
 {}
 
 void CMMarkStack::allocate(size_t size) {
-  _base = NEW_C_HEAP_ARRAY(oop, size);
+  _base = NEW_C_HEAP_ARRAY(oop, size, mtGC);
   if (_base == NULL) {
     vm_exit_during_initialization("Failed to allocate CM region mark stack");
   }
@@ -173,7 +176,7 @@
 
 CMMarkStack::~CMMarkStack() {
   if (_base != NULL) {
-    FREE_C_HEAP_ARRAY(oop, _base);
+    FREE_C_HEAP_ARRAY(oop, _base, mtGC);
   }
 }
 
@@ -480,11 +483,11 @@
 
   _root_regions.init(_g1h, this);
 
-  _tasks = NEW_C_HEAP_ARRAY(CMTask*, _max_task_num);
-  _accum_task_vtime = NEW_C_HEAP_ARRAY(double, _max_task_num);
-
-  _count_card_bitmaps = NEW_C_HEAP_ARRAY(BitMap,  _max_task_num);
-  _count_marked_bytes = NEW_C_HEAP_ARRAY(size_t*, _max_task_num);
+  _tasks = NEW_C_HEAP_ARRAY(CMTask*, _max_task_num, mtGC);
+  _accum_task_vtime = NEW_C_HEAP_ARRAY(double, _max_task_num, mtGC);
+
+  _count_card_bitmaps = NEW_C_HEAP_ARRAY(BitMap,  _max_task_num, mtGC);
+  _count_marked_bytes = NEW_C_HEAP_ARRAY(size_t*, _max_task_num, mtGC);
 
   BitMap::idx_t card_bm_size = _card_bm.size();
 
@@ -496,7 +499,7 @@
     _task_queues->register_queue(i, task_queue);
 
     _count_card_bitmaps[i] = BitMap(card_bm_size, false);
-    _count_marked_bytes[i] = NEW_C_HEAP_ARRAY(size_t, (size_t) max_regions);
+    _count_marked_bytes[i] = NEW_C_HEAP_ARRAY(size_t, (size_t) max_regions, mtGC);
 
     _tasks[i] = new CMTask(i, this,
                            _count_marked_bytes[i],
@@ -3153,9 +3156,6 @@
       _g1h->g1_policy()->record_concurrent_pause();
     }
     cmThread()->yield();
-    if (worker_id == 0) {
-      _g1h->g1_policy()->record_concurrent_pause_end();
-    }
     return true;
   } else {
     return false;
--- a/src/share/vm/gc_implementation/g1/concurrentMark.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/concurrentMark.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -30,8 +30,8 @@
 
 class G1CollectedHeap;
 class CMTask;
-typedef GenericTaskQueue<oop>            CMTaskQueue;
-typedef GenericTaskQueueSet<CMTaskQueue> CMTaskQueueSet;
+typedef GenericTaskQueue<oop, mtGC>            CMTaskQueue;
+typedef GenericTaskQueueSet<CMTaskQueue, mtGC> CMTaskQueueSet;
 
 // Closure used by CM during concurrent reference discovery
 // and reference processing (during remarking) to determine
@@ -343,7 +343,7 @@
 
 class ConcurrentMarkThread;
 
-class ConcurrentMark : public CHeapObj {
+class ConcurrentMark: public CHeapObj<mtGC> {
   friend class ConcurrentMarkThread;
   friend class CMTask;
   friend class CMBitMapClosure;
--- a/src/share/vm/gc_implementation/g1/dirtyCardQueue.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/dirtyCardQueue.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -32,7 +32,7 @@
 
 // A closure class for processing card table entries.  Note that we don't
 // require these closure objects to be stack-allocated.
-class CardTableEntryClosure: public CHeapObj {
+class CardTableEntryClosure: public CHeapObj<mtGC> {
 public:
   // Process the card whose card table entry is "card_ptr".  If returns
   // "false", terminate the iteration early.
--- a/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -27,6 +27,7 @@
 #include "memory/space.hpp"
 #include "oops/oop.inline.hpp"
 #include "runtime/java.hpp"
+#include "services/memTracker.hpp"
 
 //////////////////////////////////////////////////////////////////////
 // G1BlockOffsetSharedArray
@@ -44,6 +45,9 @@
   if (!_vs.initialize(rs, 0)) {
     vm_exit_during_initialization("Could not reserve enough space for heap offset array");
   }
+
+  MemTracker::record_virtual_memory_type((address)rs.base(), mtGC);
+
   _offset_array = (u_char*)_vs.low_boundary();
   resize(init_word_size);
   if (TraceBlockOffsetTable) {
--- a/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -117,7 +117,7 @@
 
 // Here is the shared array type.
 
-class G1BlockOffsetSharedArray: public CHeapObj {
+class G1BlockOffsetSharedArray: public CHeapObj<mtGC> {
   friend class G1BlockOffsetArray;
   friend class G1BlockOffsetArrayContigSpace;
   friend class VMStructs;
--- a/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -33,6 +33,7 @@
 #include "gc_implementation/g1/g1CollectorPolicy.hpp"
 #include "gc_implementation/g1/g1ErgoVerbose.hpp"
 #include "gc_implementation/g1/g1EvacFailure.hpp"
+#include "gc_implementation/g1/g1GCPhaseTimes.hpp"
 #include "gc_implementation/g1/g1Log.hpp"
 #include "gc_implementation/g1/g1MarkSweep.hpp"
 #include "gc_implementation/g1/g1OopClosures.inline.hpp"
@@ -1916,14 +1917,14 @@
   assert(n_rem_sets > 0, "Invariant.");
 
   HeapRegionRemSetIterator** iter_arr =
-    NEW_C_HEAP_ARRAY(HeapRegionRemSetIterator*, n_queues);
+    NEW_C_HEAP_ARRAY(HeapRegionRemSetIterator*, n_queues, mtGC);
   for (int i = 0; i < n_queues; i++) {
     iter_arr[i] = new HeapRegionRemSetIterator();
   }
   _rem_set_iterator = iter_arr;
 
-  _worker_cset_start_region = NEW_C_HEAP_ARRAY(HeapRegion*, n_queues);
-  _worker_cset_start_region_time_stamp = NEW_C_HEAP_ARRAY(unsigned int, n_queues);
+  _worker_cset_start_region = NEW_C_HEAP_ARRAY(HeapRegion*, n_queues, mtGC);
+  _worker_cset_start_region_time_stamp = NEW_C_HEAP_ARRAY(unsigned int, n_queues, mtGC);
 
   for (int i = 0; i < n_queues; i++) {
     RefToScanQueue* q = new RefToScanQueue();
@@ -2082,7 +2083,7 @@
 
    _in_cset_fast_test_length = max_regions();
    _in_cset_fast_test_base =
-                   NEW_C_HEAP_ARRAY(bool, (size_t) _in_cset_fast_test_length);
+                   NEW_C_HEAP_ARRAY(bool, (size_t) _in_cset_fast_test_length, mtGC);
 
    // We're biasing _in_cset_fast_test to avoid subtracting the
    // beginning of the heap every time we want to index; basically
@@ -2274,7 +2275,7 @@
   while (dcqs.apply_closure_to_completed_buffer(cl, worker_i, 0, true)) {
     n_completed_buffers++;
   }
-  g1_policy()->record_update_rs_processed_buffers(worker_i,
+  g1_policy()->phase_times()->record_update_rs_processed_buffers(worker_i,
                                                   (double) n_completed_buffers);
   dcqs.clear_n_completed_buffers();
   assert(!dcqs.completed_buffers_exist_dirty(), "Completed buffers exist!");
@@ -3505,7 +3506,7 @@
 G1CollectedHeap::setup_surviving_young_words() {
   assert(_surviving_young_words == NULL, "pre-condition");
   uint array_length = g1_policy()->young_cset_region_length();
-  _surviving_young_words = NEW_C_HEAP_ARRAY(size_t, (size_t) array_length);
+  _surviving_young_words = NEW_C_HEAP_ARRAY(size_t, (size_t) array_length, mtGC);
   if (_surviving_young_words == NULL) {
     vm_exit_out_of_memory(sizeof(size_t) * array_length,
                           "Not enough space for young surv words summary.");
@@ -3530,7 +3531,7 @@
 void
 G1CollectedHeap::cleanup_surviving_young_words() {
   guarantee( _surviving_young_words != NULL, "pre-condition" );
-  FREE_C_HEAP_ARRAY(size_t, _surviving_young_words);
+  FREE_C_HEAP_ARRAY(size_t, _surviving_young_words, mtGC);
   _surviving_young_words = NULL;
 }
 
@@ -3633,10 +3634,10 @@
     gclog_or_tty->date_stamp(G1Log::fine() && PrintGCDateStamps);
     TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty);
 
-    GCCauseString gc_cause_str = GCCauseString("GC pause", gc_cause())
-      .append(g1_policy()->gcs_are_young() ? " (young)" : " (mixed)")
-      .append(g1_policy()->during_initial_mark_pause() ? " (initial-mark)" : "");
-    TraceTime t(gc_cause_str, G1Log::fine() && !G1Log::finer(), true, gclog_or_tty);
+    int active_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
+                                workers()->active_workers() : 1);
+    g1_policy()->phase_times()->note_gc_start(os::elapsedTime(), active_workers,
+      g1_policy()->gcs_are_young(), g1_policy()->during_initial_mark_pause(), gc_cause());
 
     TraceCollectorStats tcs(g1mm()->incremental_collection_counters());
     TraceMemoryManagerStats tms(false /* fullGC */, gc_cause());
@@ -3699,9 +3700,15 @@
         // before the start GC event.
         _hr_printer.start_gc(false /* full */, (size_t) total_collections());
 
+        // This timing is only used by the ergonomics to handle our pause target.
+        // It is unclear why this should not include the full pause. We will
+        // investigate this in CR 7178365.
+        //
+        // Preserving the old comment here if that helps the investigation:
+        //
         // The elapsed time induced by the start time below deliberately elides
         // the possible verification above.
-        double start_time_sec = os::elapsedTime();
+        double sample_start_time_sec = os::elapsedTime();
         size_t start_used_bytes = used();
 
 #if YOUNG_LIST_VERBOSE
@@ -3710,7 +3717,7 @@
         g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty);
 #endif // YOUNG_LIST_VERBOSE
 
-        g1_policy()->record_collection_pause_start(start_time_sec,
+        g1_policy()->record_collection_pause_start(sample_start_time_sec,
                                                    start_used_bytes);
 
         double scan_wait_start = os::elapsedTime();
@@ -3719,11 +3726,12 @@
         // objects on them have been correctly scanned before we start
         // moving them during the GC.
         bool waited = _cm->root_regions()->wait_until_scan_finished();
+        double wait_time_ms = 0.0;
         if (waited) {
           double scan_wait_end = os::elapsedTime();
-          double wait_time_ms = (scan_wait_end - scan_wait_start) * 1000.0;
-          g1_policy()->record_root_region_scan_wait_time(wait_time_ms);
+          wait_time_ms = (scan_wait_end - scan_wait_start) * 1000.0;
         }
+        g1_policy()->phase_times()->record_root_region_scan_wait_time(wait_time_ms);
 
 #if YOUNG_LIST_VERBOSE
         gclog_or_tty->print_cr("\nAfter recording pause start.\nYoung_list:");
@@ -3877,12 +3885,16 @@
                                  true  /* verify_fingers */);
         _cm->note_end_of_gc();
 
-        double end_time_sec = os::elapsedTime();
-        double pause_time_ms = (end_time_sec - start_time_sec) * MILLIUNITS;
-        g1_policy()->record_pause_time_ms(pause_time_ms);
-        int active_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
-                                workers()->active_workers() : 1);
-        g1_policy()->record_collection_pause_end(active_workers);
+        // Collect thread local data to allow the ergonomics to use
+        // the collected information
+        g1_policy()->phase_times()->collapse_par_times();
+
+        // This timing is only used by the ergonomics to handle our pause target.
+        // It is unclear why this should not include the full pause. We will
+        // investigate this in CR 7178365.
+        double sample_end_time_sec = os::elapsedTime();
+        double pause_time_ms = (sample_end_time_sec - sample_start_time_sec) * MILLIUNITS;
+        g1_policy()->record_collection_pause_end(pause_time_ms);
 
         MemoryService::track_memory_usage();
 
@@ -3929,9 +3941,6 @@
       // RETIRE events are generated before the end GC event.
       _hr_printer.end_gc(false /* full */, (size_t) total_collections());
 
-      // We have to do this after we decide whether to expand the heap or not.
-      g1_policy()->print_heap_transition();
-
       if (mark_in_progress()) {
         concurrent_mark()->update_g1_committed();
       }
@@ -3941,13 +3950,14 @@
 #endif
 
       gc_epilogue(false);
+
+      g1_policy()->phase_times()->note_gc_end(os::elapsedTime());
+
+      // We have to do this after we decide whether to expand the heap or not.
+      g1_policy()->print_heap_transition();
     }
 
-    // The closing of the inner scope, immediately above, will complete
-    // logging at the "fine" level. The record_collection_pause_end() call
-    // above will complete logging at the "finer" level.
-    //
-    // It is not yet to safe, however, to tell the concurrent mark to
+    // It is not yet to safe to tell the concurrent mark to
     // start as we have some optional output below. We don't want the
     // output from the concurrent mark thread interfering with this
     // logging output either.
@@ -4073,7 +4083,7 @@
 void G1CollectedHeap::init_for_evac_failure(OopsInHeapRegionClosure* cl) {
   _drain_in_progress = false;
   set_evac_failure_closure(cl);
-  _evac_failure_scan_stack = new (ResourceObj::C_HEAP) GrowableArray<oop>(40, true);
+  _evac_failure_scan_stack = new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(40, true);
 }
 
 void G1CollectedHeap::finalize_for_evac_failure() {
@@ -4207,9 +4217,9 @@
     if (_objs_with_preserved_marks == NULL) {
       assert(_preserved_marks_of_objs == NULL, "Both or none.");
       _objs_with_preserved_marks =
-        new (ResourceObj::C_HEAP) GrowableArray<oop>(40, true);
+        new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(40, true);
       _preserved_marks_of_objs =
-        new (ResourceObj::C_HEAP) GrowableArray<markOop>(40, true);
+        new (ResourceObj::C_HEAP, mtGC) GrowableArray<markOop>(40, true);
     }
     _objs_with_preserved_marks->push(obj);
     _preserved_marks_of_objs->push(m);
@@ -4269,7 +4279,7 @@
   uint array_length = PADDING_ELEM_NUM +
                       real_length +
                       PADDING_ELEM_NUM;
-  _surviving_young_words_base = NEW_C_HEAP_ARRAY(size_t, array_length);
+  _surviving_young_words_base = NEW_C_HEAP_ARRAY(size_t, array_length, mtGC);
   if (_surviving_young_words_base == NULL)
     vm_exit_out_of_memory(array_length * sizeof(size_t),
                           "Not enough space for young surv histo.");
@@ -4695,7 +4705,7 @@
     if (worker_id >= _n_workers) return;  // no work needed this round
 
     double start_time_ms = os::elapsedTime() * 1000.0;
-    _g1h->g1_policy()->record_gc_worker_start_time(worker_id, start_time_ms);
+    _g1h->g1_policy()->phase_times()->record_gc_worker_start_time(worker_id, start_time_ms);
 
     {
       ResourceMark rm;
@@ -4744,15 +4754,12 @@
         evac.do_void();
         double elapsed_ms = (os::elapsedTime()-start)*1000.0;
         double term_ms = pss.term_time()*1000.0;
-        _g1h->g1_policy()->record_obj_copy_time(worker_id, elapsed_ms-term_ms);
-        _g1h->g1_policy()->record_termination(worker_id, term_ms, pss.term_attempts());
+        _g1h->g1_policy()->phase_times()->record_obj_copy_time(worker_id, elapsed_ms-term_ms);
+        _g1h->g1_policy()->phase_times()->record_termination(worker_id, term_ms, pss.term_attempts());
       }
       _g1h->g1_policy()->record_thread_age_table(pss.age_table());
       _g1h->update_surviving_young_words(pss.surviving_young_words()+1);
 
-      // Clean up any par-expanded rem sets.
-      HeapRegionRemSet::par_cleanup();
-
       if (ParallelGCVerbose) {
         MutexLocker x(stats_lock());
         pss.print_termination_stats(worker_id);
@@ -4766,7 +4773,7 @@
     }
 
     double end_time_ms = os::elapsedTime() * 1000.0;
-    _g1h->g1_policy()->record_gc_worker_end_time(worker_id, end_time_ms);
+    _g1h->g1_policy()->phase_times()->record_gc_worker_end_time(worker_id, end_time_ms);
   }
 };
 
@@ -4877,15 +4884,15 @@
 
   double ext_roots_end = os::elapsedTime();
 
-  g1_policy()->reset_obj_copy_time(worker_i);
+  g1_policy()->phase_times()->reset_obj_copy_time(worker_i);
   double obj_copy_time_sec = buf_scan_perm.closure_app_seconds() +
                                 buf_scan_non_heap_roots.closure_app_seconds();
-  g1_policy()->record_obj_copy_time(worker_i, obj_copy_time_sec * 1000.0);
+  g1_policy()->phase_times()->record_obj_copy_time(worker_i, obj_copy_time_sec * 1000.0);
 
   double ext_root_time_ms =
     ((ext_roots_end - ext_roots_start) - obj_copy_time_sec) * 1000.0;
 
-  g1_policy()->record_ext_root_scan_time(worker_i, ext_root_time_ms);
+  g1_policy()->phase_times()->record_ext_root_scan_time(worker_i, ext_root_time_ms);
 
   // During conc marking we have to filter the per-thread SATB buffers
   // to make sure we remove any oops into the CSet (which will show up
@@ -4896,7 +4903,7 @@
     }
   }
   double satb_filtering_ms = (os::elapsedTime() - ext_roots_end) * 1000.0;
-  g1_policy()->record_satb_filtering_time(worker_i, satb_filtering_ms);
+  g1_policy()->phase_times()->record_satb_filtering_time(worker_i, satb_filtering_ms);
 
   // Now scan the complement of the collection set.
   if (scan_rs != NULL) {
@@ -5396,7 +5403,7 @@
   assert(pss.refs()->is_empty(), "both queue and overflow should be empty");
 
   double ref_proc_time = os::elapsedTime() - ref_proc_start;
-  g1_policy()->record_ref_proc_time(ref_proc_time * 1000.0);
+  g1_policy()->phase_times()->record_ref_proc_time(ref_proc_time * 1000.0);
 }
 
 // Weak Reference processing during an evacuation pause (part 2).
@@ -5433,7 +5440,7 @@
   // and could signicantly increase the pause time.
 
   double ref_enq_time = os::elapsedTime() - ref_enq_start;
-  g1_policy()->record_ref_enq_time(ref_enq_time * 1000.0);
+  g1_policy()->phase_times()->record_ref_enq_time(ref_enq_time * 1000.0);
 }
 
 void G1CollectedHeap::evacuate_collection_set() {
@@ -5496,11 +5503,11 @@
   }
 
   double par_time_ms = (end_par_time_sec - start_par_time_sec) * 1000.0;
-  g1_policy()->record_par_time(par_time_ms);
+  g1_policy()->phase_times()->record_par_time(par_time_ms);
 
   double code_root_fixup_time_ms =
         (os::elapsedTime() - end_par_time_sec) * 1000.0;
-  g1_policy()->record_code_root_fixup_time(code_root_fixup_time_ms);
+  g1_policy()->phase_times()->record_code_root_fixup_time(code_root_fixup_time_ms);
 
   set_par_threads(0);
 
@@ -5762,7 +5769,7 @@
   }
 
   double elapsed = os::elapsedTime() - start;
-  g1_policy()->record_clear_ct_time(elapsed * 1000.0);
+  g1_policy()->phase_times()->record_clear_ct_time(elapsed * 1000.0);
 }
 
 void G1CollectedHeap::free_collection_set(HeapRegion* cs_head) {
@@ -5871,8 +5878,8 @@
                                     NULL /* old_proxy_set */,
                                     NULL /* humongous_proxy_set */,
                                     false /* par */);
-  policy->record_young_free_cset_time_ms(young_time_ms);
-  policy->record_non_young_free_cset_time_ms(non_young_time_ms);
+  policy->phase_times()->record_young_free_cset_time_ms(young_time_ms);
+  policy->phase_times()->record_non_young_free_cset_time_ms(non_young_time_ms);
 }
 
 // This routine is similar to the above but does not record
--- a/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -62,8 +62,8 @@
 class ConcurrentG1Refine;
 class GenerationCounters;
 
-typedef OverflowTaskQueue<StarTask>         RefToScanQueue;
-typedef GenericTaskQueueSet<RefToScanQueue> RefToScanQueueSet;
+typedef OverflowTaskQueue<StarTask, mtGC>         RefToScanQueue;
+typedef GenericTaskQueueSet<RefToScanQueue, mtGC> RefToScanQueueSet;
 
 typedef int RegionIdx_t;   // needs to hold [ 0..max_regions() )
 typedef int CardIdx_t;     // needs to hold [ 0..CardsPerRegion )
@@ -74,7 +74,7 @@
   GCAllocPurposeCount
 };
 
-class YoungList : public CHeapObj {
+class YoungList : public CHeapObj<mtGC> {
 private:
   G1CollectedHeap* _g1h;
 
@@ -1772,7 +1772,7 @@
   G1ParScanThreadState(G1CollectedHeap* g1h, uint queue_num);
 
   ~G1ParScanThreadState() {
-    FREE_C_HEAP_ARRAY(size_t, _surviving_young_words_base);
+    FREE_C_HEAP_ARRAY(size_t, _surviving_young_words_base, mtGC);
   }
 
   RefToScanQueue*   refs()            { return _refs;             }
--- a/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -29,6 +29,7 @@
 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
 #include "gc_implementation/g1/g1CollectorPolicy.hpp"
 #include "gc_implementation/g1/g1ErgoVerbose.hpp"
+#include "gc_implementation/g1/g1GCPhaseTimes.hpp"
 #include "gc_implementation/g1/g1Log.hpp"
 #include "gc_implementation/g1/heapRegionRemSet.hpp"
 #include "gc_implementation/shared/gcPolicyCounters.hpp"
@@ -77,57 +78,6 @@
   1.0, 0.7, 0.7, 0.5, 0.5, 0.42, 0.42, 0.30
 };
 
-// Help class for avoiding interleaved logging
-class LineBuffer: public StackObj {
-
-private:
-  static const int BUFFER_LEN = 1024;
-  static const int INDENT_CHARS = 3;
-  char _buffer[BUFFER_LEN];
-  int _indent_level;
-  int _cur;
-
-  void vappend(const char* format, va_list ap) {
-    int res = vsnprintf(&_buffer[_cur], BUFFER_LEN - _cur, format, ap);
-    if (res != -1) {
-      _cur += res;
-    } else {
-      DEBUG_ONLY(warning("buffer too small in LineBuffer");)
-      _buffer[BUFFER_LEN -1] = 0;
-      _cur = BUFFER_LEN; // vsnprintf above should not add to _buffer if we are called again
-    }
-  }
-
-public:
-  explicit LineBuffer(int indent_level): _indent_level(indent_level), _cur(0) {
-    for (; (_cur < BUFFER_LEN && _cur < (_indent_level * INDENT_CHARS)); _cur++) {
-      _buffer[_cur] = ' ';
-    }
-  }
-
-#ifndef PRODUCT
-  ~LineBuffer() {
-    assert(_cur == _indent_level * INDENT_CHARS, "pending data in buffer - append_and_print_cr() not called?");
-  }
-#endif
-
-  void append(const char* format, ...) {
-    va_list ap;
-    va_start(ap, format);
-    vappend(format, ap);
-    va_end(ap);
-  }
-
-  void append_and_print_cr(const char* format, ...) {
-    va_list ap;
-    va_start(ap, format);
-    vappend(format, ap);
-    va_end(ap);
-    gclog_or_tty->print_cr("%s", _buffer);
-    _cur = _indent_level * INDENT_CHARS;
-  }
-};
-
 G1CollectorPolicy::G1CollectorPolicy() :
   _parallel_gc_threads(G1CollectedHeap::use_parallel_gc_threads()
                         ? ParallelGCThreads : 1),
@@ -135,20 +85,6 @@
   _recent_gc_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
   _stop_world_start(0.0),
 
-  _cur_clear_ct_time_ms(0.0),
-  _root_region_scan_wait_time_ms(0.0),
-
-  _cur_ref_proc_time_ms(0.0),
-  _cur_ref_enq_time_ms(0.0),
-
-#ifndef PRODUCT
-  _min_clear_cc_time_ms(-1.0),
-  _max_clear_cc_time_ms(-1.0),
-  _cur_clear_cc_time_ms(0.0),
-  _cum_clear_cc_time_ms(0.0),
-  _num_cc_clears(0L),
-#endif
-
   _concurrent_mark_remark_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
   _concurrent_mark_cleanup_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
 
@@ -257,30 +193,9 @@
   _recent_prev_end_times_for_all_gcs_sec->add(os::elapsedTime());
   _prev_collection_pause_end_ms = os::elapsedTime() * 1000.0;
 
-  _par_last_gc_worker_start_times_ms = new double[_parallel_gc_threads];
-  _par_last_ext_root_scan_times_ms = new double[_parallel_gc_threads];
-  _par_last_satb_filtering_times_ms = new double[_parallel_gc_threads];
-
-  _par_last_update_rs_times_ms = new double[_parallel_gc_threads];
-  _par_last_update_rs_processed_buffers = new double[_parallel_gc_threads];
-
-  _par_last_scan_rs_times_ms = new double[_parallel_gc_threads];
-
-  _par_last_obj_copy_times_ms = new double[_parallel_gc_threads];
+  _phase_times = new G1GCPhaseTimes(_parallel_gc_threads);
 
-  _par_last_termination_times_ms = new double[_parallel_gc_threads];
-  _par_last_termination_attempts = new double[_parallel_gc_threads];
-  _par_last_gc_worker_end_times_ms = new double[_parallel_gc_threads];
-  _par_last_gc_worker_times_ms = new double[_parallel_gc_threads];
-  _par_last_gc_worker_other_times_ms = new double[_parallel_gc_threads];
-
-  int index;
-  if (ParallelGCThreads == 0)
-    index = 0;
-  else if (ParallelGCThreads > 8)
-    index = 7;
-  else
-    index = ParallelGCThreads - 1;
+  int index = MIN2(_parallel_gc_threads - 1, 7);
 
   _pending_card_diff_seq->add(0.0);
   _rs_length_diff_seq->add(rs_length_diff_defaults[index]);
@@ -824,7 +739,7 @@
 #endif // PRODUCT
 
 void G1CollectorPolicy::record_full_collection_start() {
-  _cur_collection_start_sec = os::elapsedTime();
+  _full_collection_start_sec = os::elapsedTime();
   // Release the future to-space so that it is available for compaction into.
   _g1->set_full_collection();
 }
@@ -833,7 +748,7 @@
   // Consider this like a collection pause for the purposes of allocation
   // since last pause.
   double end_sec = os::elapsedTime();
-  double full_gc_time_sec = end_sec - _cur_collection_start_sec;
+  double full_gc_time_sec = end_sec - _full_collection_start_sec;
   double full_gc_time_ms = full_gc_time_sec * 1000.0;
 
   _trace_gen1_time_data.record_full_collection(full_gc_time_ms);
@@ -869,12 +784,6 @@
 
 void G1CollectorPolicy::record_collection_pause_start(double start_time_sec,
                                                       size_t start_used) {
-  if (G1Log::finer()) {
-    gclog_or_tty->stamp(PrintGCTimeStamps);
-    gclog_or_tty->print("[%s", (const char*)GCCauseString("GC pause", _g1->gc_cause())
-      .append(gcs_are_young() ? " (young)" : " (mixed)"));
-  }
-
   // We only need to do this here as the policy will only be applied
   // to the GC we're about to start. so, no point is calculating this
   // every time we calculate / recalculate the target young length.
@@ -888,7 +797,7 @@
   _trace_gen0_time_data.record_start_collection(s_w_t_ms);
   _stop_world_start = 0.0;
 
-  _cur_collection_start_sec = start_time_sec;
+  phase_times()->_cur_collection_start_sec = start_time_sec;
   _cur_collection_pause_used_at_start_bytes = start_used;
   _cur_collection_pause_used_regions_at_start = _g1->used_regions();
   _pending_cards = _g1->pending_card_num();
@@ -902,30 +811,6 @@
   _survivor_bytes_before_gc = young_list->survivor_used_bytes();
   _capacity_before_gc = _g1->capacity();
 
-#ifdef DEBUG
-  // initialise these to something well known so that we can spot
-  // if they are not set properly
-
-  for (int i = 0; i < _parallel_gc_threads; ++i) {
-    _par_last_gc_worker_start_times_ms[i] = -1234.0;
-    _par_last_ext_root_scan_times_ms[i] = -1234.0;
-    _par_last_satb_filtering_times_ms[i] = -1234.0;
-    _par_last_update_rs_times_ms[i] = -1234.0;
-    _par_last_update_rs_processed_buffers[i] = -1234.0;
-    _par_last_scan_rs_times_ms[i] = -1234.0;
-    _par_last_obj_copy_times_ms[i] = -1234.0;
-    _par_last_termination_times_ms[i] = -1234.0;
-    _par_last_termination_attempts[i] = -1234.0;
-    _par_last_gc_worker_end_times_ms[i] = -1234.0;
-    _par_last_gc_worker_times_ms[i] = -1234.0;
-    _par_last_gc_worker_other_times_ms[i] = -1234.0;
-  }
-#endif
-
-  // This is initialized to zero here and is set during the evacuation
-  // pause if we actually waited for the root region scanning to finish.
-  _root_region_scan_wait_time_ms = 0.0;
-
   _last_gc_was_young = false;
 
   // do that for any other surv rate groups
@@ -974,127 +859,6 @@
   }
 }
 
-void G1CollectorPolicy::record_concurrent_pause_end() {
-}
-
-template<class T>
-T sum_of(T* sum_arr, int start, int n, int N) {
-  T sum = (T)0;
-  for (int i = 0; i < n; i++) {
-    int j = (start + i) % N;
-    sum += sum_arr[j];
-  }
-  return sum;
-}
-
-void G1CollectorPolicy::print_par_stats(int level,
-                                        const char* str,
-                                        double* data,
-                                        bool showDecimals) {
-  double min = data[0], max = data[0];
-  double total = 0.0;
-  LineBuffer buf(level);
-  buf.append("[%s (ms):", str);
-  for (uint i = 0; i < no_of_gc_threads(); ++i) {
-    double val = data[i];
-    if (val < min)
-      min = val;
-    if (val > max)
-      max = val;
-    total += val;
-    if (G1Log::finest()) {
-      if (showDecimals) {
-        buf.append("  %.1lf", val);
-      } else {
-        buf.append("  %d", (int)val);
-      }
-    }
-  }
-
-  if (G1Log::finest()) {
-    buf.append_and_print_cr("");
-  }
-  double avg = total / (double) no_of_gc_threads();
-  if (showDecimals) {
-    buf.append_and_print_cr(" Min: %.1lf, Avg: %.1lf, Max: %.1lf, Diff: %.1lf, Sum: %.1lf]",
-      min, avg, max, max - min, total);
-  } else {
-    buf.append_and_print_cr(" Min: %d, Avg: %d, Max: %d, Diff: %d, Sum: %d]",
-      (int)min, (int)avg, (int)max, (int)max - (int)min, (int)total);
-  }
-}
-
-void G1CollectorPolicy::print_stats(int level,
-                                    const char* str,
-                                    double value) {
-  LineBuffer(level).append_and_print_cr("[%s: %.1lf ms]", str, value);
-}
-
-void G1CollectorPolicy::print_stats(int level,
-                                    const char* str,
-                                    double value,
-                                    int workers) {
-  LineBuffer(level).append_and_print_cr("[%s: %.1lf ms, GC Workers: %d]", str, value, workers);
-}
-
-void G1CollectorPolicy::print_stats(int level,
-                                    const char* str,
-                                    int value) {
-  LineBuffer(level).append_and_print_cr("[%s: %d]", str, value);
-}
-
-double G1CollectorPolicy::avg_value(double* data) {
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    double ret = 0.0;
-    for (uint i = 0; i < no_of_gc_threads(); ++i) {
-      ret += data[i];
-    }
-    return ret / (double) no_of_gc_threads();
-  } else {
-    return data[0];
-  }
-}
-
-double G1CollectorPolicy::max_value(double* data) {
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    double ret = data[0];
-    for (uint i = 1; i < no_of_gc_threads(); ++i) {
-      if (data[i] > ret) {
-        ret = data[i];
-      }
-    }
-    return ret;
-  } else {
-    return data[0];
-  }
-}
-
-double G1CollectorPolicy::sum_of_values(double* data) {
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    double sum = 0.0;
-    for (uint i = 0; i < no_of_gc_threads(); i++) {
-      sum += data[i];
-    }
-    return sum;
-  } else {
-    return data[0];
-  }
-}
-
-double G1CollectorPolicy::max_sum(double* data1, double* data2) {
-  double ret = data1[0] + data2[0];
-
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    for (uint i = 1; i < no_of_gc_threads(); ++i) {
-      double data = data1[i] + data2[i];
-      if (data > ret) {
-        ret = data;
-      }
-    }
-  }
-  return ret;
-}
-
 bool G1CollectorPolicy::need_to_start_conc_mark(const char* source, size_t alloc_word_size) {
   if (_g1->concurrent_mark()->cmThread()->during_cycle()) {
     return false;
@@ -1142,10 +906,8 @@
 // Anything below that is considered to be zero
 #define MIN_TIMER_GRANULARITY 0.0000001
 
-void G1CollectorPolicy::record_collection_pause_end(int no_of_gc_threads) {
+void G1CollectorPolicy::record_collection_pause_end(double pause_time_ms) {
   double end_time_sec = os::elapsedTime();
-  double elapsed_ms = _last_pause_time_ms;
-  bool parallel = G1CollectedHeap::use_parallel_gc_threads();
   assert(_cur_collection_pause_used_regions_at_start >= cset_region_length(),
          "otherwise, the subtraction below does not make sense");
   size_t rs_size =
@@ -1154,7 +916,6 @@
   assert(cur_used_bytes == _g1->recalculate_used(), "It should!");
   bool last_pause_included_initial_mark = false;
   bool update_stats = !_g1->evacuation_failed();
-  set_no_of_gc_threads(no_of_gc_threads);
 
 #ifndef PRODUCT
   if (G1YoungSurvRateVerbose) {
@@ -1174,7 +935,7 @@
     set_initiate_conc_mark_if_possible();
   }
 
-  _mmu_tracker->add_pause(end_time_sec - elapsed_ms/1000.0,
+  _mmu_tracker->add_pause(end_time_sec - pause_time_ms/1000.0,
                           end_time_sec, false);
 
   size_t freed_bytes =
@@ -1185,58 +946,11 @@
     (double)surviving_bytes/
     (double)_collection_set_bytes_used_before;
 
-  // These values are used to update the summary information that is
-  // displayed when TraceGen0Time is enabled, and are output as part
-  // of the "finer" output, in the non-parallel case.
-
-  double ext_root_scan_time = avg_value(_par_last_ext_root_scan_times_ms);
-  double satb_filtering_time = avg_value(_par_last_satb_filtering_times_ms);
-  double update_rs_time = avg_value(_par_last_update_rs_times_ms);
-  double update_rs_processed_buffers =
-    sum_of_values(_par_last_update_rs_processed_buffers);
-  double scan_rs_time = avg_value(_par_last_scan_rs_times_ms);
-  double obj_copy_time = avg_value(_par_last_obj_copy_times_ms);
-  double termination_time = avg_value(_par_last_termination_times_ms);
-
-  double known_time = ext_root_scan_time +
-                      satb_filtering_time +
-                      update_rs_time +
-                      scan_rs_time +
-                      obj_copy_time;
-
-  double other_time_ms = elapsed_ms;
-
-  // Subtract the root region scanning wait time. It's initialized to
-  // zero at the start of the pause.
-  other_time_ms -= _root_region_scan_wait_time_ms;
-
-  if (parallel) {
-    other_time_ms -= _cur_collection_par_time_ms;
-  } else {
-    other_time_ms -= known_time;
-  }
-
-  // Now subtract the time taken to fix up roots in generated code
-  other_time_ms -= _cur_collection_code_root_fixup_time_ms;
-
-  // Subtract the time taken to clean the card table from the
-  // current value of "other time"
-  other_time_ms -= _cur_clear_ct_time_ms;
-
-  // TraceGen0Time and TraceGen1Time summary info updating.
-
   if (update_stats) {
-    double parallel_known_time = known_time + termination_time;
-    double parallel_other_time = _cur_collection_par_time_ms - parallel_known_time;
-
-    _trace_gen0_time_data.record_end_collection(
-      elapsed_ms, other_time_ms, _root_region_scan_wait_time_ms, _cur_collection_par_time_ms,
-      ext_root_scan_time, satb_filtering_time, update_rs_time, scan_rs_time, obj_copy_time,
-      termination_time, parallel_other_time, _cur_clear_ct_time_ms);
-
+    _trace_gen0_time_data.record_end_collection(pause_time_ms, phase_times());
     // this is where we update the allocation rate of the application
     double app_time_ms =
-      (_cur_collection_start_sec * 1000.0 - _prev_collection_pause_end_ms);
+      (phase_times()->_cur_collection_start_sec * 1000.0 - _prev_collection_pause_end_ms);
     if (app_time_ms < MIN_TIMER_GRANULARITY) {
       // This usually happens due to the timer not having the required
       // granularity. Some Linuxes are the usual culprits.
@@ -1257,7 +971,7 @@
 
     double interval_ms =
       (end_time_sec - _recent_prev_end_times_for_all_gcs_sec->oldest()) * 1000.0;
-    update_recent_gc_times(end_time_sec, elapsed_ms);
+    update_recent_gc_times(end_time_sec, pause_time_ms);
     _recent_avg_pause_time_ratio = _recent_gc_times_ms->sum()/interval_ms;
     if (recent_avg_pause_time_ratio() < 0.0 ||
         (recent_avg_pause_time_ratio() - 1.0 > 0.0)) {
@@ -1284,90 +998,6 @@
       }
     }
   }
-
-  if (G1Log::finer()) {
-    bool print_marking_info =
-      _g1->mark_in_progress() && !last_pause_included_initial_mark;
-
-    gclog_or_tty->print_cr("%s, %1.8lf secs]",
-                           (last_pause_included_initial_mark) ? " (initial-mark)" : "",
-                           elapsed_ms / 1000.0);
-
-    if (_root_region_scan_wait_time_ms > 0.0) {
-      print_stats(1, "Root Region Scan Waiting", _root_region_scan_wait_time_ms);
-    }
-    if (parallel) {
-      print_stats(1, "Parallel Time", _cur_collection_par_time_ms, no_of_gc_threads);
-      print_par_stats(2, "GC Worker Start", _par_last_gc_worker_start_times_ms);
-      print_par_stats(2, "Ext Root Scanning", _par_last_ext_root_scan_times_ms);
-      if (print_marking_info) {
-        print_par_stats(2, "SATB Filtering", _par_last_satb_filtering_times_ms);
-      }
-      print_par_stats(2, "Update RS", _par_last_update_rs_times_ms);
-      if (G1Log::finest()) {
-        print_par_stats(3, "Processed Buffers", _par_last_update_rs_processed_buffers,
-          false /* showDecimals */);
-      }
-      print_par_stats(2, "Scan RS", _par_last_scan_rs_times_ms);
-      print_par_stats(2, "Object Copy", _par_last_obj_copy_times_ms);
-      print_par_stats(2, "Termination", _par_last_termination_times_ms);
-      if (G1Log::finest()) {
-        print_par_stats(3, "Termination Attempts", _par_last_termination_attempts,
-          false /* showDecimals */);
-      }
-
-      for (int i = 0; i < _parallel_gc_threads; i++) {
-        _par_last_gc_worker_times_ms[i] = _par_last_gc_worker_end_times_ms[i] -
-                                          _par_last_gc_worker_start_times_ms[i];
-
-        double worker_known_time = _par_last_ext_root_scan_times_ms[i] +
-                                   _par_last_satb_filtering_times_ms[i] +
-                                   _par_last_update_rs_times_ms[i] +
-                                   _par_last_scan_rs_times_ms[i] +
-                                   _par_last_obj_copy_times_ms[i] +
-                                   _par_last_termination_times_ms[i];
-
-        _par_last_gc_worker_other_times_ms[i] = _par_last_gc_worker_times_ms[i] -
-                                                worker_known_time;
-      }
-
-      print_par_stats(2, "GC Worker Other", _par_last_gc_worker_other_times_ms);
-      print_par_stats(2, "GC Worker Total", _par_last_gc_worker_times_ms);
-      print_par_stats(2, "GC Worker End", _par_last_gc_worker_end_times_ms);
-    } else {
-      print_stats(1, "Ext Root Scanning", ext_root_scan_time);
-      if (print_marking_info) {
-        print_stats(1, "SATB Filtering", satb_filtering_time);
-      }
-      print_stats(1, "Update RS", update_rs_time);
-      if (G1Log::finest()) {
-        print_stats(2, "Processed Buffers", (int)update_rs_processed_buffers);
-      }
-      print_stats(1, "Scan RS", scan_rs_time);
-      print_stats(1, "Object Copying", obj_copy_time);
-    }
-    print_stats(1, "Code Root Fixup", _cur_collection_code_root_fixup_time_ms);
-    print_stats(1, "Clear CT", _cur_clear_ct_time_ms);
-#ifndef PRODUCT
-    print_stats(1, "Cur Clear CC", _cur_clear_cc_time_ms);
-    print_stats(1, "Cum Clear CC", _cum_clear_cc_time_ms);
-    print_stats(1, "Min Clear CC", _min_clear_cc_time_ms);
-    print_stats(1, "Max Clear CC", _max_clear_cc_time_ms);
-    if (_num_cc_clears > 0) {
-      print_stats(1, "Avg Clear CC", _cum_clear_cc_time_ms / ((double)_num_cc_clears));
-    }
-#endif
-    print_stats(1, "Other", other_time_ms);
-    print_stats(2, "Choose CSet",
-                   (_recorded_young_cset_choice_time_ms +
-                    _recorded_non_young_cset_choice_time_ms));
-    print_stats(2, "Ref Proc", _cur_ref_proc_time_ms);
-    print_stats(2, "Ref Enq", _cur_ref_enq_time_ms);
-    print_stats(2, "Free CSet",
-                   (_recorded_young_free_cset_time_ms +
-                    _recorded_non_young_free_cset_time_ms));
-  }
-
   bool new_in_marking_window = _in_marking_window;
   bool new_in_marking_window_im = false;
   if (during_initial_mark_pause()) {
@@ -1406,8 +1036,6 @@
   // do that for any other surv rate groupsx
 
   if (update_stats) {
-    double pause_time_ms = elapsed_ms;
-
     size_t diff = 0;
     if (_max_pending_cards >= _pending_cards) {
       diff = _max_pending_cards - _pending_cards;
@@ -1416,7 +1044,7 @@
 
     double cost_per_card_ms = 0.0;
     if (_pending_cards > 0) {
-      cost_per_card_ms = update_rs_time / (double) _pending_cards;
+      cost_per_card_ms = phase_times()->_update_rs_time / (double) _pending_cards;
       _cost_per_card_ms_seq->add(cost_per_card_ms);
     }
 
@@ -1424,7 +1052,7 @@
 
     double cost_per_entry_ms = 0.0;
     if (cards_scanned > 10) {
-      cost_per_entry_ms = scan_rs_time / (double) cards_scanned;
+      cost_per_entry_ms = phase_times()->_scan_rs_time / (double) cards_scanned;
       if (_last_gc_was_young) {
         _cost_per_entry_ms_seq->add(cost_per_entry_ms);
       } else {
@@ -1464,7 +1092,7 @@
     size_t copied_bytes = surviving_bytes;
     double cost_per_byte_ms = 0.0;
     if (copied_bytes > 0) {
-      cost_per_byte_ms = obj_copy_time / (double) copied_bytes;
+      cost_per_byte_ms = phase_times()->_obj_copy_time / (double) copied_bytes;
       if (_in_marking_window) {
         _cost_per_byte_ms_during_cm_seq->add(cost_per_byte_ms);
       } else {
@@ -1473,21 +1101,21 @@
     }
 
     double all_other_time_ms = pause_time_ms -
-      (update_rs_time + scan_rs_time + obj_copy_time + termination_time);
+      (phase_times()->_update_rs_time + phase_times()->_scan_rs_time + phase_times()->_obj_copy_time + phase_times()->_termination_time);
 
     double young_other_time_ms = 0.0;
     if (young_cset_region_length() > 0) {
       young_other_time_ms =
-        _recorded_young_cset_choice_time_ms +
-        _recorded_young_free_cset_time_ms;
+        phase_times()->_recorded_young_cset_choice_time_ms +
+        phase_times()->_recorded_young_free_cset_time_ms;
       _young_other_cost_per_region_ms_seq->add(young_other_time_ms /
                                           (double) young_cset_region_length());
     }
     double non_young_other_time_ms = 0.0;
     if (old_cset_region_length() > 0) {
       non_young_other_time_ms =
-        _recorded_non_young_cset_choice_time_ms +
-        _recorded_non_young_free_cset_time_ms;
+        phase_times()->_recorded_non_young_cset_choice_time_ms +
+        phase_times()->_recorded_non_young_free_cset_time_ms;
 
       _non_young_other_cost_per_region_ms_seq->add(non_young_other_time_ms /
                                             (double) old_cset_region_length());
@@ -1514,7 +1142,7 @@
 
   // Note that _mmu_tracker->max_gc_time() returns the time in seconds.
   double update_rs_time_goal_ms = _mmu_tracker->max_gc_time() * MILLIUNITS * G1RSetUpdatingPauseTimePercent / 100.0;
-  adjust_concurrent_refinement(update_rs_time, update_rs_processed_buffers, update_rs_time_goal_ms);
+  adjust_concurrent_refinement(phase_times()->_update_rs_time, phase_times()->_update_rs_processed_buffers, update_rs_time_goal_ms);
 
   _collectionSetChooser->verify();
 }
@@ -2323,7 +1951,7 @@
   set_recorded_rs_lengths(_inc_cset_recorded_rs_lengths);
 
   double young_end_time_sec = os::elapsedTime();
-  _recorded_young_cset_choice_time_ms =
+  phase_times()->_recorded_young_cset_choice_time_ms =
     (young_end_time_sec - young_start_time_sec) * 1000.0;
 
   // We are doing young collections so reset this.
@@ -2439,7 +2067,7 @@
                 predicted_pause_time_ms, target_pause_time_ms);
 
   double non_young_end_time_sec = os::elapsedTime();
-  _recorded_non_young_cset_choice_time_ms =
+  phase_times()->_recorded_non_young_cset_choice_time_ms =
     (non_young_end_time_sec - non_young_start_time_sec) * 1000.0;
 }
 
@@ -2455,33 +2083,29 @@
   }
 }
 
-void TraceGen0TimeData::record_end_collection(
-     double total_ms,
-     double other_ms,
-     double root_region_scan_wait_ms,
-     double parallel_ms,
-     double ext_root_scan_ms,
-     double satb_filtering_ms,
-     double update_rs_ms,
-     double scan_rs_ms,
-     double obj_copy_ms,
-     double termination_ms,
-     double parallel_other_ms,
-     double clear_ct_ms)
-{
+void TraceGen0TimeData::record_end_collection(double pause_time_ms, G1GCPhaseTimes* phase_times) {
   if(TraceGen0Time) {
-    _total.add(total_ms);
-    _other.add(other_ms);
-    _root_region_scan_wait.add(root_region_scan_wait_ms);
-    _parallel.add(parallel_ms);
-    _ext_root_scan.add(ext_root_scan_ms);
-    _satb_filtering.add(satb_filtering_ms);
-    _update_rs.add(update_rs_ms);
-    _scan_rs.add(scan_rs_ms);
-    _obj_copy.add(obj_copy_ms);
-    _termination.add(termination_ms);
-    _parallel_other.add(parallel_other_ms);
-    _clear_ct.add(clear_ct_ms);
+    _total.add(pause_time_ms);
+    _other.add(pause_time_ms - phase_times->accounted_time_ms());
+    _root_region_scan_wait.add(phase_times->_root_region_scan_wait_time_ms);
+    _parallel.add(phase_times->_cur_collection_par_time_ms);
+    _ext_root_scan.add(phase_times->_ext_root_scan_time);
+    _satb_filtering.add(phase_times->_satb_filtering_time);
+    _update_rs.add(phase_times->_update_rs_time);
+    _scan_rs.add(phase_times->_scan_rs_time);
+    _obj_copy.add(phase_times->_obj_copy_time);
+    _termination.add(phase_times->_termination_time);
+
+    double parallel_known_time = phase_times->_ext_root_scan_time +
+      phase_times->_satb_filtering_time +
+      phase_times->_update_rs_time +
+      phase_times->_scan_rs_time +
+      phase_times->_obj_copy_time +
+      + phase_times->_termination_time;
+
+    double parallel_other_time = phase_times->_cur_collection_par_time_ms - parallel_known_time;
+    _parallel_other.add(parallel_other_time);
+    _clear_ct.add(phase_times->_cur_clear_ct_time_ms);
   }
 }
 
@@ -2497,20 +2121,18 @@
   }
 }
 
-void TraceGen0TimeData::print_summary(int level,
-                                      const char* str,
+void TraceGen0TimeData::print_summary(const char* str,
                                       const NumberSeq* seq) const {
   double sum = seq->sum();
-  LineBuffer(level + 1).append_and_print_cr("%-24s = %8.2lf s (avg = %8.2lf ms)",
+  gclog_or_tty->print_cr("%-27s = %8.2lf s (avg = %8.2lf ms)",
                 str, sum / 1000.0, seq->avg());
 }
 
-void TraceGen0TimeData::print_summary_sd(int level,
-                                         const char* str,
+void TraceGen0TimeData::print_summary_sd(const char* str,
                                          const NumberSeq* seq) const {
-  print_summary(level, str, seq);
-  LineBuffer(level + 6).append_and_print_cr("(num = %5d, std dev = %8.2lf ms, max = %8.2lf ms)",
-                seq->num(), seq->sd(), seq->maximum());
+  print_summary(str, seq);
+  gclog_or_tty->print_cr("%+45s = %5d, std dev = %8.2lf ms, max = %8.2lf ms)",
+                "(num", seq->num(), seq->sd(), seq->maximum());
 }
 
 void TraceGen0TimeData::print() const {
@@ -2519,7 +2141,7 @@
   }
 
   gclog_or_tty->print_cr("ALL PAUSES");
-  print_summary_sd(0, "Total", &_total);
+  print_summary_sd("   Total", &_total);
   gclog_or_tty->print_cr("");
   gclog_or_tty->print_cr("");
   gclog_or_tty->print_cr("   Young GC Pauses: %8d", _young_pause_num);
@@ -2531,24 +2153,24 @@
   if (_young_pause_num == 0 && _mixed_pause_num == 0) {
     gclog_or_tty->print_cr("none");
   } else {
-    print_summary_sd(0, "Evacuation Pauses", &_total);
-    print_summary(1, "Root Region Scan Wait", &_root_region_scan_wait);
-    print_summary(1, "Parallel Time", &_parallel);
-    print_summary(2, "Ext Root Scanning", &_ext_root_scan);
-    print_summary(2, "SATB Filtering", &_satb_filtering);
-    print_summary(2, "Update RS", &_update_rs);
-    print_summary(2, "Scan RS", &_scan_rs);
-    print_summary(2, "Object Copy", &_obj_copy);
-    print_summary(2, "Termination", &_termination);
-    print_summary(2, "Parallel Other", &_parallel_other);
-    print_summary(1, "Clear CT", &_clear_ct);
-    print_summary(1, "Other", &_other);
+    print_summary_sd("   Evacuation Pauses", &_total);
+    print_summary("      Root Region Scan Wait", &_root_region_scan_wait);
+    print_summary("      Parallel Time", &_parallel);
+    print_summary("         Ext Root Scanning", &_ext_root_scan);
+    print_summary("         SATB Filtering", &_satb_filtering);
+    print_summary("         Update RS", &_update_rs);
+    print_summary("         Scan RS", &_scan_rs);
+    print_summary("         Object Copy", &_obj_copy);
+    print_summary("         Termination", &_termination);
+    print_summary("         Parallel Other", &_parallel_other);
+    print_summary("      Clear CT", &_clear_ct);
+    print_summary("      Other", &_other);
   }
   gclog_or_tty->print_cr("");
 
   gclog_or_tty->print_cr("MISC");
-  print_summary_sd(0, "Stop World", &_all_stop_world_times_ms);
-  print_summary_sd(0, "Yields", &_all_yield_times_ms);
+  print_summary_sd("   Stop World", &_all_stop_world_times_ms);
+  print_summary_sd("   Yields", &_all_yield_times_ms);
 }
 
 void TraceGen1TimeData::record_full_collection(double full_gc_time_ms) {
--- a/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -36,11 +36,12 @@
 
 class HeapRegion;
 class CollectionSetChooser;
+class G1GCPhaseTimes;
 
 // TraceGen0Time collects data on _both_ young and mixed evacuation pauses
 // (the latter may contain non-young regions - i.e. regions that are
 // technically in Gen1) while TraceGen1Time collects data about full GCs.
-class TraceGen0TimeData : public CHeapObj {
+class TraceGen0TimeData : public CHeapObj<mtGC> {
  private:
   unsigned  _young_pause_num;
   unsigned  _mixed_pause_num;
@@ -61,32 +62,20 @@
   NumberSeq _parallel_other;
   NumberSeq _clear_ct;
 
-  void print_summary (int level, const char* str, const NumberSeq* seq) const;
-  void print_summary_sd (int level, const char* str, const NumberSeq* seq) const;
+  void print_summary(const char* str, const NumberSeq* seq) const;
+  void print_summary_sd(const char* str, const NumberSeq* seq) const;
 
 public:
    TraceGen0TimeData() : _young_pause_num(0), _mixed_pause_num(0) {};
   void record_start_collection(double time_to_stop_the_world_ms);
   void record_yield_time(double yield_time_ms);
-  void record_end_collection(
-     double total_ms,
-     double other_ms,
-     double root_region_scan_wait_ms,
-     double parallel_ms,
-     double ext_root_scan_ms,
-     double satb_filtering_ms,
-     double update_rs_ms,
-     double scan_rs_ms,
-     double obj_copy_ms,
-     double termination_ms,
-     double parallel_other_ms,
-     double clear_ct_ms);
+  void record_end_collection(double pause_time_ms, G1GCPhaseTimes* phase_times);
   void increment_young_collection_count();
   void increment_mixed_collection_count();
   void print() const;
 };
 
-class TraceGen1TimeData : public CHeapObj {
+class TraceGen1TimeData : public CHeapObj<mtGC> {
  private:
   NumberSeq _all_full_gc_times;
 
@@ -131,7 +120,7 @@
 //
 // NewSize and MaxNewSize override NewRatio. So, NewRatio is ignored if it is
 // combined with either NewSize or MaxNewSize. (A warning message is printed.)
-class G1YoungGenSizer : public CHeapObj {
+class G1YoungGenSizer : public CHeapObj<mtGC> {
 private:
   enum SizerKind {
     SizerDefaults,
@@ -186,25 +175,9 @@
 
   CollectionSetChooser* _collectionSetChooser;
 
-  double _cur_collection_start_sec;
+  double _full_collection_start_sec;
   size_t _cur_collection_pause_used_at_start_bytes;
   uint   _cur_collection_pause_used_regions_at_start;
-  double _cur_collection_par_time_ms;
-
-  double _cur_collection_code_root_fixup_time_ms;
-
-  double _cur_clear_ct_time_ms;
-  double _cur_ref_proc_time_ms;
-  double _cur_ref_enq_time_ms;
-
-#ifndef PRODUCT
-  // Card Table Count Cache stats
-  double _min_clear_cc_time_ms;         // min
-  double _max_clear_cc_time_ms;         // max
-  double _cur_clear_cc_time_ms;         // clearing time during current pause
-  double _cum_clear_cc_time_ms;         // cummulative clearing time
-  jlong  _num_cc_clears;                // number of times the card count cache has been cleared
-#endif
 
   // These exclude marking times.
   TruncatedSeq* _recent_gc_times_ms;
@@ -217,23 +190,6 @@
 
   double _stop_world_start;
 
-  double* _par_last_gc_worker_start_times_ms;
-  double* _par_last_ext_root_scan_times_ms;
-  double* _par_last_satb_filtering_times_ms;
-  double* _par_last_update_rs_times_ms;
-  double* _par_last_update_rs_processed_buffers;
-  double* _par_last_scan_rs_times_ms;
-  double* _par_last_obj_copy_times_ms;
-  double* _par_last_termination_times_ms;
-  double* _par_last_termination_attempts;
-  double* _par_last_gc_worker_end_times_ms;
-  double* _par_last_gc_worker_times_ms;
-
-  // Each workers 'other' time i.e. the elapsed time of the parallel
-  // code executed by a worker minus the sum of the individual sub-phase
-  // times for that worker thread.
-  double* _par_last_gc_worker_other_times_ms;
-
   // indicates whether we are in young or mixed GC mode
   bool _gcs_are_young;
 
@@ -306,10 +262,6 @@
 
   size_t _recorded_rs_lengths;
   size_t _max_rs_lengths;
-
-  double _recorded_young_free_cset_time_ms;
-  double _recorded_non_young_free_cset_time_ms;
-
   double _sigma;
 
   size_t _rs_lengths_prediction;
@@ -341,8 +293,7 @@
   void set_no_of_gc_threads(uintx v) { _no_of_gc_threads = v; }
 
   double _pause_time_target_ms;
-  double _recorded_young_cset_choice_time_ms;
-  double _recorded_non_young_cset_choice_time_ms;
+
   size_t _pending_cards;
   size_t _max_pending_cards;
 
@@ -497,14 +448,6 @@
   uint young_cset_region_length() { return eden_cset_region_length() +
                                            survivor_cset_region_length(); }
 
-  void record_young_free_cset_time_ms(double time_ms) {
-    _recorded_young_free_cset_time_ms = time_ms;
-  }
-
-  void record_non_young_free_cset_time_ms(double time_ms) {
-    _recorded_non_young_free_cset_time_ms = time_ms;
-  }
-
   double predict_survivor_regions_evac_time();
 
   void cset_regions_freed() {
@@ -552,19 +495,6 @@
   }
 
 private:
-  void print_stats(int level, const char* str, double value);
-  void print_stats(int level, const char* str, double value, int workers);
-  void print_stats(int level, const char* str, int value);
-
-  void print_par_stats(int level, const char* str, double* data, bool showDecimals = true);
-
-  double avg_value (double* data);
-  double max_value (double* data);
-  double sum_of_values (double* data);
-  double max_sum (double* data1, double* data2);
-
-  double _last_pause_time_ms;
-
   size_t _bytes_in_collection_set_before_gc;
   size_t _bytes_copied_during_gc;
 
@@ -638,6 +568,8 @@
   // Stash a pointer to the g1 heap.
   G1CollectedHeap* _g1;
 
+  G1GCPhaseTimes* _phase_times;
+
   // The ratio of gc time to elapsed time, computed over recent pauses.
   double _recent_avg_pause_time_ratio;
 
@@ -677,7 +609,6 @@
   double _cur_mark_stop_world_time_ms;
   double _mark_remark_start_sec;
   double _mark_cleanup_start_sec;
-  double _root_region_scan_wait_time_ms;
 
   // Update the young list target length either by setting it to the
   // desired fixed value or by calculating it using G1's pause
@@ -728,6 +659,8 @@
     return CollectorPolicy::G1CollectorPolicyKind;
   }
 
+  G1GCPhaseTimes* phase_times() const { return _phase_times; }
+
   // Check the current value of the young list RSet lengths and
   // compare it against the last prediction. If the current value is
   // higher, recalculate the young list target length prediction.
@@ -772,10 +705,6 @@
   void record_concurrent_mark_init_end(double
                                            mark_init_elapsed_time_ms);
 
-  void record_root_region_scan_wait_time(double time_ms) {
-    _root_region_scan_wait_time_ms = time_ms;
-  }
-
   void record_concurrent_mark_remark_start();
   void record_concurrent_mark_remark_end();
 
@@ -784,97 +713,14 @@
   void record_concurrent_mark_cleanup_completed();
 
   void record_concurrent_pause();
-  void record_concurrent_pause_end();
 
-  void record_collection_pause_end(int no_of_gc_threads);
+  void record_collection_pause_end(double pause_time);
   void print_heap_transition();
 
   // Record the fact that a full collection occurred.
   void record_full_collection_start();
   void record_full_collection_end();
 
-  void record_gc_worker_start_time(int worker_i, double ms) {
-    _par_last_gc_worker_start_times_ms[worker_i] = ms;
-  }
-
-  void record_ext_root_scan_time(int worker_i, double ms) {
-    _par_last_ext_root_scan_times_ms[worker_i] = ms;
-  }
-
-  void record_satb_filtering_time(int worker_i, double ms) {
-    _par_last_satb_filtering_times_ms[worker_i] = ms;
-  }
-
-  void record_update_rs_time(int thread, double ms) {
-    _par_last_update_rs_times_ms[thread] = ms;
-  }
-
-  void record_update_rs_processed_buffers (int thread,
-                                           double processed_buffers) {
-    _par_last_update_rs_processed_buffers[thread] = processed_buffers;
-  }
-
-  void record_scan_rs_time(int thread, double ms) {
-    _par_last_scan_rs_times_ms[thread] = ms;
-  }
-
-  void reset_obj_copy_time(int thread) {
-    _par_last_obj_copy_times_ms[thread] = 0.0;
-  }
-
-  void reset_obj_copy_time() {
-    reset_obj_copy_time(0);
-  }
-
-  void record_obj_copy_time(int thread, double ms) {
-    _par_last_obj_copy_times_ms[thread] += ms;
-  }
-
-  void record_termination(int thread, double ms, size_t attempts) {
-    _par_last_termination_times_ms[thread] = ms;
-    _par_last_termination_attempts[thread] = (double) attempts;
-  }
-
-  void record_gc_worker_end_time(int worker_i, double ms) {
-    _par_last_gc_worker_end_times_ms[worker_i] = ms;
-  }
-
-  void record_pause_time_ms(double ms) {
-    _last_pause_time_ms = ms;
-  }
-
-  void record_clear_ct_time(double ms) {
-    _cur_clear_ct_time_ms = ms;
-  }
-
-  void record_par_time(double ms) {
-    _cur_collection_par_time_ms = ms;
-  }
-
-  void record_code_root_fixup_time(double ms) {
-    _cur_collection_code_root_fixup_time_ms = ms;
-  }
-
-  void record_ref_proc_time(double ms) {
-    _cur_ref_proc_time_ms = ms;
-  }
-
-  void record_ref_enq_time(double ms) {
-    _cur_ref_enq_time_ms = ms;
-  }
-
-#ifndef PRODUCT
-  void record_cc_clear_time(double ms) {
-    if (_min_clear_cc_time_ms < 0.0 || ms <= _min_clear_cc_time_ms)
-      _min_clear_cc_time_ms = ms;
-    if (_max_clear_cc_time_ms < 0.0 || ms >= _max_clear_cc_time_ms)
-      _max_clear_cc_time_ms = ms;
-    _cur_clear_cc_time_ms = ms;
-    _cum_clear_cc_time_ms += ms;
-    _num_cc_clears++;
-  }
-#endif
-
   // Record how much space we copied during a GC. This is typically
   // called when a GC alloc region is being retired.
   void record_bytes_copied_during_gc(size_t bytes) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/gc_implementation/g1/g1GCPhaseTimes.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,379 @@
+/*
+ * 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.
+ *
+ */
+
+
+#include "precompiled.hpp"
+#include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
+#include "gc_implementation/g1/g1GCPhaseTimes.hpp"
+#include "gc_implementation/g1/g1Log.hpp"
+
+// Helper class for avoiding interleaved logging
+class LineBuffer: public StackObj {
+
+private:
+  static const int BUFFER_LEN = 1024;
+  static const int INDENT_CHARS = 3;
+  char _buffer[BUFFER_LEN];
+  int _indent_level;
+  int _cur;
+
+  void vappend(const char* format, va_list ap) {
+    int res = vsnprintf(&_buffer[_cur], BUFFER_LEN - _cur, format, ap);
+    if (res != -1) {
+      _cur += res;
+    } else {
+      DEBUG_ONLY(warning("buffer too small in LineBuffer");)
+      _buffer[BUFFER_LEN -1] = 0;
+      _cur = BUFFER_LEN; // vsnprintf above should not add to _buffer if we are called again
+    }
+  }
+
+public:
+  explicit LineBuffer(int indent_level): _indent_level(indent_level), _cur(0) {
+    for (; (_cur < BUFFER_LEN && _cur < (_indent_level * INDENT_CHARS)); _cur++) {
+      _buffer[_cur] = ' ';
+    }
+  }
+
+#ifndef PRODUCT
+  ~LineBuffer() {
+    assert(_cur == _indent_level * INDENT_CHARS, "pending data in buffer - append_and_print_cr() not called?");
+  }
+#endif
+
+  void append(const char* format, ...) {
+    va_list ap;
+    va_start(ap, format);
+    vappend(format, ap);
+    va_end(ap);
+  }
+
+  void append_and_print_cr(const char* format, ...) {
+    va_list ap;
+    va_start(ap, format);
+    vappend(format, ap);
+    va_end(ap);
+    gclog_or_tty->print_cr("%s", _buffer);
+    _cur = _indent_level * INDENT_CHARS;
+  }
+};
+
+G1GCPhaseTimes::G1GCPhaseTimes(uint max_gc_threads) :
+  _max_gc_threads(max_gc_threads),
+  _min_clear_cc_time_ms(-1.0),
+  _max_clear_cc_time_ms(-1.0),
+  _cur_clear_cc_time_ms(0.0),
+  _cum_clear_cc_time_ms(0.0),
+  _num_cc_clears(0L)
+{
+  assert(max_gc_threads > 0, "Must have some GC threads");
+  _par_last_gc_worker_start_times_ms = new double[_max_gc_threads];
+  _par_last_ext_root_scan_times_ms = new double[_max_gc_threads];
+  _par_last_satb_filtering_times_ms = new double[_max_gc_threads];
+  _par_last_update_rs_times_ms = new double[_max_gc_threads];
+  _par_last_update_rs_processed_buffers = new double[_max_gc_threads];
+  _par_last_scan_rs_times_ms = new double[_max_gc_threads];
+  _par_last_obj_copy_times_ms = new double[_max_gc_threads];
+  _par_last_termination_times_ms = new double[_max_gc_threads];
+  _par_last_termination_attempts = new double[_max_gc_threads];
+  _par_last_gc_worker_end_times_ms = new double[_max_gc_threads];
+  _par_last_gc_worker_times_ms = new double[_max_gc_threads];
+  _par_last_gc_worker_other_times_ms = new double[_max_gc_threads];
+}
+
+void G1GCPhaseTimes::note_gc_start(double pause_start_time_sec, uint active_gc_threads,
+  bool is_young_gc, bool is_initial_mark_gc, GCCause::Cause gc_cause) {
+  assert(active_gc_threads > 0, "The number of threads must be > 0");
+  assert(active_gc_threads <= _max_gc_threads, "The number of active threads must be <= the max nubmer of threads");
+  _active_gc_threads = active_gc_threads;
+  _pause_start_time_sec = pause_start_time_sec;
+  _is_young_gc = is_young_gc;
+  _is_initial_mark_gc = is_initial_mark_gc;
+  _gc_cause = gc_cause;
+
+#ifdef ASSERT
+  // initialise the timing data to something well known so that we can spot
+  // if something is not set properly
+
+  for (uint i = 0; i < _max_gc_threads; ++i) {
+    _par_last_gc_worker_start_times_ms[i] = -1234.0;
+    _par_last_ext_root_scan_times_ms[i] = -1234.0;
+    _par_last_satb_filtering_times_ms[i] = -1234.0;
+    _par_last_update_rs_times_ms[i] = -1234.0;
+    _par_last_update_rs_processed_buffers[i] = -1234.0;
+    _par_last_scan_rs_times_ms[i] = -1234.0;
+    _par_last_obj_copy_times_ms[i] = -1234.0;
+    _par_last_termination_times_ms[i] = -1234.0;
+    _par_last_termination_attempts[i] = -1234.0;
+    _par_last_gc_worker_end_times_ms[i] = -1234.0;
+    _par_last_gc_worker_times_ms[i] = -1234.0;
+    _par_last_gc_worker_other_times_ms[i] = -1234.0;
+  }
+#endif
+}
+
+void G1GCPhaseTimes::note_gc_end(double pause_end_time_sec) {
+  if (G1Log::fine()) {
+    double pause_time_ms = (pause_end_time_sec - _pause_start_time_sec) * MILLIUNITS;
+
+    for (uint i = 0; i < _active_gc_threads; i++) {
+      _par_last_gc_worker_times_ms[i] = _par_last_gc_worker_end_times_ms[i] -
+        _par_last_gc_worker_start_times_ms[i];
+
+      double worker_known_time = _par_last_ext_root_scan_times_ms[i] +
+        _par_last_satb_filtering_times_ms[i] +
+        _par_last_update_rs_times_ms[i] +
+        _par_last_scan_rs_times_ms[i] +
+        _par_last_obj_copy_times_ms[i] +
+        _par_last_termination_times_ms[i];
+
+      _par_last_gc_worker_other_times_ms[i] = _par_last_gc_worker_times_ms[i] -
+        worker_known_time;
+    }
+
+    print(pause_time_ms);
+  }
+
+}
+
+void G1GCPhaseTimes::print_par_stats(int level,
+                                        const char* str,
+                                        double* data,
+                                        bool showDecimals) {
+  double min = data[0], max = data[0];
+  double total = 0.0;
+  LineBuffer buf(level);
+  buf.append("[%s (ms):", str);
+  for (uint i = 0; i < _active_gc_threads; ++i) {
+    double val = data[i];
+    if (val < min)
+      min = val;
+    if (val > max)
+      max = val;
+    total += val;
+    if (G1Log::finest()) {
+      if (showDecimals) {
+        buf.append("  %.1lf", val);
+      } else {
+        buf.append("  %d", (int)val);
+      }
+    }
+  }
+
+  if (G1Log::finest()) {
+    buf.append_and_print_cr("");
+  }
+  double avg = total / (double) _active_gc_threads;
+  if (showDecimals) {
+    buf.append_and_print_cr(" Min: %.1lf, Avg: %.1lf, Max: %.1lf, Diff: %.1lf, Sum: %.1lf]",
+      min, avg, max, max - min, total);
+  } else {
+    buf.append_and_print_cr(" Min: %d, Avg: %d, Max: %d, Diff: %d, Sum: %d]",
+      (int)min, (int)avg, (int)max, (int)max - (int)min, (int)total);
+  }
+}
+
+void G1GCPhaseTimes::print_stats(int level, const char* str, double value) {
+  LineBuffer(level).append_and_print_cr("[%s: %.1lf ms]", str, value);
+}
+
+void G1GCPhaseTimes::print_stats(int level, const char* str, double value, int workers) {
+  LineBuffer(level).append_and_print_cr("[%s: %.1lf ms, GC Workers: %d]", str, value, workers);
+}
+
+void G1GCPhaseTimes::print_stats(int level, const char* str, int value) {
+  LineBuffer(level).append_and_print_cr("[%s: %d]", str, value);
+}
+
+double G1GCPhaseTimes::avg_value(double* data) {
+  if (G1CollectedHeap::use_parallel_gc_threads()) {
+    double ret = 0.0;
+    for (uint i = 0; i < _active_gc_threads; ++i) {
+      ret += data[i];
+    }
+    return ret / (double) _active_gc_threads;
+  } else {
+    return data[0];
+  }
+}
+
+double G1GCPhaseTimes::max_value(double* data) {
+  if (G1CollectedHeap::use_parallel_gc_threads()) {
+    double ret = data[0];
+    for (uint i = 1; i < _active_gc_threads; ++i) {
+      if (data[i] > ret) {
+        ret = data[i];
+      }
+    }
+    return ret;
+  } else {
+    return data[0];
+  }
+}
+
+double G1GCPhaseTimes::sum_of_values(double* data) {
+  if (G1CollectedHeap::use_parallel_gc_threads()) {
+    double sum = 0.0;
+    for (uint i = 0; i < _active_gc_threads; i++) {
+      sum += data[i];
+    }
+    return sum;
+  } else {
+    return data[0];
+  }
+}
+
+double G1GCPhaseTimes::max_sum(double* data1, double* data2) {
+  double ret = data1[0] + data2[0];
+
+  if (G1CollectedHeap::use_parallel_gc_threads()) {
+    for (uint i = 1; i < _active_gc_threads; ++i) {
+      double data = data1[i] + data2[i];
+      if (data > ret) {
+        ret = data;
+      }
+    }
+  }
+  return ret;
+}
+
+void G1GCPhaseTimes::collapse_par_times() {
+    _ext_root_scan_time = avg_value(_par_last_ext_root_scan_times_ms);
+    _satb_filtering_time = avg_value(_par_last_satb_filtering_times_ms);
+    _update_rs_time = avg_value(_par_last_update_rs_times_ms);
+    _update_rs_processed_buffers =
+      sum_of_values(_par_last_update_rs_processed_buffers);
+    _scan_rs_time = avg_value(_par_last_scan_rs_times_ms);
+    _obj_copy_time = avg_value(_par_last_obj_copy_times_ms);
+    _termination_time = avg_value(_par_last_termination_times_ms);
+}
+
+double G1GCPhaseTimes::accounted_time_ms() {
+    // Subtract the root region scanning wait time. It's initialized to
+    // zero at the start of the pause.
+    double misc_time_ms = _root_region_scan_wait_time_ms;
+
+    misc_time_ms += _cur_collection_par_time_ms;
+
+    // Now subtract the time taken to fix up roots in generated code
+    misc_time_ms += _cur_collection_code_root_fixup_time_ms;
+
+    // Subtract the time taken to clean the card table from the
+    // current value of "other time"
+    misc_time_ms += _cur_clear_ct_time_ms;
+
+    return misc_time_ms;
+}
+
+void G1GCPhaseTimes::print(double pause_time_ms) {
+
+  if (PrintGCTimeStamps) {
+    gclog_or_tty->stamp();
+    gclog_or_tty->print(": ");
+  }
+
+  GCCauseString gc_cause_str = GCCauseString("GC pause", _gc_cause)
+    .append(_is_young_gc ? " (young)" : " (mixed)")
+    .append(_is_initial_mark_gc ? " (initial-mark)" : "");
+  gclog_or_tty->print_cr("[%s, %3.7f secs]", (const char*)gc_cause_str, pause_time_ms / 1000.0);
+
+  if (!G1Log::finer()) {
+    return;
+  }
+
+  if (_root_region_scan_wait_time_ms > 0.0) {
+    print_stats(1, "Root Region Scan Waiting", _root_region_scan_wait_time_ms);
+  }
+  if (G1CollectedHeap::use_parallel_gc_threads()) {
+    print_stats(1, "Parallel Time", _cur_collection_par_time_ms, _active_gc_threads);
+    print_par_stats(2, "GC Worker Start", _par_last_gc_worker_start_times_ms);
+    print_par_stats(2, "Ext Root Scanning", _par_last_ext_root_scan_times_ms);
+    if (_satb_filtering_time > 0.0) {
+      print_par_stats(2, "SATB Filtering", _par_last_satb_filtering_times_ms);
+    }
+    print_par_stats(2, "Update RS", _par_last_update_rs_times_ms);
+    if (G1Log::finest()) {
+      print_par_stats(3, "Processed Buffers", _par_last_update_rs_processed_buffers,
+        false /* showDecimals */);
+    }
+    print_par_stats(2, "Scan RS", _par_last_scan_rs_times_ms);
+    print_par_stats(2, "Object Copy", _par_last_obj_copy_times_ms);
+    print_par_stats(2, "Termination", _par_last_termination_times_ms);
+    if (G1Log::finest()) {
+      print_par_stats(3, "Termination Attempts", _par_last_termination_attempts,
+        false /* showDecimals */);
+    }
+    print_par_stats(2, "GC Worker Other", _par_last_gc_worker_other_times_ms);
+    print_par_stats(2, "GC Worker Total", _par_last_gc_worker_times_ms);
+    print_par_stats(2, "GC Worker End", _par_last_gc_worker_end_times_ms);
+  } else {
+    print_stats(1, "Ext Root Scanning", _ext_root_scan_time);
+    if (_satb_filtering_time > 0.0) {
+      print_stats(1, "SATB Filtering", _satb_filtering_time);
+    }
+    print_stats(1, "Update RS", _update_rs_time);
+    if (G1Log::finest()) {
+      print_stats(2, "Processed Buffers", (int)_update_rs_processed_buffers);
+    }
+    print_stats(1, "Scan RS", _scan_rs_time);
+    print_stats(1, "Object Copying", _obj_copy_time);
+  }
+  print_stats(1, "Code Root Fixup", _cur_collection_code_root_fixup_time_ms);
+  print_stats(1, "Clear CT", _cur_clear_ct_time_ms);
+  if (Verbose && G1Log::finest()) {
+    print_stats(1, "Cur Clear CC", _cur_clear_cc_time_ms);
+    print_stats(1, "Cum Clear CC", _cum_clear_cc_time_ms);
+    print_stats(1, "Min Clear CC", _min_clear_cc_time_ms);
+    print_stats(1, "Max Clear CC", _max_clear_cc_time_ms);
+    if (_num_cc_clears > 0) {
+      print_stats(1, "Avg Clear CC", _cum_clear_cc_time_ms / ((double)_num_cc_clears));
+    }
+  }
+  double misc_time_ms = pause_time_ms - accounted_time_ms();
+  print_stats(1, "Other", misc_time_ms);
+  print_stats(2, "Choose CSet",
+    (_recorded_young_cset_choice_time_ms +
+    _recorded_non_young_cset_choice_time_ms));
+  print_stats(2, "Ref Proc", _cur_ref_proc_time_ms);
+  print_stats(2, "Ref Enq", _cur_ref_enq_time_ms);
+  print_stats(2, "Free CSet",
+    (_recorded_young_free_cset_time_ms +
+    _recorded_non_young_free_cset_time_ms));
+}
+
+void G1GCPhaseTimes::record_cc_clear_time_ms(double ms) {
+  if (!(Verbose && G1Log::finest())) {
+    return;
+  }
+
+  if (_min_clear_cc_time_ms < 0.0 || ms <= _min_clear_cc_time_ms) {
+    _min_clear_cc_time_ms = ms;
+  }
+  if (_max_clear_cc_time_ms < 0.0 || ms >= _max_clear_cc_time_ms) {
+    _max_clear_cc_time_ms = ms;
+  }
+  _cur_clear_cc_time_ms = ms;
+  _cum_clear_cc_time_ms += ms;
+  _num_cc_clears++;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/gc_implementation/g1/g1GCPhaseTimes.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,216 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP
+#define SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP
+
+#include "memory/allocation.hpp"
+#include "gc_interface/gcCause.hpp"
+
+class G1GCPhaseTimes : public CHeapObj<mtGC> {
+  friend class G1CollectorPolicy;
+  friend class TraceGen0TimeData;
+
+ private:
+  uint _active_gc_threads;
+  uint _max_gc_threads;
+
+  GCCause::Cause _gc_cause;
+  bool           _is_young_gc;
+  bool           _is_initial_mark_gc;
+
+  double _pause_start_time_sec;
+
+  double* _par_last_gc_worker_start_times_ms;
+  double* _par_last_ext_root_scan_times_ms;
+  double* _par_last_satb_filtering_times_ms;
+  double* _par_last_update_rs_times_ms;
+  double* _par_last_update_rs_processed_buffers;
+  double* _par_last_scan_rs_times_ms;
+  double* _par_last_obj_copy_times_ms;
+  double* _par_last_termination_times_ms;
+  double* _par_last_termination_attempts;
+  double* _par_last_gc_worker_end_times_ms;
+  double* _par_last_gc_worker_times_ms;
+  double* _par_last_gc_worker_other_times_ms;
+
+  double _cur_collection_par_time_ms;
+
+  double _cur_collection_code_root_fixup_time_ms;
+
+  double _cur_clear_ct_time_ms;
+  double _cur_ref_proc_time_ms;
+  double _cur_ref_enq_time_ms;
+
+  // Helper methods for detailed logging
+  void print_par_stats(int level, const char* str, double* data, bool showDecimals = true);
+  void print_stats(int level, const char* str, double value);
+  void print_stats(int level, const char* str, double value, int workers);
+  void print_stats(int level, const char* str, int value);
+  double avg_value(double* data);
+  double max_value(double* data);
+  double sum_of_values(double* data);
+  double max_sum(double* data1, double* data2);
+  double accounted_time_ms();
+
+  // Card Table Count Cache stats
+  double _min_clear_cc_time_ms;         // min
+  double _max_clear_cc_time_ms;         // max
+  double _cur_clear_cc_time_ms;         // clearing time during current pause
+  double _cum_clear_cc_time_ms;         // cummulative clearing time
+  jlong  _num_cc_clears;                // number of times the card count cache has been cleared
+
+  // The following insance variables are directly accessed by G1CollectorPolicy
+  // and TraceGen0TimeData. This is why those classes are declared friends.
+  // An alternative is to add getters and setters for all of these fields.
+  // It might also be possible to restructure the code to reduce these
+  // dependencies.
+  double _ext_root_scan_time;
+  double _satb_filtering_time;
+  double _update_rs_time;
+  double _update_rs_processed_buffers;
+  double _scan_rs_time;
+  double _obj_copy_time;
+  double _termination_time;
+
+  double _cur_collection_start_sec;
+  double _root_region_scan_wait_time_ms;
+
+  double _recorded_young_cset_choice_time_ms;
+  double _recorded_non_young_cset_choice_time_ms;
+
+  double _recorded_young_free_cset_time_ms;
+  double _recorded_non_young_free_cset_time_ms;
+
+  void print(double pause_time_ms);
+
+ public:
+  G1GCPhaseTimes(uint max_gc_threads);
+  void note_gc_start(double pause_start_time_sec, uint active_gc_threads,
+    bool is_young_gc, bool is_initial_mark_gc, GCCause::Cause gc_cause);
+  void note_gc_end(double pause_end_time_sec);
+  void collapse_par_times();
+
+  void record_gc_worker_start_time(uint worker_i, double ms) {
+    assert(worker_i >= 0, "worker index must be > 0");
+    assert(worker_i < _active_gc_threads, "worker index out of bounds");
+    _par_last_gc_worker_start_times_ms[worker_i] = ms;
+  }
+
+  void record_ext_root_scan_time(uint worker_i, double ms) {
+    assert(worker_i >= 0, "worker index must be > 0");
+    assert(worker_i < _active_gc_threads, "worker index out of bounds");
+    _par_last_ext_root_scan_times_ms[worker_i] = ms;
+  }
+
+  void record_satb_filtering_time(uint worker_i, double ms) {
+    assert(worker_i >= 0, "worker index must be > 0");
+    assert(worker_i < _active_gc_threads, "worker index out of bounds");
+    _par_last_satb_filtering_times_ms[worker_i] = ms;
+  }
+
+  void record_update_rs_time(uint worker_i, double ms) {
+    assert(worker_i >= 0, "worker index must be > 0");
+    assert(worker_i < _active_gc_threads, "worker index out of bounds");
+    _par_last_update_rs_times_ms[worker_i] = ms;
+  }
+
+  void record_update_rs_processed_buffers (uint worker_i,
+                                           double processed_buffers) {
+    assert(worker_i >= 0, "worker index must be > 0");
+    assert(worker_i < _active_gc_threads, "worker index out of bounds");
+    _par_last_update_rs_processed_buffers[worker_i] = processed_buffers;
+  }
+
+  void record_scan_rs_time(uint worker_i, double ms) {
+    assert(worker_i >= 0, "worker index must be > 0");
+    assert(worker_i < _active_gc_threads, "worker index out of bounds");
+    _par_last_scan_rs_times_ms[worker_i] = ms;
+  }
+
+  void reset_obj_copy_time(uint worker_i) {
+    assert(worker_i >= 0, "worker index must be > 0");
+    assert(worker_i < _active_gc_threads, "worker index out of bounds");
+    _par_last_obj_copy_times_ms[worker_i] = 0.0;
+  }
+
+  void reset_obj_copy_time() {
+    reset_obj_copy_time(0);
+  }
+
+  void record_obj_copy_time(uint worker_i, double ms) {
+    assert(worker_i >= 0, "worker index must be > 0");
+    assert(worker_i < _active_gc_threads, "worker index out of bounds");
+    _par_last_obj_copy_times_ms[worker_i] += ms;
+  }
+
+  void record_termination(uint worker_i, double ms, size_t attempts) {
+    assert(worker_i >= 0, "worker index must be > 0");
+    assert(worker_i < _active_gc_threads, "worker index out of bounds");
+    _par_last_termination_times_ms[worker_i] = ms;
+    _par_last_termination_attempts[worker_i] = (double) attempts;
+  }
+
+  void record_gc_worker_end_time(uint worker_i, double ms) {
+    assert(worker_i >= 0, "worker index must be > 0");
+    assert(worker_i < _active_gc_threads, "worker index out of bounds");
+    _par_last_gc_worker_end_times_ms[worker_i] = ms;
+  }
+
+  void record_clear_ct_time(double ms) {
+    _cur_clear_ct_time_ms = ms;
+  }
+
+  void record_par_time(double ms) {
+    _cur_collection_par_time_ms = ms;
+  }
+
+  void record_code_root_fixup_time(double ms) {
+    _cur_collection_code_root_fixup_time_ms = ms;
+  }
+
+  void record_ref_proc_time(double ms) {
+    _cur_ref_proc_time_ms = ms;
+  }
+
+  void record_ref_enq_time(double ms) {
+    _cur_ref_enq_time_ms = ms;
+  }
+
+  void record_root_region_scan_wait_time(double time_ms) {
+    _root_region_scan_wait_time_ms = time_ms;
+  }
+
+  void record_cc_clear_time_ms(double ms);
+
+  void record_young_free_cset_time_ms(double time_ms) {
+    _recorded_young_free_cset_time_ms = time_ms;
+  }
+
+  void record_non_young_free_cset_time_ms(double time_ms) {
+    _recorded_non_young_free_cset_time_ms = time_ms;
+  }
+};
+
+#endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP
--- a/src/share/vm/gc_implementation/g1/g1MMUTracker.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/g1MMUTracker.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -34,7 +34,7 @@
 /***** ALL TIMES ARE IN SECS!!!!!!! *****/
 
 // this is the "interface"
-class G1MMUTracker: public CHeapObj {
+class G1MMUTracker: public CHeapObj<mtGC> {
 protected:
   double          _time_slice;
   double          _max_gc_time; // this is per time slice
--- a/src/share/vm/gc_implementation/g1/g1MonitoringSupport.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/g1MonitoringSupport.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -112,7 +112,7 @@
 // do which is important as we want to keep the eden region allocation
 // path as low-overhead as possible.
 
-class G1MonitoringSupport : public CHeapObj {
+class G1MonitoringSupport : public CHeapObj<mtGC> {
   friend class VMStructs;
 
   G1CollectedHeap* _g1h;
--- a/src/share/vm/gc_implementation/g1/g1RemSet.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/g1RemSet.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -29,6 +29,7 @@
 #include "gc_implementation/g1/g1BlockOffsetTable.inline.hpp"
 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
 #include "gc_implementation/g1/g1CollectorPolicy.hpp"
+#include "gc_implementation/g1/g1GCPhaseTimes.hpp"
 #include "gc_implementation/g1/g1OopClosures.inline.hpp"
 #include "gc_implementation/g1/g1RemSet.inline.hpp"
 #include "gc_implementation/g1/heapRegionSeq.inline.hpp"
@@ -75,7 +76,7 @@
 {
   _seq_task = new SubTasksDone(NumSeqTasks);
   guarantee(n_workers() > 0, "There should be some workers");
-  _cset_rs_update_cl = NEW_C_HEAP_ARRAY(OopsInHeapRegionClosure*, n_workers());
+  _cset_rs_update_cl = NEW_C_HEAP_ARRAY(OopsInHeapRegionClosure*, n_workers(), mtGC);
   for (uint i = 0; i < n_workers(); i++) {
     _cset_rs_update_cl[i] = NULL;
   }
@@ -86,7 +87,7 @@
   for (uint i = 0; i < n_workers(); i++) {
     assert(_cset_rs_update_cl[i] == NULL, "it should be");
   }
-  FREE_C_HEAP_ARRAY(OopsInHeapRegionClosure*, _cset_rs_update_cl);
+  FREE_C_HEAP_ARRAY(OopsInHeapRegionClosure*, _cset_rs_update_cl, mtGC);
 }
 
 void CountNonCleanMemRegionClosure::do_MemRegion(MemRegion mr) {
@@ -224,7 +225,7 @@
   assert( _cards_scanned != NULL, "invariant" );
   _cards_scanned[worker_i] = scanRScl.cards_done();
 
-  _g1p->record_scan_rs_time(worker_i, scan_rs_time_sec * 1000.0);
+  _g1p->phase_times()->record_scan_rs_time(worker_i, scan_rs_time_sec * 1000.0);
 }
 
 // Closure used for updating RSets and recording references that
@@ -276,7 +277,7 @@
     guarantee(cl.n() == 0, "Card table should be clean.");
   }
 
-  _g1p->record_update_rs_time(worker_i, (os::elapsedTime() - start) * 1000.0);
+  _g1p->phase_times()->record_update_rs_time(worker_i, (os::elapsedTime() - start) * 1000.0);
 }
 
 class CountRSSizeClosure: public HeapRegionClosure {
@@ -390,13 +391,13 @@
   if (G1UseParallelRSetUpdating || (worker_i == 0)) {
     updateRS(&into_cset_dcq, worker_i);
   } else {
-    _g1p->record_update_rs_processed_buffers(worker_i, 0.0);
-    _g1p->record_update_rs_time(worker_i, 0.0);
+    _g1p->phase_times()->record_update_rs_processed_buffers(worker_i, 0.0);
+    _g1p->phase_times()->record_update_rs_time(worker_i, 0.0);
   }
   if (G1UseParallelRSetScanning || (worker_i == 0)) {
     scanRS(oc, worker_i);
   } else {
-    _g1p->record_scan_rs_time(worker_i, 0.0);
+    _g1p->phase_times()->record_scan_rs_time(worker_i, 0.0);
   }
 
   // We now clear the cached values of _cset_rs_update_cl for this worker
@@ -416,7 +417,7 @@
     // _seq_task->set_n_termination((int)n_workers());
   }
   guarantee( _cards_scanned == NULL, "invariant" );
-  _cards_scanned = NEW_C_HEAP_ARRAY(size_t, n_workers());
+  _cards_scanned = NEW_C_HEAP_ARRAY(size_t, n_workers(), mtGC);
   for (uint i = 0; i < n_workers(); ++i) {
     _cards_scanned[i] = 0;
   }
@@ -487,7 +488,7 @@
   for (uint i = 0; i < n_workers(); ++i) {
     _total_cards_scanned += _cards_scanned[i];
   }
-  FREE_C_HEAP_ARRAY(size_t, _cards_scanned);
+  FREE_C_HEAP_ARRAY(size_t, _cards_scanned, mtGC);
   _cards_scanned = NULL;
   // Cleanup after copy
   _g1->set_refine_cte_cl_concurrency(true);
--- a/src/share/vm/gc_implementation/g1/g1RemSet.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/g1RemSet.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -36,7 +36,7 @@
 // external heap references into it.  Uses a mod ref bs to track updates,
 // so that they can be used to update the individual region remsets.
 
-class G1RemSet: public CHeapObj {
+class G1RemSet: public CHeapObj<mtGC> {
 protected:
   G1CollectedHeap* _g1;
   unsigned _conc_refine_cards;
--- a/src/share/vm/gc_implementation/g1/g1_globals.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/g1_globals.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -53,6 +53,9 @@
   develop(bool, G1TraceMarkStackOverflow, false,                            \
           "If true, extra debugging code for CM restart for ovflw.")        \
                                                                             \
+  develop(bool, G1TraceHeapRegionRememberedSet, false,                      \
+          "Enables heap region remembered set debug logs")                  \
+                                                                            \
   diagnostic(bool, G1SummarizeConcMark, false,                              \
           "Summarize concurrent mark info")                                 \
                                                                             \
--- a/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -30,29 +30,22 @@
 #include "gc_implementation/g1/heapRegionSeq.inline.hpp"
 #include "memory/allocation.hpp"
 #include "memory/space.inline.hpp"
+#include "oops/oop.inline.hpp"
 #include "utilities/bitMap.inline.hpp"
 #include "utilities/globalDefinitions.hpp"
 
-#define HRRS_VERBOSE 0
-
-#define PRT_COUNT_OCCUPIED 1
-
 // OtherRegionsTable
 
-class PerRegionTable: public CHeapObj {
+class PerRegionTable: public CHeapObj<mtGC> {
   friend class OtherRegionsTable;
   friend class HeapRegionRemSetIterator;
 
   HeapRegion*     _hr;
   BitMap          _bm;
-#if PRT_COUNT_OCCUPIED
   jint            _occupied;
-#endif
-  PerRegionTable* _next_free;
 
-  PerRegionTable* next_free() { return _next_free; }
-  void set_next_free(PerRegionTable* prt) { _next_free = prt; }
-
+  // next pointer for free/allocated lis
+  PerRegionTable* _next;
 
   static PerRegionTable* _free_list;
 
@@ -69,63 +62,25 @@
   // We need access in order to union things into the base table.
   BitMap* bm() { return &_bm; }
 
-#if PRT_COUNT_OCCUPIED
   void recount_occupied() {
     _occupied = (jint) bm()->count_one_bits();
   }
-#endif
 
   PerRegionTable(HeapRegion* hr) :
     _hr(hr),
-#if PRT_COUNT_OCCUPIED
     _occupied(0),
-#endif
     _bm(HeapRegion::CardsPerRegion, false /* in-resource-area */)
   {}
 
-  static void free(PerRegionTable* prt) {
-    while (true) {
-      PerRegionTable* fl = _free_list;
-      prt->set_next_free(fl);
-      PerRegionTable* res =
-        (PerRegionTable*)
-        Atomic::cmpxchg_ptr(prt, &_free_list, fl);
-      if (res == fl) return;
-    }
-    ShouldNotReachHere();
-  }
-
-  static PerRegionTable* alloc(HeapRegion* hr) {
-    PerRegionTable* fl = _free_list;
-    while (fl != NULL) {
-      PerRegionTable* nxt = fl->next_free();
-      PerRegionTable* res =
-        (PerRegionTable*)
-        Atomic::cmpxchg_ptr(nxt, &_free_list, fl);
-      if (res == fl) {
-        fl->init(hr);
-        return fl;
-      } else {
-        fl = _free_list;
-      }
-    }
-    assert(fl == NULL, "Loop condition.");
-    return new PerRegionTable(hr);
-  }
-
   void add_card_work(CardIdx_t from_card, bool par) {
     if (!_bm.at(from_card)) {
       if (par) {
         if (_bm.par_at_put(from_card, 1)) {
-#if PRT_COUNT_OCCUPIED
           Atomic::inc(&_occupied);
-#endif
         }
       } else {
         _bm.at_put(from_card, 1);
-#if PRT_COUNT_OCCUPIED
         _occupied++;
-#endif
       }
     }
   }
@@ -134,10 +89,13 @@
     // Must make this robust in case "from" is not in "_hr", because of
     // concurrency.
 
-#if HRRS_VERBOSE
-    gclog_or_tty->print_cr("    PRT::Add_reference_work(" PTR_FORMAT "->" PTR_FORMAT").",
-                           from, *from);
-#endif
+    if (G1TraceHeapRegionRememberedSet) {
+      gclog_or_tty->print_cr("    PRT::Add_reference_work(" PTR_FORMAT "->" PTR_FORMAT").",
+                             from,
+                             UseCompressedOops
+                             ? oopDesc::load_decode_heap_oop((narrowOop*)from)
+                             : oopDesc::load_decode_heap_oop((oop*)from));
+    }
 
     HeapRegion* loc_hr = hr();
     // If the test below fails, then this table was reused concurrently
@@ -162,23 +120,16 @@
 
   HeapRegion* hr() const { return _hr; }
 
-#if PRT_COUNT_OCCUPIED
   jint occupied() const {
     // Overkill, but if we ever need it...
     // guarantee(_occupied == _bm.count_one_bits(), "Check");
     return _occupied;
   }
-#else
-  jint occupied() const {
-    return _bm.count_one_bits();
-  }
-#endif
 
   void init(HeapRegion* hr) {
     _hr = hr;
-#if PRT_COUNT_OCCUPIED
+    _next = NULL;
     _occupied = 0;
-#endif
     _bm.clear();
   }
 
@@ -194,9 +145,7 @@
     HeapWord* hr_bot = hr()->bottom();
     size_t hr_first_card_index = ctbs->index_for(hr_bot);
     bm()->set_intersection_at_offset(*card_bm, hr_first_card_index);
-#if PRT_COUNT_OCCUPIED
     recount_occupied();
-#endif
   }
 
   void add_card(CardIdx_t from_card_index) {
@@ -218,16 +167,6 @@
     return sizeof(this) + _bm.size_in_words() * HeapWordSize;
   }
 
-  static size_t fl_mem_size() {
-    PerRegionTable* cur = _free_list;
-    size_t res = 0;
-    while (cur != NULL) {
-      res += sizeof(PerRegionTable);
-      cur = cur->next_free();
-    }
-    return res;
-  }
-
   // Requires "from" to be in "hr()".
   bool contains_reference(OopOrNarrowOopStar from) const {
     assert(hr()->is_in_reserved(from), "Precondition.");
@@ -235,122 +174,29 @@
                                     CardTableModRefBS::card_size);
     return _bm.at(card_ind);
   }
-};
 
-PerRegionTable* PerRegionTable::_free_list = NULL;
-
-
-#define COUNT_PAR_EXPANDS 0
-
-#if COUNT_PAR_EXPANDS
-static jint n_par_expands = 0;
-static jint n_par_contracts = 0;
-static jint par_expand_list_len = 0;
-static jint max_par_expand_list_len = 0;
-
-static void print_par_expand() {
-  Atomic::inc(&n_par_expands);
-  Atomic::inc(&par_expand_list_len);
-  if (par_expand_list_len > max_par_expand_list_len) {
-    max_par_expand_list_len = par_expand_list_len;
-  }
-  if ((n_par_expands % 10) == 0) {
-    gclog_or_tty->print_cr("\n\n%d par expands: %d contracts, "
-                  "len = %d, max_len = %d\n.",
-                  n_par_expands, n_par_contracts, par_expand_list_len,
-                  max_par_expand_list_len);
-  }
-}
-#endif
-
-class PosParPRT: public PerRegionTable {
-  PerRegionTable** _par_tables;
-
-  enum SomePrivateConstants {
-    ReserveParTableExpansion = 1
-  };
+  PerRegionTable* next() const { return _next; }
+  void set_next(PerRegionTable* nxt) { _next = nxt; }
+  PerRegionTable** next_addr() { return &_next; }
 
-  void par_contract() {
-    assert(_par_tables != NULL, "Precondition.");
-    int n = HeapRegionRemSet::num_par_rem_sets()-1;
-    for (int i = 0; i < n; i++) {
-      _par_tables[i]->union_bitmap_into(bm());
-      PerRegionTable::free(_par_tables[i]);
-      _par_tables[i] = NULL;
-    }
-#if PRT_COUNT_OCCUPIED
-    // We must recount the "occupied."
-    recount_occupied();
-#endif
-    FREE_C_HEAP_ARRAY(PerRegionTable*, _par_tables);
-    _par_tables = NULL;
-#if COUNT_PAR_EXPANDS
-    Atomic::inc(&n_par_contracts);
-    Atomic::dec(&par_expand_list_len);
-#endif
-  }
-
-  static PerRegionTable** _par_table_fl;
-
-  PosParPRT* _next;
-
-  static PosParPRT* _free_list;
-
-  PerRegionTable** par_tables() const {
-    assert(uintptr_t(NULL) == 0, "Assumption.");
-    if (uintptr_t(_par_tables) <= ReserveParTableExpansion)
-      return NULL;
-    else
-      return _par_tables;
-  }
-
-  PosParPRT* _next_par_expanded;
-  PosParPRT* next_par_expanded() { return _next_par_expanded; }
-  void set_next_par_expanded(PosParPRT* ppprt) { _next_par_expanded = ppprt; }
-  static PosParPRT* _par_expanded_list;
-
-public:
-
-  PosParPRT(HeapRegion* hr) : PerRegionTable(hr), _par_tables(NULL) {}
-
-  jint occupied() const {
-    jint res = PerRegionTable::occupied();
-    if (par_tables() != NULL) {
-      for (int i = 0; i < HeapRegionRemSet::num_par_rem_sets()-1; i++) {
-        res += par_tables()[i]->occupied();
-      }
-    }
-    return res;
-  }
-
-  void init(HeapRegion* hr) {
-    PerRegionTable::init(hr);
-    _next = NULL;
-    if (par_tables() != NULL) {
-      for (int i = 0; i < HeapRegionRemSet::num_par_rem_sets()-1; i++) {
-        par_tables()[i]->init(hr);
-      }
-    }
-  }
-
-  static void free(PosParPRT* prt) {
+  static void free(PerRegionTable* prt) {
     while (true) {
-      PosParPRT* fl = _free_list;
+      PerRegionTable* fl = _free_list;
       prt->set_next(fl);
-      PosParPRT* res =
-        (PosParPRT*)
+      PerRegionTable* res =
+        (PerRegionTable*)
         Atomic::cmpxchg_ptr(prt, &_free_list, fl);
       if (res == fl) return;
     }
     ShouldNotReachHere();
   }
 
-  static PosParPRT* alloc(HeapRegion* hr) {
-    PosParPRT* fl = _free_list;
+  static PerRegionTable* alloc(HeapRegion* hr) {
+    PerRegionTable* fl = _free_list;
     while (fl != NULL) {
-      PosParPRT* nxt = fl->next();
-      PosParPRT* res =
-        (PosParPRT*)
+      PerRegionTable* nxt = fl->next();
+      PerRegionTable* res =
+        (PerRegionTable*)
         Atomic::cmpxchg_ptr(nxt, &_free_list, fl);
       if (res == fl) {
         fl->init(hr);
@@ -360,148 +206,26 @@
       }
     }
     assert(fl == NULL, "Loop condition.");
-    return new PosParPRT(hr);
-  }
-
-  PosParPRT* next() const { return _next; }
-  void set_next(PosParPRT* nxt) { _next = nxt; }
-  PosParPRT** next_addr() { return &_next; }
-
-  bool should_expand(int tid) {
-    // Given that we now defer RSet updates for after a GC we don't
-    // really need to expand the tables any more. This code should be
-    // cleaned up in the future (see CR 6921087).
-    return false;
-  }
-
-  void par_expand() {
-    int n = HeapRegionRemSet::num_par_rem_sets()-1;
-    if (n <= 0) return;
-    if (_par_tables == NULL) {
-      PerRegionTable* res =
-        (PerRegionTable*)
-        Atomic::cmpxchg_ptr((PerRegionTable*)ReserveParTableExpansion,
-                            &_par_tables, NULL);
-      if (res != NULL) return;
-      // Otherwise, we reserved the right to do the expansion.
-
-      PerRegionTable** ptables = NEW_C_HEAP_ARRAY(PerRegionTable*, n);
-      for (int i = 0; i < n; i++) {
-        PerRegionTable* ptable = PerRegionTable::alloc(hr());
-        ptables[i] = ptable;
-      }
-      // Here we do not need an atomic.
-      _par_tables = ptables;
-#if COUNT_PAR_EXPANDS
-      print_par_expand();
-#endif
-      // We must put this table on the expanded list.
-      PosParPRT* exp_head = _par_expanded_list;
-      while (true) {
-        set_next_par_expanded(exp_head);
-        PosParPRT* res =
-          (PosParPRT*)
-          Atomic::cmpxchg_ptr(this, &_par_expanded_list, exp_head);
-        if (res == exp_head) return;
-        // Otherwise.
-        exp_head = res;
-      }
-      ShouldNotReachHere();
-    }
-  }
-
-  void add_reference(OopOrNarrowOopStar from, int tid) {
-    // Expand if necessary.
-    PerRegionTable** pt = par_tables();
-    if (pt != NULL) {
-      // We always have to assume that mods to table 0 are in parallel,
-      // because of the claiming scheme in parallel expansion.  A thread
-      // with tid != 0 that finds the table to be NULL, but doesn't succeed
-      // in claiming the right of expanding it, will end up in the else
-      // clause of the above if test.  That thread could be delayed, and a
-      // thread 0 add reference could see the table expanded, and come
-      // here.  Both threads would be adding in parallel.  But we get to
-      // not use atomics for tids > 0.
-      if (tid == 0) {
-        PerRegionTable::add_reference(from);
-      } else {
-        pt[tid-1]->seq_add_reference(from);
-      }
-    } else {
-      // Not expanded -- add to the base table.
-      PerRegionTable::add_reference(from);
-    }
-  }
-
-  void scrub(CardTableModRefBS* ctbs, BitMap* card_bm) {
-    assert(_par_tables == NULL, "Precondition");
-    PerRegionTable::scrub(ctbs, card_bm);
-  }
-
-  size_t mem_size() const {
-    size_t res =
-      PerRegionTable::mem_size() + sizeof(this) - sizeof(PerRegionTable);
-    if (_par_tables != NULL) {
-      for (int i = 0; i < HeapRegionRemSet::num_par_rem_sets()-1; i++) {
-        res += _par_tables[i]->mem_size();
-      }
-    }
-    return res;
+    return new PerRegionTable(hr);
   }
 
   static size_t fl_mem_size() {
-    PosParPRT* cur = _free_list;
+    PerRegionTable* cur = _free_list;
     size_t res = 0;
     while (cur != NULL) {
-      res += sizeof(PosParPRT);
+      res += sizeof(PerRegionTable);
       cur = cur->next();
     }
     return res;
   }
-
-  bool contains_reference(OopOrNarrowOopStar from) const {
-    if (PerRegionTable::contains_reference(from)) return true;
-    if (_par_tables != NULL) {
-      for (int i = 0; i < HeapRegionRemSet::num_par_rem_sets()-1; i++) {
-        if (_par_tables[i]->contains_reference(from)) return true;
-      }
-    }
-    return false;
-  }
-
-  static void par_contract_all();
 };
 
-void PosParPRT::par_contract_all() {
-  PosParPRT* hd = _par_expanded_list;
-  while (hd != NULL) {
-    PosParPRT* nxt = hd->next_par_expanded();
-    PosParPRT* res =
-      (PosParPRT*)
-      Atomic::cmpxchg_ptr(nxt, &_par_expanded_list, hd);
-    if (res == hd) {
-      // We claimed the right to contract this table.
-      hd->set_next_par_expanded(NULL);
-      hd->par_contract();
-      hd = _par_expanded_list;
-    } else {
-      hd = res;
-    }
-  }
-}
-
-PosParPRT* PosParPRT::_free_list = NULL;
-PosParPRT* PosParPRT::_par_expanded_list = NULL;
-
-jint OtherRegionsTable::_cache_probes = 0;
-jint OtherRegionsTable::_cache_hits = 0;
+PerRegionTable* PerRegionTable::_free_list = NULL;
 
 size_t OtherRegionsTable::_max_fine_entries = 0;
 size_t OtherRegionsTable::_mod_max_fine_entries_mask = 0;
-#if SAMPLE_FOR_EVICTION
 size_t OtherRegionsTable::_fine_eviction_stride = 0;
 size_t OtherRegionsTable::_fine_eviction_sample_size = 0;
-#endif
 
 OtherRegionsTable::OtherRegionsTable(HeapRegion* hr) :
   _g1h(G1CollectedHeap::heap()),
@@ -511,34 +235,36 @@
               false /* in-resource-area */),
   _fine_grain_regions(NULL),
   _n_fine_entries(0), _n_coarse_entries(0),
-#if SAMPLE_FOR_EVICTION
   _fine_eviction_start(0),
-#endif
   _sparse_table(hr)
 {
-  typedef PosParPRT* PosParPRTPtr;
+  typedef PerRegionTable* PerRegionTablePtr;
+
   if (_max_fine_entries == 0) {
     assert(_mod_max_fine_entries_mask == 0, "Both or none.");
     size_t max_entries_log = (size_t)log2_long((jlong)G1RSetRegionEntries);
     _max_fine_entries = (size_t)(1 << max_entries_log);
     _mod_max_fine_entries_mask = _max_fine_entries - 1;
-#if SAMPLE_FOR_EVICTION
+
     assert(_fine_eviction_sample_size == 0
            && _fine_eviction_stride == 0, "All init at same time.");
     _fine_eviction_sample_size = MAX2((size_t)4, max_entries_log);
     _fine_eviction_stride = _max_fine_entries / _fine_eviction_sample_size;
-#endif
   }
-  _fine_grain_regions = new PosParPRTPtr[_max_fine_entries];
-  if (_fine_grain_regions == NULL)
+
+  _fine_grain_regions = new PerRegionTablePtr[_max_fine_entries];
+
+  if (_fine_grain_regions == NULL) {
     vm_exit_out_of_memory(sizeof(void*)*_max_fine_entries,
                           "Failed to allocate _fine_grain_entries.");
+  }
+
   for (size_t i = 0; i < _max_fine_entries; i++) {
     _fine_grain_regions[i] = NULL;
   }
 }
 
-int** OtherRegionsTable::_from_card_cache = NULL;
+int**  OtherRegionsTable::_from_card_cache = NULL;
 size_t OtherRegionsTable::_from_card_cache_max_regions = 0;
 size_t OtherRegionsTable::_from_card_cache_mem_size = 0;
 
@@ -546,9 +272,9 @@
   _from_card_cache_max_regions = max_regions;
 
   int n_par_rs = HeapRegionRemSet::num_par_rem_sets();
-  _from_card_cache = NEW_C_HEAP_ARRAY(int*, n_par_rs);
+  _from_card_cache = NEW_C_HEAP_ARRAY(int*, n_par_rs, mtGC);
   for (int i = 0; i < n_par_rs; i++) {
-    _from_card_cache[i] = NEW_C_HEAP_ARRAY(int, max_regions);
+    _from_card_cache[i] = NEW_C_HEAP_ARRAY(int, max_regions, mtGC);
     for (size_t j = 0; j < max_regions; j++) {
       _from_card_cache[i][j] = -1;  // An invalid value.
     }
@@ -579,38 +305,26 @@
 void OtherRegionsTable::add_reference(OopOrNarrowOopStar from, int tid) {
   size_t cur_hrs_ind = (size_t) hr()->hrs_index();
 
-#if HRRS_VERBOSE
-  gclog_or_tty->print_cr("ORT::add_reference_work(" PTR_FORMAT "->" PTR_FORMAT ").",
-                                                  from,
-                                                  UseCompressedOops
-                                                  ? oopDesc::load_decode_heap_oop((narrowOop*)from)
-                                                  : oopDesc::load_decode_heap_oop((oop*)from));
-#endif
+  if (G1TraceHeapRegionRememberedSet) {
+    gclog_or_tty->print_cr("ORT::add_reference_work(" PTR_FORMAT "->" PTR_FORMAT ").",
+                                                    from,
+                                                    UseCompressedOops
+                                                    ? oopDesc::load_decode_heap_oop((narrowOop*)from)
+                                                    : oopDesc::load_decode_heap_oop((oop*)from));
+  }
 
   int from_card = (int)(uintptr_t(from) >> CardTableModRefBS::card_shift);
 
-#if HRRS_VERBOSE
-  gclog_or_tty->print_cr("Table for [" PTR_FORMAT "...): card %d (cache = %d)",
-                hr()->bottom(), from_card,
-                _from_card_cache[tid][cur_hrs_ind]);
-#endif
+  if (G1TraceHeapRegionRememberedSet) {
+    gclog_or_tty->print_cr("Table for [" PTR_FORMAT "...): card %d (cache = %d)",
+                  hr()->bottom(), from_card,
+                  _from_card_cache[tid][cur_hrs_ind]);
+  }
 
-#define COUNT_CACHE 0
-#if COUNT_CACHE
-  jint p = Atomic::add(1, &_cache_probes);
-  if ((p % 10000) == 0) {
-    jint hits = _cache_hits;
-    gclog_or_tty->print_cr("%d/%d = %5.2f%% RS cache hits.",
-                  _cache_hits, p, 100.0* (float)hits/(float)p);
-  }
-#endif
   if (from_card == _from_card_cache[tid][cur_hrs_ind]) {
-#if HRRS_VERBOSE
-    gclog_or_tty->print_cr("  from-card cache hit.");
-#endif
-#if COUNT_CACHE
-    Atomic::inc(&_cache_hits);
-#endif
+    if (G1TraceHeapRegionRememberedSet) {
+      gclog_or_tty->print_cr("  from-card cache hit.");
+    }
     assert(contains_reference(from), "We just added it!");
     return;
   } else {
@@ -623,16 +337,16 @@
 
   // If the region is already coarsened, return.
   if (_coarse_map.at(from_hrs_ind)) {
-#if HRRS_VERBOSE
-    gclog_or_tty->print_cr("  coarse map hit.");
-#endif
+    if (G1TraceHeapRegionRememberedSet) {
+      gclog_or_tty->print_cr("  coarse map hit.");
+    }
     assert(contains_reference(from), "We just added it!");
     return;
   }
 
   // Otherwise find a per-region table to add it to.
   size_t ind = from_hrs_ind & _mod_max_fine_entries_mask;
-  PosParPRT* prt = find_region_table(ind, from_hr);
+  PerRegionTable* prt = find_region_table(ind, from_hr);
   if (prt == NULL) {
     MutexLockerEx x(&_m, Mutex::_no_safepoint_check_flag);
     // Confirm that it's really not there...
@@ -649,35 +363,35 @@
           _sparse_table.add_card(from_hrs_ind, card_index)) {
         if (G1RecordHRRSOops) {
           HeapRegionRemSet::record(hr(), from);
-#if HRRS_VERBOSE
-          gclog_or_tty->print("   Added card " PTR_FORMAT " to region "
-                              "[" PTR_FORMAT "...) for ref " PTR_FORMAT ".\n",
-                              align_size_down(uintptr_t(from),
-                                              CardTableModRefBS::card_size),
-                              hr()->bottom(), from);
-#endif
+          if (G1TraceHeapRegionRememberedSet) {
+            gclog_or_tty->print("   Added card " PTR_FORMAT " to region "
+                                "[" PTR_FORMAT "...) for ref " PTR_FORMAT ".\n",
+                                align_size_down(uintptr_t(from),
+                                                CardTableModRefBS::card_size),
+                                hr()->bottom(), from);
+          }
         }
-#if HRRS_VERBOSE
-        gclog_or_tty->print_cr("   added card to sparse table.");
-#endif
+        if (G1TraceHeapRegionRememberedSet) {
+          gclog_or_tty->print_cr("   added card to sparse table.");
+        }
         assert(contains_reference_locked(from), "We just added it!");
         return;
       } else {
-#if HRRS_VERBOSE
-        gclog_or_tty->print_cr("   [tid %d] sparse table entry "
-                      "overflow(f: %d, t: %d)",
-                      tid, from_hrs_ind, cur_hrs_ind);
-#endif
+        if (G1TraceHeapRegionRememberedSet) {
+          gclog_or_tty->print_cr("   [tid %d] sparse table entry "
+                        "overflow(f: %d, t: %d)",
+                        tid, from_hrs_ind, cur_hrs_ind);
+        }
       }
 
       if (_n_fine_entries == _max_fine_entries) {
         prt = delete_region_table();
       } else {
-        prt = PosParPRT::alloc(from_hr);
+        prt = PerRegionTable::alloc(from_hr);
       }
       prt->init(from_hr);
 
-      PosParPRT* first_prt = _fine_grain_regions[ind];
+      PerRegionTable* first_prt = _fine_grain_regions[ind];
       prt->set_next(first_prt);  // XXX Maybe move to init?
       _fine_grain_regions[ind] = prt;
       _n_fine_entries++;
@@ -704,38 +418,25 @@
   // OtherRegionsTable for why this is OK.
   assert(prt != NULL, "Inv");
 
-  if (prt->should_expand(tid)) {
-    MutexLockerEx x(&_m, Mutex::_no_safepoint_check_flag);
-    HeapRegion* prt_hr = prt->hr();
-    if (prt_hr == from_hr) {
-      // Make sure the table still corresponds to the same region
-      prt->par_expand();
-      prt->add_reference(from, tid);
-    }
-    // else: The table has been concurrently coarsened, evicted, and
-    // the table data structure re-used for another table. So, we
-    // don't need to add the reference any more given that the table
-    // has been coarsened and the whole region will be scanned anyway.
-  } else {
-    prt->add_reference(from, tid);
-  }
+  prt->add_reference(from);
+
   if (G1RecordHRRSOops) {
     HeapRegionRemSet::record(hr(), from);
-#if HRRS_VERBOSE
-    gclog_or_tty->print("Added card " PTR_FORMAT " to region "
-                        "[" PTR_FORMAT "...) for ref " PTR_FORMAT ".\n",
-                        align_size_down(uintptr_t(from),
-                                        CardTableModRefBS::card_size),
-                        hr()->bottom(), from);
-#endif
+    if (G1TraceHeapRegionRememberedSet) {
+      gclog_or_tty->print("Added card " PTR_FORMAT " to region "
+                          "[" PTR_FORMAT "...) for ref " PTR_FORMAT ".\n",
+                          align_size_down(uintptr_t(from),
+                                          CardTableModRefBS::card_size),
+                          hr()->bottom(), from);
+    }
   }
   assert(contains_reference(from), "We just added it!");
 }
 
-PosParPRT*
+PerRegionTable*
 OtherRegionsTable::find_region_table(size_t ind, HeapRegion* hr) const {
   assert(0 <= ind && ind < _max_fine_entries, "Preconditions.");
-  PosParPRT* prt = _fine_grain_regions[ind];
+  PerRegionTable* prt = _fine_grain_regions[ind];
   while (prt != NULL && prt->hr() != hr) {
     prt = prt->next();
   }
@@ -743,32 +444,16 @@
   return prt;
 }
 
-
-#define DRT_CENSUS 0
-
-#if DRT_CENSUS
-static const int HistoSize = 6;
-static int global_histo[HistoSize] = { 0, 0, 0, 0, 0, 0 };
-static int coarsenings = 0;
-static int occ_sum = 0;
-#endif
-
 jint OtherRegionsTable::_n_coarsenings = 0;
 
-PosParPRT* OtherRegionsTable::delete_region_table() {
-#if DRT_CENSUS
-  int histo[HistoSize] = { 0, 0, 0, 0, 0, 0 };
-  const int histo_limits[] = { 1, 4, 16, 64, 256, 2048 };
-#endif
-
+PerRegionTable* OtherRegionsTable::delete_region_table() {
   assert(_m.owned_by_self(), "Precondition");
   assert(_n_fine_entries == _max_fine_entries, "Precondition");
-  PosParPRT* max = NULL;
+  PerRegionTable* max = NULL;
   jint max_occ = 0;
-  PosParPRT** max_prev;
+  PerRegionTable** max_prev;
   size_t max_ind;
 
-#if SAMPLE_FOR_EVICTION
   size_t i = _fine_eviction_start;
   for (size_t k = 0; k < _fine_eviction_sample_size; k++) {
     size_t ii = i;
@@ -778,8 +463,8 @@
       if (ii == _max_fine_entries) ii = 0;
       guarantee(ii != i, "We must find one.");
     }
-    PosParPRT** prev = &_fine_grain_regions[ii];
-    PosParPRT* cur = *prev;
+    PerRegionTable** prev = &_fine_grain_regions[ii];
+    PerRegionTable* cur = *prev;
     while (cur != NULL) {
       jint cur_occ = cur->occupied();
       if (max == NULL || cur_occ > max_occ) {
@@ -794,64 +479,27 @@
     i = i + _fine_eviction_stride;
     if (i >= _n_fine_entries) i = i - _n_fine_entries;
   }
+
   _fine_eviction_start++;
-  if (_fine_eviction_start >= _n_fine_entries)
+
+  if (_fine_eviction_start >= _n_fine_entries) {
     _fine_eviction_start -= _n_fine_entries;
-#else
-  for (int i = 0; i < _max_fine_entries; i++) {
-    PosParPRT** prev = &_fine_grain_regions[i];
-    PosParPRT* cur = *prev;
-    while (cur != NULL) {
-      jint cur_occ = cur->occupied();
-#if DRT_CENSUS
-      for (int k = 0; k < HistoSize; k++) {
-        if (cur_occ <= histo_limits[k]) {
-          histo[k]++; global_histo[k]++; break;
-        }
-      }
-#endif
-      if (max == NULL || cur_occ > max_occ) {
-        max = cur;
-        max_prev = prev;
-        max_ind = i;
-        max_occ = cur_occ;
-      }
-      prev = cur->next_addr();
-      cur = cur->next();
-    }
   }
-#endif
-  // XXX
+
   guarantee(max != NULL, "Since _n_fine_entries > 0");
-#if DRT_CENSUS
-  gclog_or_tty->print_cr("In a coarsening: histo of occs:");
-  for (int k = 0; k < HistoSize; k++) {
-    gclog_or_tty->print_cr("  <= %4d: %5d.", histo_limits[k], histo[k]);
-  }
-  coarsenings++;
-  occ_sum += max_occ;
-  if ((coarsenings % 100) == 0) {
-    gclog_or_tty->print_cr("\ncoarsenings = %d; global summary:", coarsenings);
-    for (int k = 0; k < HistoSize; k++) {
-      gclog_or_tty->print_cr("  <= %4d: %5d.", histo_limits[k], global_histo[k]);
-    }
-    gclog_or_tty->print_cr("Avg occ of deleted region = %6.2f.",
-                  (float)occ_sum/(float)coarsenings);
-  }
-#endif
 
   // Set the corresponding coarse bit.
   size_t max_hrs_index = (size_t) max->hr()->hrs_index();
   if (!_coarse_map.at(max_hrs_index)) {
     _coarse_map.at_put(max_hrs_index, true);
     _n_coarse_entries++;
-#if 0
-    gclog_or_tty->print("Coarsened entry in region [" PTR_FORMAT "...] "
-               "for region [" PTR_FORMAT "...] (%d coarse entries).\n",
-               hr()->bottom(),
-               max->hr()->bottom(),
-               _n_coarse_entries);
-#endif
+    if (G1TraceHeapRegionRememberedSet) {
+      gclog_or_tty->print("Coarsened entry in region [" PTR_FORMAT "...] "
+                 "for region [" PTR_FORMAT "...] (%d coarse entries).\n",
+                 hr()->bottom(),
+                 max->hr()->bottom(),
+                 _n_coarse_entries);
+    }
   }
 
   // Unsplice.
@@ -883,10 +531,10 @@
 
   // Now do the fine-grained maps.
   for (size_t i = 0; i < _max_fine_entries; i++) {
-    PosParPRT* cur = _fine_grain_regions[i];
-    PosParPRT** prev = &_fine_grain_regions[i];
+    PerRegionTable* cur = _fine_grain_regions[i];
+    PerRegionTable** prev = &_fine_grain_regions[i];
     while (cur != NULL) {
-      PosParPRT* nxt = cur->next();
+      PerRegionTable* nxt = cur->next();
       // If the entire region is dead, eliminate.
       if (G1RSScrubVerbose) {
         gclog_or_tty->print_cr("     For other region %u:",
@@ -899,7 +547,7 @@
         if (G1RSScrubVerbose) {
           gclog_or_tty->print_cr("          deleted via region map.");
         }
-        PosParPRT::free(cur);
+        PerRegionTable::free(cur);
       } else {
         // Do fine-grain elimination.
         if (G1RSScrubVerbose) {
@@ -914,7 +562,7 @@
           *prev = nxt;
           cur->set_next(NULL);
           _n_fine_entries--;
-          PosParPRT::free(cur);
+          PerRegionTable::free(cur);
         } else {
           prev = cur->next_addr();
         }
@@ -940,7 +588,7 @@
 size_t OtherRegionsTable::occ_fine() const {
   size_t sum = 0;
   for (size_t i = 0; i < _max_fine_entries; i++) {
-    PosParPRT* cur = _fine_grain_regions[i];
+    PerRegionTable* cur = _fine_grain_regions[i];
     while (cur != NULL) {
       sum += cur->occupied();
       cur = cur->next();
@@ -962,13 +610,13 @@
   MutexLockerEx x((Mutex*)&_m, Mutex::_no_safepoint_check_flag);
   size_t sum = 0;
   for (size_t i = 0; i < _max_fine_entries; i++) {
-    PosParPRT* cur = _fine_grain_regions[i];
+    PerRegionTable* cur = _fine_grain_regions[i];
     while (cur != NULL) {
       sum += cur->mem_size();
       cur = cur->next();
     }
   }
-  sum += (sizeof(PosParPRT*) * _max_fine_entries);
+  sum += (sizeof(PerRegionTable*) * _max_fine_entries);
   sum += (_coarse_map.size_in_words() * HeapWordSize);
   sum += (_sparse_table.mem_size());
   sum += sizeof(*this) - sizeof(_sparse_table); // Avoid double counting above.
@@ -980,7 +628,7 @@
 }
 
 size_t OtherRegionsTable::fl_mem_size() {
-  return PerRegionTable::fl_mem_size() + PosParPRT::fl_mem_size();
+  return PerRegionTable::fl_mem_size();
 }
 
 void OtherRegionsTable::clear_fcc() {
@@ -992,10 +640,10 @@
 void OtherRegionsTable::clear() {
   MutexLockerEx x(&_m, Mutex::_no_safepoint_check_flag);
   for (size_t i = 0; i < _max_fine_entries; i++) {
-    PosParPRT* cur = _fine_grain_regions[i];
+    PerRegionTable* cur = _fine_grain_regions[i];
     while (cur != NULL) {
-      PosParPRT* nxt = cur->next();
-      PosParPRT::free(cur);
+      PerRegionTable* nxt = cur->next();
+      PerRegionTable::free(cur);
       cur = nxt;
     }
     _fine_grain_regions[i] = NULL;
@@ -1035,8 +683,8 @@
 bool OtherRegionsTable::del_single_region_table(size_t ind,
                                                 HeapRegion* hr) {
   assert(0 <= ind && ind < _max_fine_entries, "Preconditions.");
-  PosParPRT** prev_addr = &_fine_grain_regions[ind];
-  PosParPRT* prt = *prev_addr;
+  PerRegionTable** prev_addr = &_fine_grain_regions[ind];
+  PerRegionTable* prt = *prev_addr;
   while (prt != NULL && prt->hr() != hr) {
     prev_addr = prt->next_addr();
     prt = prt->next();
@@ -1044,7 +692,7 @@
   if (prt != NULL) {
     assert(prt->hr() == hr, "Loop postcondition.");
     *prev_addr = prt->next();
-    PosParPRT::free(prt);
+    PerRegionTable::free(prt);
     _n_fine_entries--;
     return true;
   } else {
@@ -1065,7 +713,7 @@
   // Is this region in the coarse map?
   if (_coarse_map.at(hr_ind)) return true;
 
-  PosParPRT* prt = find_region_table(hr_ind & _mod_max_fine_entries_mask,
+  PerRegionTable* prt = find_region_table(hr_ind & _mod_max_fine_entries_mask,
                                      hr);
   if (prt != NULL) {
     return prt->contains_reference(from);
@@ -1145,7 +793,7 @@
       G1CollectedHeap::heap()->bot_shared()->address_for_index(card_index);
     gclog_or_tty->print_cr("  Card " PTR_FORMAT, card_start);
   }
-  // XXX
+
   if (iter.n_yielded() != occupied()) {
     gclog_or_tty->print_cr("Yielded disagrees with occupied:");
     gclog_or_tty->print_cr("  %6d yielded (%6d coarse, %6d fine).",
@@ -1163,10 +811,6 @@
   SparsePRT::cleanup_all();
 }
 
-void HeapRegionRemSet::par_cleanup() {
-  PosParPRT::par_contract_all();
-}
-
 void HeapRegionRemSet::clear() {
   _other_regions.clear();
   assert(occupied() == 0, "Should be clear.");
@@ -1333,9 +977,9 @@
            && _recorded_cards == NULL
            && _recorded_regions == NULL,
            "Inv");
-    _recorded_oops    = NEW_C_HEAP_ARRAY(OopOrNarrowOopStar, MaxRecorded);
-    _recorded_cards   = NEW_C_HEAP_ARRAY(HeapWord*,          MaxRecorded);
-    _recorded_regions = NEW_C_HEAP_ARRAY(HeapRegion*,        MaxRecorded);
+    _recorded_oops    = NEW_C_HEAP_ARRAY(OopOrNarrowOopStar, MaxRecorded, mtGC);
+    _recorded_cards   = NEW_C_HEAP_ARRAY(HeapWord*,          MaxRecorded, mtGC);
+    _recorded_regions = NEW_C_HEAP_ARRAY(HeapRegion*,        MaxRecorded, mtGC);
   }
   if (_n_recorded == MaxRecorded) {
     gclog_or_tty->print_cr("Filled up 'recorded' (%d).", MaxRecorded);
@@ -1356,8 +1000,8 @@
     assert(_n_recorded_events == 0
            && _recorded_event_index == NULL,
            "Inv");
-    _recorded_events = NEW_C_HEAP_ARRAY(Event, MaxRecordedEvents);
-    _recorded_event_index = NEW_C_HEAP_ARRAY(int, MaxRecordedEvents);
+    _recorded_events = NEW_C_HEAP_ARRAY(Event, MaxRecordedEvents, mtGC);
+    _recorded_event_index = NEW_C_HEAP_ARRAY(int, MaxRecordedEvents, mtGC);
   }
   if (_n_recorded_events == MaxRecordedEvents) {
     gclog_or_tty->print_cr("Filled up 'recorded_events' (%d).", MaxRecordedEvents);
--- a/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -35,7 +35,7 @@
 class G1BlockOffsetSharedArray;
 class HeapRegion;
 class HeapRegionRemSetIterator;
-class PosParPRT;
+class PerRegionTable;
 class SparsePRT;
 
 // Essentially a wrapper around SparsePRTCleanupTask. See
@@ -79,15 +79,14 @@
   size_t      _n_coarse_entries;
   static jint _n_coarsenings;
 
-  PosParPRT** _fine_grain_regions;
-  size_t      _n_fine_entries;
+  PerRegionTable** _fine_grain_regions;
+  size_t           _n_fine_entries;
 
-#define SAMPLE_FOR_EVICTION 1
-#if SAMPLE_FOR_EVICTION
+  // Used to sample a subset of the fine grain PRTs to determine which
+  // PRT to evict and coarsen.
   size_t        _fine_eviction_start;
   static size_t _fine_eviction_stride;
   static size_t _fine_eviction_sample_size;
-#endif
 
   SparsePRT   _sparse_table;
 
@@ -98,21 +97,18 @@
   // Requires "prt" to be the first element of the bucket list appropriate
   // for "hr".  If this list contains an entry for "hr", return it,
   // otherwise return "NULL".
-  PosParPRT* find_region_table(size_t ind, HeapRegion* hr) const;
+  PerRegionTable* find_region_table(size_t ind, HeapRegion* hr) const;
 
-  // Find, delete, and return a candidate PosParPRT, if any exists,
+  // Find, delete, and return a candidate PerRegionTable, if any exists,
   // adding the deleted region to the coarse bitmap.  Requires the caller
   // to hold _m, and the fine-grain table to be full.
-  PosParPRT* delete_region_table();
+  PerRegionTable* delete_region_table();
 
   // If a PRT for "hr" is in the bucket list indicated by "ind" (which must
   // be the correct index for "hr"), delete it and return true; else return
   // false.
   bool del_single_region_table(size_t ind, HeapRegion* hr);
 
-  static jint _cache_probes;
-  static jint _cache_hits;
-
   // Indexed by thread X heap region, to minimize thread contention.
   static int** _from_card_cache;
   static size_t _from_card_cache_max_regions;
@@ -127,10 +123,6 @@
   // sense.
   void add_reference(OopOrNarrowOopStar from, int tid);
 
-  void add_reference(OopOrNarrowOopStar from) {
-    return add_reference(from, 0);
-  }
-
   // Removes any entries shown by the given bitmaps to contain only dead
   // objects.
   void scrub(CardTableModRefBS* ctbs, BitMap* region_bm, BitMap* card_bm);
@@ -173,7 +165,7 @@
   static void print_from_card_cache();
 };
 
-class HeapRegionRemSet : public CHeapObj {
+class HeapRegionRemSet : public CHeapObj<mtGC> {
   friend class VMStructs;
   friend class HeapRegionRemSetIterator;
 
@@ -233,14 +225,12 @@
 
   static jint n_coarsenings() { return OtherRegionsTable::n_coarsenings(); }
 
-  /* Used in the sequential case.  Returns "true" iff this addition causes
-     the size limit to be reached. */
+  // Used in the sequential case.
   void add_reference(OopOrNarrowOopStar from) {
-    _other_regions.add_reference(from);
+    _other_regions.add_reference(from, 0);
   }
 
-  /* Used in the parallel case.  Returns "true" iff this addition causes
-     the size limit to be reached. */
+  // Used in the parallel case.
   void add_reference(OopOrNarrowOopStar from, int tid) {
     _other_regions.add_reference(from, tid);
   }
@@ -253,15 +243,6 @@
   // entries for this region in other remsets.
   void clear();
 
-  // Forget any entries due to pointers from "from_hr".
-  void clear_incoming_entry(HeapRegion* from_hr) {
-    _other_regions.clear_incoming_entry(from_hr);
-  }
-
-#if 0
-  virtual void cleanup() = 0;
-#endif
-
   // Attempt to claim the region.  Returns true iff this call caused an
   // atomic transition from Unclaimed to Claimed.
   bool claim_iter();
@@ -290,12 +271,6 @@
   // Initialize the given iterator to iterate over this rem set.
   void init_iterator(HeapRegionRemSetIterator* iter) const;
 
-#if 0
-  // Apply the "do_card" method to the start address of every card in the
-  // rem set.  Returns false if some application of the closure aborted.
-  virtual bool card_iterate(CardClosure* iter) = 0;
-#endif
-
   // The actual # of bytes this hr_remset takes up.
   size_t mem_size() {
     return _other_regions.mem_size()
@@ -322,10 +297,7 @@
   void print() const;
 
   // Called during a stop-world phase to perform any deferred cleanups.
-  // The second version may be called by parallel threads after then finish
-  // collection work.
   static void cleanup();
-  static void par_cleanup();
 
   // Declare the heap size (in # of regions) to the HeapRegionRemSet(s).
   // (Uses it to initialize from_card_cache).
@@ -360,14 +332,14 @@
 #endif
 };
 
-class HeapRegionRemSetIterator : public CHeapObj {
+class HeapRegionRemSetIterator : public CHeapObj<mtGC> {
 
   // The region over which we're iterating.
   const HeapRegionRemSet* _hrrs;
 
   // Local caching of HRRS fields.
   const BitMap*             _coarse_map;
-  PosParPRT**               _fine_grain_regions;
+  PerRegionTable**          _fine_grain_regions;
 
   G1BlockOffsetSharedArray* _bosa;
   G1CollectedHeap*          _g1h;
@@ -404,8 +376,9 @@
 
   // Index of bucket-list we're working on.
   int _fine_array_index;
+
   // Per Region Table we're doing within current bucket list.
-  PosParPRT* _fine_cur_prt;
+  PerRegionTable* _fine_cur_prt;
 
   /* SparsePRT::*/ SparsePRTIter _sparse_iter;
 
@@ -435,12 +408,4 @@
   }
 };
 
-#if 0
-class CardClosure: public Closure {
-public:
-  virtual void do_card(HeapWord* card_start) = 0;
-};
-
-#endif
-
 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONREMSET_HPP
--- a/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -86,7 +86,7 @@
   _allocated_length = 0;
   _max_length = max_length;
 
-  _regions = NEW_C_HEAP_ARRAY(HeapRegion*, max_length);
+  _regions = NEW_C_HEAP_ARRAY(HeapRegion*, max_length, mtGC);
   memset(_regions, 0, (size_t) max_length * sizeof(HeapRegion*));
   _regions_biased = _regions - ((uintx) bottom >> _region_shift);
 
--- a/src/share/vm/gc_implementation/g1/heapRegionSeq.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/heapRegionSeq.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -53,7 +53,7 @@
 //
 // and maintain that: _length <= _allocated_length <= _max_length
 
-class HeapRegionSeq: public CHeapObj {
+class HeapRegionSeq: public CHeapObj<mtGC> {
   friend class VMStructs;
 
   // The array that holds the HeapRegions.
--- a/src/share/vm/gc_implementation/g1/ptrQueue.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/ptrQueue.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -126,7 +126,7 @@
     return res;
   } else {
     // Allocate space for the BufferNode in front of the buffer.
-    char *b =  NEW_C_HEAP_ARRAY(char, _sz + BufferNode::aligned_size());
+    char *b =  NEW_C_HEAP_ARRAY(char, _sz + BufferNode::aligned_size(), mtGC);
     return BufferNode::make_buffer_from_block(b);
   }
 }
@@ -149,7 +149,7 @@
     assert(_buf_free_list != NULL, "_buf_free_list_sz must be wrong.");
     void* b = BufferNode::make_block_from_node(_buf_free_list);
     _buf_free_list = _buf_free_list->next();
-    FREE_C_HEAP_ARRAY(char, b);
+    FREE_C_HEAP_ARRAY(char, b, mtGC);
     _buf_free_list_sz --;
     n--;
   }
--- a/src/share/vm/gc_implementation/g1/satbQueue.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/satbQueue.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -208,7 +208,7 @@
   PtrQueueSet::initialize(cbl_mon, fl_lock, process_completed_threshold, -1);
   _shared_satb_queue.set_lock(lock);
   if (ParallelGCThreads > 0) {
-    _par_closures = NEW_C_HEAP_ARRAY(ObjectClosure*, ParallelGCThreads);
+    _par_closures = NEW_C_HEAP_ARRAY(ObjectClosure*, ParallelGCThreads, mtGC);
   }
 }
 
--- a/src/share/vm/gc_implementation/g1/sparsePRT.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/sparsePRT.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -148,8 +148,8 @@
 RSHashTable::RSHashTable(size_t capacity) :
   _capacity(capacity), _capacity_mask(capacity-1),
   _occupied_entries(0), _occupied_cards(0),
-  _entries((SparsePRTEntry*)NEW_C_HEAP_ARRAY(char, SparsePRTEntry::size() * capacity)),
-  _buckets(NEW_C_HEAP_ARRAY(int, capacity)),
+  _entries((SparsePRTEntry*)NEW_C_HEAP_ARRAY(char, SparsePRTEntry::size() * capacity, mtGC)),
+  _buckets(NEW_C_HEAP_ARRAY(int, capacity, mtGC)),
   _free_list(NullEntry), _free_region(0)
 {
   clear();
@@ -157,11 +157,11 @@
 
 RSHashTable::~RSHashTable() {
   if (_entries != NULL) {
-    FREE_C_HEAP_ARRAY(SparsePRTEntry, _entries);
+    FREE_C_HEAP_ARRAY(SparsePRTEntry, _entries, mtGC);
     _entries = NULL;
   }
   if (_buckets != NULL) {
-    FREE_C_HEAP_ARRAY(int, _buckets);
+    FREE_C_HEAP_ARRAY(int, _buckets, mtGC);
     _buckets = NULL;
   }
 }
--- a/src/share/vm/gc_implementation/g1/sparsePRT.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/sparsePRT.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -42,7 +42,7 @@
 // insertions only enqueue old versions for deletions, but do not delete
 // old versions synchronously.
 
-class SparsePRTEntry: public CHeapObj {
+class SparsePRTEntry: public CHeapObj<mtGC> {
 public:
   enum SomePublicConstants {
     NullEntry     = -1,
@@ -101,7 +101,7 @@
 };
 
 
-class RSHashTable : public CHeapObj {
+class RSHashTable : public CHeapObj<mtGC> {
 
   friend class RSHashTableIter;
 
--- a/src/share/vm/gc_implementation/g1/survRateGroup.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/survRateGroup.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -43,7 +43,7 @@
   reset();
   if (summary_surv_rates_len > 0) {
     size_t length = summary_surv_rates_len;
-    _summary_surv_rates = NEW_C_HEAP_ARRAY(NumberSeq*, length);
+      _summary_surv_rates = NEW_C_HEAP_ARRAY(NumberSeq*, length, mtGC);
     for (size_t i = 0; i < length; ++i) {
       _summary_surv_rates[i] = new NumberSeq();
     }
@@ -90,9 +90,9 @@
     double* old_accum_surv_rate_pred = _accum_surv_rate_pred;
     TruncatedSeq** old_surv_rate_pred = _surv_rate_pred;
 
-    _surv_rate = NEW_C_HEAP_ARRAY(double, _region_num);
-    _accum_surv_rate_pred = NEW_C_HEAP_ARRAY(double, _region_num);
-    _surv_rate_pred = NEW_C_HEAP_ARRAY(TruncatedSeq*, _region_num);
+    _surv_rate = NEW_C_HEAP_ARRAY(double, _region_num, mtGC);
+    _accum_surv_rate_pred = NEW_C_HEAP_ARRAY(double, _region_num, mtGC);
+    _surv_rate_pred = NEW_C_HEAP_ARRAY(TruncatedSeq*, _region_num, mtGC);
 
     for (size_t i = 0; i < _stats_arrays_length; ++i) {
       _surv_rate_pred[i] = old_surv_rate_pred[i];
@@ -104,13 +104,13 @@
     _stats_arrays_length = _region_num;
 
     if (old_surv_rate != NULL) {
-      FREE_C_HEAP_ARRAY(double, old_surv_rate);
+      FREE_C_HEAP_ARRAY(double, old_surv_rate, mtGC);
     }
     if (old_accum_surv_rate_pred != NULL) {
-      FREE_C_HEAP_ARRAY(double, old_accum_surv_rate_pred);
+      FREE_C_HEAP_ARRAY(double, old_accum_surv_rate_pred, mtGC);
     }
     if (old_surv_rate_pred != NULL) {
-      FREE_C_HEAP_ARRAY(TruncatedSeq*, old_surv_rate_pred);
+      FREE_C_HEAP_ARRAY(TruncatedSeq*, old_surv_rate_pred, mtGC);
     }
   }
 
--- a/src/share/vm/gc_implementation/g1/survRateGroup.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/g1/survRateGroup.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -29,7 +29,7 @@
 
 class G1CollectorPolicy;
 
-class SurvRateGroup : public CHeapObj {
+class SurvRateGroup : public CHeapObj<mtGC> {
 private:
   G1CollectorPolicy* _g1p;
   const char* _name;
--- a/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -457,12 +457,12 @@
         if (_lowest_non_clean[i] != NULL) {
           assert(n_chunks != _lowest_non_clean_chunk_size[i],
                  "logical consequence");
-          FREE_C_HEAP_ARRAY(CardPtr, _lowest_non_clean[i]);
+          FREE_C_HEAP_ARRAY(CardPtr, _lowest_non_clean[i], mtGC);
           _lowest_non_clean[i] = NULL;
         }
         // Now allocate a new one if necessary.
         if (_lowest_non_clean[i] == NULL) {
-          _lowest_non_clean[i]                  = NEW_C_HEAP_ARRAY(CardPtr, n_chunks);
+          _lowest_non_clean[i]                  = NEW_C_HEAP_ARRAY(CardPtr, n_chunks, mtGC);
           _lowest_non_clean_chunk_size[i]       = n_chunks;
           _lowest_non_clean_base_chunk_index[i] = addr_to_chunk_index(covered.start());
           for (int j = 0; j < (int)n_chunks; j++)
--- a/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -35,7 +35,7 @@
 class PLABStats;
 
 // A per-thread allocation buffer used during GC.
-class ParGCAllocBuffer: public CHeapObj {
+class ParGCAllocBuffer: public CHeapObj<mtGC> {
 protected:
   char head[32];
   size_t _word_sz;          // in HeapWord units
--- a/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -59,7 +59,7 @@
                                        Generation* old_gen_,
                                        int thread_num_,
                                        ObjToScanQueueSet* work_queue_set_,
-                                       Stack<oop>* overflow_stacks_,
+                                       Stack<oop, mtGC>* overflow_stacks_,
                                        size_t desired_plab_sz_,
                                        ParallelTaskTerminator& term_) :
   _to_space(to_space_), _old_gen(old_gen_), _young_gen(gen_), _thread_num(thread_num_),
@@ -184,7 +184,7 @@
   assert(ParGCUseLocalOverflow, "Else should not call");
   assert(young_gen()->overflow_list() == NULL, "Error");
   ObjToScanQueue* queue = work_queue();
-  Stack<oop>* const of_stack = overflow_stack();
+  Stack<oop, mtGC>* const of_stack = overflow_stack();
   const size_t num_overflow_elems = of_stack->size();
   const size_t space_available = queue->max_elems() - queue->size();
   const size_t num_take_elems = MIN3(space_available / 4,
@@ -297,7 +297,7 @@
                         ParNewGeneration&       gen,
                         Generation&             old_gen,
                         ObjToScanQueueSet&      queue_set,
-                        Stack<oop>*             overflow_stacks_,
+                        Stack<oop, mtGC>*       overflow_stacks_,
                         size_t                  desired_plab_sz,
                         ParallelTaskTerminator& term);
 
@@ -331,7 +331,7 @@
 ParScanThreadStateSet::ParScanThreadStateSet(
   int num_threads, Space& to_space, ParNewGeneration& gen,
   Generation& old_gen, ObjToScanQueueSet& queue_set,
-  Stack<oop>* overflow_stacks,
+  Stack<oop, mtGC>* overflow_stacks,
   size_t desired_plab_sz, ParallelTaskTerminator& term)
   : ResourceArray(sizeof(ParScanThreadState), num_threads),
     _gen(gen), _next_gen(old_gen), _term(term)
@@ -649,9 +649,14 @@
 
   _overflow_stacks = NULL;
   if (ParGCUseLocalOverflow) {
-    _overflow_stacks = NEW_C_HEAP_ARRAY(Stack<oop>, ParallelGCThreads);
+
+    // typedef to workaround NEW_C_HEAP_ARRAY macro, which can not deal
+    // with ','
+    typedef Stack<oop, mtGC> GCOopStack;
+
+    _overflow_stacks = NEW_C_HEAP_ARRAY(GCOopStack, ParallelGCThreads, mtGC);
     for (size_t i = 0; i < ParallelGCThreads; ++i) {
-      new (_overflow_stacks + i) Stack<oop>();
+      new (_overflow_stacks + i) Stack<oop, mtGC>();
     }
   }
 
@@ -1401,7 +1406,7 @@
     assert(_num_par_pushes > 0, "Tautology");
 #endif
     if (from_space_obj->forwardee() == from_space_obj) {
-      oopDesc* listhead = NEW_C_HEAP_ARRAY(oopDesc, 1);
+      oopDesc* listhead = NEW_C_HEAP_ARRAY(oopDesc, 1, mtGC);
       listhead->forward_to(from_space_obj);
       from_space_obj = listhead;
     }
@@ -1553,7 +1558,7 @@
       // This can become a scaling bottleneck when there is work queue overflow coincident
       // with promotion failure.
       oopDesc* f = cur;
-      FREE_C_HEAP_ARRAY(oopDesc, f);
+      FREE_C_HEAP_ARRAY(oopDesc, f, mtGC);
     } else if (par_scan_state->should_be_partially_scanned(obj_to_push, cur)) {
       assert(arrayOop(cur)->length() == 0, "entire array remaining to be scanned");
       obj_to_push = cur;
--- a/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -41,7 +41,7 @@
 // in genOopClosures.inline.hpp.
 
 typedef Padded<OopTaskQueue> ObjToScanQueue;
-typedef GenericTaskQueueSet<ObjToScanQueue> ObjToScanQueueSet;
+typedef GenericTaskQueueSet<ObjToScanQueue, mtGC> ObjToScanQueueSet;
 
 class ParKeepAliveClosure: public DefNewGeneration::KeepAliveClosure {
  private:
@@ -59,7 +59,7 @@
   friend class ParScanThreadStateSet;
  private:
   ObjToScanQueue *_work_queue;
-  Stack<oop>* const _overflow_stack;
+  Stack<oop, mtGC>* const _overflow_stack;
 
   ParGCAllocBuffer _to_space_alloc_buffer;
 
@@ -127,7 +127,7 @@
   ParScanThreadState(Space* to_space_, ParNewGeneration* gen_,
                      Generation* old_gen_, int thread_num_,
                      ObjToScanQueueSet* work_queue_set_,
-                     Stack<oop>* overflow_stacks_,
+                     Stack<oop, mtGC>* overflow_stacks_,
                      size_t desired_plab_sz_,
                      ParallelTaskTerminator& term_);
 
@@ -151,7 +151,7 @@
   void trim_queues(int max_size);
 
   // Private overflow stack usage
-  Stack<oop>* overflow_stack() { return _overflow_stack; }
+  Stack<oop, mtGC>* overflow_stack() { return _overflow_stack; }
   bool take_from_overflow_stack();
   void push_on_overflow_stack(oop p);
 
@@ -312,7 +312,7 @@
   ObjToScanQueueSet* _task_queues;
 
   // Per-worker-thread local overflow stacks
-  Stack<oop>* _overflow_stacks;
+  Stack<oop, mtGC>* _overflow_stacks;
 
   // Desired size of survivor space plab's
   PLABStats _plab_stats;
--- a/src/share/vm/gc_implementation/parNew/parOopClosures.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parNew/parOopClosures.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -32,7 +32,7 @@
 class ParScanThreadState;
 class ParNewGeneration;
 typedef Padded<OopTaskQueue> ObjToScanQueue;
-typedef GenericTaskQueueSet<ObjToScanQueue> ObjToScanQueueSet;
+typedef GenericTaskQueueSet<ObjToScanQueue, mtGC> ObjToScanQueueSet;
 class ParallelTaskTerminator;
 
 class ParScanClosure: public OopsInGenClosure {
--- a/src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -40,7 +40,7 @@
 // must be shrunk.  Adjusting the boundary between the generations
 // is called for in this class.
 
-class AdjoiningGenerations : public CHeapObj {
+class AdjoiningGenerations : public CHeapObj<mtGC> {
   friend class VMStructs;
  private:
   // The young generation and old generation, respectively
--- a/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -116,7 +116,7 @@
 }
 
 GCTaskQueue* GCTaskQueue::create_on_c_heap() {
-  GCTaskQueue* result = new(ResourceObj::C_HEAP) GCTaskQueue(true);
+  GCTaskQueue* result = new(ResourceObj::C_HEAP, mtGC) GCTaskQueue(true);
   if (TraceGCTaskQueue) {
     tty->print_cr("GCTaskQueue::create_on_c_heap()"
                   " returns " INTPTR_FORMAT,
@@ -403,19 +403,19 @@
   _queue = SynchronizedGCTaskQueue::create(unsynchronized_queue, lock());
   _noop_task = NoopGCTask::create_on_c_heap();
   _idle_inactive_task = WaitForBarrierGCTask::create_on_c_heap();
-  _resource_flag = NEW_C_HEAP_ARRAY(bool, workers());
+  _resource_flag = NEW_C_HEAP_ARRAY(bool, workers(), mtGC);
   {
     // Set up worker threads.
     //     Distribute the workers among the available processors,
     //     unless we were told not to, or if the os doesn't want to.
-    uint* processor_assignment = NEW_C_HEAP_ARRAY(uint, workers());
+    uint* processor_assignment = NEW_C_HEAP_ARRAY(uint, workers(), mtGC);
     if (!BindGCTaskThreadsToCPUs ||
         !os::distribute_processes(workers(), processor_assignment)) {
       for (uint a = 0; a < workers(); a += 1) {
         processor_assignment[a] = sentinel_worker();
       }
     }
-    _thread = NEW_C_HEAP_ARRAY(GCTaskThread*, workers());
+    _thread = NEW_C_HEAP_ARRAY(GCTaskThread*, workers(), mtGC);
     for (uint t = 0; t < workers(); t += 1) {
       set_thread(t, GCTaskThread::create(this, t, processor_assignment[t]));
     }
@@ -426,7 +426,7 @@
       }
       tty->cr();
     }
-    FREE_C_HEAP_ARRAY(uint, processor_assignment);
+    FREE_C_HEAP_ARRAY(uint, processor_assignment, mtGC);
   }
   reset_busy_workers();
   set_unblocked();
@@ -455,11 +455,11 @@
       GCTaskThread::destroy(thread(i));
       set_thread(i, NULL);
     }
-    FREE_C_HEAP_ARRAY(GCTaskThread*, _thread);
+    FREE_C_HEAP_ARRAY(GCTaskThread*, _thread, mtGC);
     _thread = NULL;
   }
   if (_resource_flag != NULL) {
-    FREE_C_HEAP_ARRAY(bool, _resource_flag);
+    FREE_C_HEAP_ARRAY(bool, _resource_flag, mtGC);
     _resource_flag = NULL;
   }
   if (queue() != NULL) {
@@ -817,7 +817,7 @@
 }
 
 NoopGCTask* NoopGCTask::create_on_c_heap() {
-  NoopGCTask* result = new(ResourceObj::C_HEAP) NoopGCTask(true);
+  NoopGCTask* result = new(ResourceObj::C_HEAP, mtGC) NoopGCTask(true);
   return result;
 }
 
@@ -848,7 +848,7 @@
 }
 
 IdleGCTask* IdleGCTask::create_on_c_heap() {
-  IdleGCTask* result = new(ResourceObj::C_HEAP) IdleGCTask(true);
+  IdleGCTask* result = new(ResourceObj::C_HEAP, mtGC) IdleGCTask(true);
   assert(UseDynamicNumberOfGCThreads,
     "Should only be used with dynamic GC thread");
   return result;
@@ -984,7 +984,7 @@
 
 WaitForBarrierGCTask* WaitForBarrierGCTask::create_on_c_heap() {
   WaitForBarrierGCTask* result =
-    new (ResourceObj::C_HEAP) WaitForBarrierGCTask(true);
+    new (ResourceObj::C_HEAP, mtGC) WaitForBarrierGCTask(true);
   return result;
 }
 
@@ -1114,7 +1114,7 @@
     // Lazy initialization.
     if (freelist() == NULL) {
       _freelist =
-        new(ResourceObj::C_HEAP) GrowableArray<Monitor*>(ParallelGCThreads,
+        new(ResourceObj::C_HEAP, mtGC) GrowableArray<Monitor*>(ParallelGCThreads,
                                                          true);
     }
     if (! freelist()->is_empty()) {
--- a/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -216,7 +216,7 @@
 
 // A GCTaskQueue that can be synchronized.
 // This "has-a" GCTaskQueue and a mutex to do the exclusion.
-class SynchronizedGCTaskQueue : public CHeapObj {
+class SynchronizedGCTaskQueue : public CHeapObj<mtGC> {
 private:
   // Instance state.
   GCTaskQueue* _unsynchronized_queue;   // Has-a unsynchronized queue.
@@ -278,7 +278,7 @@
 
 // This is an abstract base class for getting notifications
 // when a GCTaskManager is done.
-class NotifyDoneClosure : public CHeapObj {
+class NotifyDoneClosure : public CHeapObj<mtGC> {
 public:
   // The notification callback method.
   virtual void notify(GCTaskManager* manager) = 0;
@@ -355,7 +355,7 @@
 // held in the GCTaskThread** _thread array in GCTaskManager.
 
 
-class GCTaskManager : public CHeapObj {
+class GCTaskManager : public CHeapObj<mtGC> {
  friend class ParCompactionManager;
  friend class PSParallelCompact;
  friend class PSScavenge;
--- a/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -46,7 +46,7 @@
     vm_exit_out_of_memory(0, "Cannot create GC thread. Out of system resources.");
 
   if (PrintGCTaskTimeStamps) {
-    _time_stamps = NEW_C_HEAP_ARRAY(GCTaskTimeStamp, GCTaskTimeStampEntries );
+    _time_stamps = NEW_C_HEAP_ARRAY(GCTaskTimeStamp, GCTaskTimeStampEntries, mtGC);
 
     guarantee(_time_stamps != NULL, "Sanity");
   }
@@ -56,7 +56,7 @@
 
 GCTaskThread::~GCTaskThread() {
   if (_time_stamps != NULL) {
-    FREE_C_HEAP_ARRAY(GCTaskTimeStamp, _time_stamps);
+    FREE_C_HEAP_ARRAY(GCTaskTimeStamp, _time_stamps, mtGC);
   }
 }
 
--- a/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -90,7 +90,7 @@
   void set_is_working(bool v) { _is_working = v; }
 };
 
-class GCTaskTimeStamp : public CHeapObj
+class GCTaskTimeStamp : public CHeapObj<mtGC>
 {
  private:
   jlong  _entry_time;
--- a/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -28,6 +28,7 @@
 #include "memory/cardTableModRefBS.hpp"
 #include "oops/oop.inline.hpp"
 #include "runtime/java.hpp"
+#include "services/memTracker.hpp"
 
 void ObjectStartArray::initialize(MemRegion reserved_region) {
   // We're based on the assumption that we use the same
@@ -50,6 +51,7 @@
   if (!backing_store.is_reserved()) {
     vm_exit_during_initialization("Could not reserve space for ObjectStartArray");
   }
+  MemTracker::record_virtual_memory_type((address)backing_store.base(), mtGC);
 
   // We do not commit any memory initially
   if (!_virtual_space.initialize(backing_store, 0)) {
@@ -57,10 +59,14 @@
   }
 
   _raw_base = (jbyte*)_virtual_space.low_boundary();
+
   if (_raw_base == NULL) {
     vm_exit_during_initialization("Could not get raw_base address");
   }
 
+  MemTracker::record_virtual_memory_type((address)_raw_base, mtGC);
+
+
   _offset_base = _raw_base - (size_t(reserved_region.start()) >> block_shift);
 
   _covered_region.set_start(reserved_region.start());
--- a/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -35,7 +35,7 @@
 // covered region.
 //
 
-class ObjectStartArray : public CHeapObj {
+class ObjectStartArray : public CHeapObj<mtGC> {
  friend class VerifyObjectStartArrayClosure;
 
  private:
--- a/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -29,6 +29,7 @@
 #include "oops/oop.inline.hpp"
 #include "runtime/os.hpp"
 #include "utilities/bitMap.inline.hpp"
+#include "services/memTracker.hpp"
 #ifdef TARGET_OS_FAMILY_linux
 # include "os_linux.inline.hpp"
 #endif
@@ -61,6 +62,9 @@
   ReservedSpace rs(bytes, rs_align, rs_align > 0);
   os::trace_page_sizes("par bitmap", raw_bytes, raw_bytes, page_sz,
                        rs.base(), rs.size());
+
+  MemTracker::record_virtual_memory_type((address)rs.base(), mtGC);
+
   _virtual_space = new PSVirtualSpace(rs, page_sz);
   if (_virtual_space != NULL && _virtual_space->expand_by(bytes)) {
     _region_start = covered_region.start();
--- a/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -32,7 +32,7 @@
 class oopDesc;
 class ParMarkBitMapClosure;
 
-class ParMarkBitMap: public CHeapObj
+class ParMarkBitMap: public CHeapObj<mtGC>
 {
 public:
   typedef BitMap::idx_t idx_t;
--- a/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -40,6 +40,7 @@
 #include "runtime/handles.inline.hpp"
 #include "runtime/java.hpp"
 #include "runtime/vmThread.hpp"
+#include "services/memTracker.hpp"
 #include "utilities/vmError.hpp"
 
 PSYoungGen*  ParallelScavengeHeap::_young_gen = NULL;
@@ -161,6 +162,8 @@
     }
   }
 
+  MemTracker::record_virtual_memory_type((address)heap_rs.base(), mtJavaHeap);
+
   os::trace_page_sizes("ps perm", pg_min_size, pg_max_size, pg_page_sz,
                        heap_rs.base(), pg_max_size);
   os::trace_page_sizes("ps main", og_min_size + yg_min_size,
--- a/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -81,14 +81,14 @@
   uint parallel_gc_threads = PSParallelCompact::gc_task_manager()->workers();
 
   assert(_manager_array == NULL, "Attempt to initialize twice");
-  _manager_array = NEW_C_HEAP_ARRAY(ParCompactionManager*, parallel_gc_threads+1 );
+  _manager_array = NEW_C_HEAP_ARRAY(ParCompactionManager*, parallel_gc_threads+1, mtGC);
   guarantee(_manager_array != NULL, "Could not allocate manager_array");
 
   _region_list = NEW_C_HEAP_ARRAY(RegionTaskQueue*,
-                                         parallel_gc_threads+1);
+                         parallel_gc_threads+1, mtGC);
   guarantee(_region_list != NULL, "Could not initialize promotion manager");
 
-  _recycled_stack_index = NEW_C_HEAP_ARRAY(uint, parallel_gc_threads);
+  _recycled_stack_index = NEW_C_HEAP_ARRAY(uint, parallel_gc_threads, mtGC);
 
   // parallel_gc-threads + 1 to be consistent with the number of
   // compaction managers.
--- a/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -41,7 +41,7 @@
 class ParallelCompactData;
 class ParMarkBitMap;
 
-class ParCompactionManager : public CHeapObj {
+class ParCompactionManager : public CHeapObj<mtGC> {
   friend class ParallelTaskTerminator;
   friend class ParMarkBitMap;
   friend class PSParallelCompact;
@@ -66,8 +66,8 @@
  private:
   // 32-bit:  4K * 8 = 32KiB; 64-bit:  8K * 16 = 128KiB
   #define QUEUE_SIZE (1 << NOT_LP64(12) LP64_ONLY(13))
-  typedef OverflowTaskQueue<ObjArrayTask, QUEUE_SIZE> ObjArrayTaskQueue;
-  typedef GenericTaskQueueSet<ObjArrayTaskQueue>      ObjArrayTaskQueueSet;
+  typedef OverflowTaskQueue<ObjArrayTask, mtGC, QUEUE_SIZE> ObjArrayTaskQueue;
+  typedef GenericTaskQueueSet<ObjArrayTaskQueue, mtGC>      ObjArrayTaskQueueSet;
   #undef QUEUE_SIZE
 
   static ParCompactionManager** _manager_array;
@@ -78,7 +78,7 @@
   static PSOldGen*              _old_gen;
 
 private:
-  OverflowTaskQueue<oop>        _marking_stack;
+  OverflowTaskQueue<oop, mtGC>        _marking_stack;
   ObjArrayTaskQueue             _objarray_stack;
 
   // Is there a way to reuse the _marking_stack for the
@@ -110,8 +110,8 @@
   // popped.  If -1, there has not been any entry popped.
   static int                      _recycled_bottom;
 
-  Stack<Klass*>                 _revisit_klass_stack;
-  Stack<DataLayout*>            _revisit_mdo_stack;
+  Stack<Klass*, mtGC>                 _revisit_klass_stack;
+  Stack<DataLayout*, mtGC>            _revisit_mdo_stack;
 
   static ParMarkBitMap* _mark_bitmap;
 
@@ -126,7 +126,7 @@
  protected:
   // Array of tasks.  Needed by the ParallelTaskTerminator.
   static RegionTaskQueueSet* region_array()      { return _region_array; }
-  OverflowTaskQueue<oop>*  marking_stack()       { return &_marking_stack; }
+  OverflowTaskQueue<oop, mtGC>*  marking_stack()       { return &_marking_stack; }
 
   // Pushes onto the marking stack.  If the marking stack is full,
   // pushes onto the overflow stack.
@@ -175,8 +175,8 @@
   bool should_update();
   bool should_copy();
 
-  Stack<Klass*>* revisit_klass_stack() { return &_revisit_klass_stack; }
-  Stack<DataLayout*>* revisit_mdo_stack() { return &_revisit_mdo_stack; }
+  Stack<Klass*, mtGC>* revisit_klass_stack() { return &_revisit_klass_stack; }
+  Stack<DataLayout*, mtGC>* revisit_mdo_stack() { return &_revisit_mdo_stack; }
 
   // Save for later processing.  Must not fail.
   inline void push(oop obj) { _marking_stack.push(obj); }
--- a/src/share/vm/gc_implementation/parallelScavenge/psGenerationCounters.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/psGenerationCounters.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -40,7 +40,7 @@
 
     const char* cns = PerfDataManager::name_space("generation", ordinal);
 
-    _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1);
+    _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1, mtGC);
     strcpy(_name_space, cns);
 
     const char* cname = PerfDataManager::counter_name(_name_space, "name");
--- a/src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -34,7 +34,7 @@
 
 class ObjectStartArray;
 
-class PSMarkSweepDecorator: public CHeapObj {
+class PSMarkSweepDecorator: public CHeapObj<mtGC> {
  private:
   static PSMarkSweepDecorator* _destination_decorator;
 
--- a/src/share/vm/gc_implementation/parallelScavenge/psOldGen.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/psOldGen.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -34,7 +34,7 @@
 
 class PSMarkSweepDecorator;
 
-class PSOldGen : public CHeapObj {
+class PSOldGen : public CHeapObj<mtGC> {
   friend class VMStructs;
   friend class PSPromotionManager; // Uses the cas_allocate methods
   friend class ParallelScavengeHeap;
--- a/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -53,6 +53,7 @@
 #include "runtime/vmThread.hpp"
 #include "services/management.hpp"
 #include "services/memoryService.hpp"
+#include "services/memTracker.hpp"
 #include "utilities/events.hpp"
 #include "utilities/stack.inline.hpp"
 
@@ -405,6 +406,9 @@
   ReservedSpace rs(bytes, rs_align, rs_align > 0);
   os::trace_page_sizes("par compact", raw_bytes, raw_bytes, page_sz, rs.base(),
                        rs.size());
+
+  MemTracker::record_virtual_memory_type((address)rs.base(), mtGC);
+
   PSVirtualSpace* vspace = new PSVirtualSpace(rs, page_sz);
   if (vspace != 0) {
     if (vspace->expand_by(bytes)) {
@@ -2732,7 +2736,7 @@
   for (uint i = 0; i < ParallelGCThreads + 1; i++) {
     ParCompactionManager* cm = ParCompactionManager::manager_array(i);
     KeepAliveClosure keep_alive_closure(cm);
-    Stack<Klass*>* const rks = cm->revisit_klass_stack();
+    Stack<Klass*, mtGC>* const rks = cm->revisit_klass_stack();
     if (PrintRevisitStats) {
       gclog_or_tty->print_cr("Revisit klass stack[%u] length = " SIZE_FORMAT,
                              i, rks->size());
@@ -2765,7 +2769,7 @@
   }
   for (uint i = 0; i < ParallelGCThreads + 1; i++) {
     ParCompactionManager* cm = ParCompactionManager::manager_array(i);
-    Stack<DataLayout*>* rms = cm->revisit_mdo_stack();
+    Stack<DataLayout*, mtGC>* rms = cm->revisit_mdo_stack();
     if (PrintRevisitStats) {
       gclog_or_tty->print_cr("Revisit MDO stack[%u] size = " SIZE_FORMAT,
                              i, rms->size());
--- a/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -36,7 +36,7 @@
 
 class ObjectStartArray;
 
-class PSPromotionLAB : public CHeapObj {
+class PSPromotionLAB : public CHeapObj<mtGC> {
  protected:
   static size_t filler_header_size;
 
--- a/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -45,7 +45,7 @@
   _young_space = heap->young_gen()->to_space();
 
   assert(_manager_array == NULL, "Attempt to initialize twice");
-  _manager_array = NEW_C_HEAP_ARRAY(PSPromotionManager*, ParallelGCThreads+1 );
+  _manager_array = NEW_C_HEAP_ARRAY(PSPromotionManager*, ParallelGCThreads+1, mtGC);
   guarantee(_manager_array != NULL, "Could not initialize promotion manager");
 
   _stack_array_depth = new OopStarTaskQueueSet(ParallelGCThreads);
--- a/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -49,7 +49,7 @@
 class PSOldGen;
 class ParCompactionManager;
 
-class PSPromotionManager : public CHeapObj {
+class PSPromotionManager : public CHeapObj<mtGC> {
   friend class PSScavenge;
   friend class PSRefProcTaskExecutor;
  private:
@@ -77,7 +77,7 @@
   bool                                _old_gen_is_full;
 
   OopStarTaskQueue                    _claimed_stack_depth;
-  OverflowTaskQueue<oop>              _claimed_stack_breadth;
+  OverflowTaskQueue<oop, mtGC>        _claimed_stack_breadth;
 
   bool                                _totally_drain;
   uint                                _target_stack_size;
--- a/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -62,8 +62,8 @@
 int                        PSScavenge::_tenuring_threshold = 0;
 HeapWord*                  PSScavenge::_young_generation_boundary = NULL;
 elapsedTimer               PSScavenge::_accumulated_time;
-Stack<markOop>             PSScavenge::_preserved_mark_stack;
-Stack<oop>                 PSScavenge::_preserved_oop_stack;
+Stack<markOop, mtGC>       PSScavenge::_preserved_mark_stack;
+Stack<oop, mtGC>           PSScavenge::_preserved_oop_stack;
 CollectorCounters*         PSScavenge::_counters = NULL;
 bool                       PSScavenge::_promotion_failed = false;
 
--- a/src/share/vm/gc_implementation/parallelScavenge/psScavenge.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/psScavenge.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -71,8 +71,8 @@
   static HeapWord*           _young_generation_boundary; // The lowest address possible for the young_gen.
                                                          // This is used to decide if an oop should be scavenged,
                                                          // cards should be marked, etc.
-  static Stack<markOop>          _preserved_mark_stack; // List of marks to be restored after failed promotion
-  static Stack<oop>              _preserved_oop_stack;  // List of oops that need their mark restored.
+  static Stack<markOop, mtGC> _preserved_mark_stack; // List of marks to be restored after failed promotion
+  static Stack<oop, mtGC>     _preserved_oop_stack;  // List of oops that need their mark restored.
   static CollectorCounters*      _counters;         // collector performance counters
   static bool                    _promotion_failed;
 
--- a/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -32,7 +32,7 @@
 // VirtualSpace is data structure for committing a previously reserved address
 // range in smaller chunks.
 
-class PSVirtualSpace : public CHeapObj {
+class PSVirtualSpace : public CHeapObj<mtGC> {
   friend class VMStructs;
  protected:
   // The space is committed/uncommited in chunks of size _alignment.  The
--- a/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -33,7 +33,7 @@
 
 class PSMarkSweepDecorator;
 
-class PSYoungGen : public CHeapObj {
+class PSYoungGen : public CHeapObj<mtGC> {
   friend class VMStructs;
   friend class ParallelScavengeHeap;
   friend class AdjoiningGenerations;
--- a/src/share/vm/gc_implementation/shared/adaptiveSizePolicy.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/adaptiveSizePolicy.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -38,7 +38,7 @@
 class elapsedTimer;
 class CollectorPolicy;
 
-class AdaptiveSizePolicy : public CHeapObj {
+class AdaptiveSizePolicy : public CHeapObj<mtGC> {
  friend class GCAdaptivePolicyCounters;
  friend class PSGCAdaptivePolicyCounters;
  friend class CMSGCAdaptivePolicyCounters;
--- a/src/share/vm/gc_implementation/shared/cSpaceCounters.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/cSpaceCounters.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -37,7 +37,7 @@
     const char* cns = PerfDataManager::name_space(gc->name_space(), "space",
                                                   ordinal);
 
-    _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1);
+    _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1, mtGC);
     strcpy(_name_space, cns);
 
     const char* cname = PerfDataManager::counter_name(_name_space, "name");
--- a/src/share/vm/gc_implementation/shared/cSpaceCounters.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/cSpaceCounters.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -32,7 +32,7 @@
 // A CSpaceCounters is a holder class for performance counters
 // that track a space;
 
-class CSpaceCounters: public CHeapObj {
+class CSpaceCounters: public CHeapObj<mtGC> {
   friend class VMStructs;
 
  private:
@@ -52,7 +52,7 @@
                  ContiguousSpace* s, GenerationCounters* gc);
 
   ~CSpaceCounters() {
-      if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space);
+      if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space, mtInternal);
   }
 
   inline void update_capacity() {
--- a/src/share/vm/gc_implementation/shared/collectorCounters.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/collectorCounters.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -34,7 +34,7 @@
 
     const char* cns = PerfDataManager::name_space("collector", ordinal);
 
-    _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1);
+    _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1, mtGC);
     strcpy(_name_space, cns);
 
     char* cname = PerfDataManager::counter_name(_name_space, "name");
--- a/src/share/vm/gc_implementation/shared/collectorCounters.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/collectorCounters.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -30,7 +30,7 @@
 // CollectorCounters is a holder class for performance counters
 // that track a collector
 
-class CollectorCounters: public CHeapObj {
+class CollectorCounters: public CHeapObj<mtGC> {
   friend class VMStructs;
 
   private:
@@ -50,7 +50,7 @@
     CollectorCounters(const char* name, int ordinal);
 
     ~CollectorCounters() {
-      if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space);
+      if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space, mtGC);
     }
 
     inline PerfCounter* invocation_counter() const  { return _invocations; }
--- a/src/share/vm/gc_implementation/shared/gSpaceCounters.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/gSpaceCounters.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -41,7 +41,7 @@
     const char* cns = PerfDataManager::name_space(gc->name_space(), "space",
                                                   ordinal);
 
-    _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1);
+    _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1, mtGC);
     strcpy(_name_space, cns);
 
     const char* cname = PerfDataManager::counter_name(_name_space, "name");
--- a/src/share/vm/gc_implementation/shared/gSpaceCounters.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/gSpaceCounters.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -34,7 +34,7 @@
 // A GSpaceCounter is a holder class for performance counters
 // that track a space;
 
-class GSpaceCounters: public CHeapObj {
+class GSpaceCounters: public CHeapObj<mtGC> {
   friend class VMStructs;
 
  private:
@@ -54,7 +54,7 @@
                  GenerationCounters* gc, bool sampled=true);
 
   ~GSpaceCounters() {
-    if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space);
+    if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space, mtGC);
   }
 
   inline void update_capacity() {
--- a/src/share/vm/gc_implementation/shared/gcPolicyCounters.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/gcPolicyCounters.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -30,7 +30,7 @@
 // GCPolicyCounters is a holder class for performance counters
 // that track a generation
 
-class GCPolicyCounters: public CHeapObj {
+class GCPolicyCounters: public CHeapObj<mtGC> {
   friend class VMStructs;
 
   private:
--- a/src/share/vm/gc_implementation/shared/gcStats.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/gcStats.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -27,7 +27,7 @@
 
 #include "gc_implementation/shared/gcUtil.hpp"
 
-class GCStats : public CHeapObj {
+class GCStats : public CHeapObj<mtGC> {
  protected:
   // Avg amount promoted; used for avoiding promotion undo
   // This class does not update deviations if the sample is zero.
--- a/src/share/vm/gc_implementation/shared/gcUtil.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/gcUtil.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -43,7 +43,7 @@
 //
 // This serves as our best estimate of a future unknown.
 //
-class AdaptiveWeightedAverage : public CHeapObj {
+class AdaptiveWeightedAverage : public CHeapObj<mtGC> {
  private:
   float            _average;        // The last computed average
   unsigned         _sample_count;   // How often we've sampled this average
@@ -146,7 +146,7 @@
   // Placement support
   void* operator new(size_t ignored, void* p) { return p; }
   // Allocator
-  void* operator new(size_t size) { return CHeapObj::operator new(size); }
+  void* operator new(size_t size) { return CHeapObj<mtGC>::operator new(size); }
 
   // Accessor
   float padded_average() const         { return _padded_avg; }
@@ -192,7 +192,7 @@
 // equation.
 //              y = intercept + slope * x
 
-class LinearLeastSquareFit : public CHeapObj {
+class LinearLeastSquareFit : public CHeapObj<mtGC> {
   double _sum_x;        // sum of all independent data points x
   double _sum_x_squared; // sum of all independent data points x**2
   double _sum_y;        // sum of all dependent data points y
--- a/src/share/vm/gc_implementation/shared/generationCounters.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/generationCounters.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -35,7 +35,7 @@
 
     const char* cns = PerfDataManager::name_space("generation", ordinal);
 
-    _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1);
+    _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1, mtGC);
     strcpy(_name_space, cns);
 
     const char* cname = PerfDataManager::counter_name(_name_space, "name");
--- a/src/share/vm/gc_implementation/shared/generationCounters.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/generationCounters.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -31,7 +31,7 @@
 // A GenerationCounter is a holder class for performance counters
 // that track a generation
 
-class GenerationCounters: public CHeapObj {
+class GenerationCounters: public CHeapObj<mtGC> {
   friend class VMStructs;
 
 private:
@@ -69,7 +69,7 @@
                      VirtualSpace* v);
 
   ~GenerationCounters() {
-    if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space);
+    if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space, mtGC);
   }
 
   virtual void update_all();
--- a/src/share/vm/gc_implementation/shared/hSpaceCounters.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/hSpaceCounters.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -40,7 +40,7 @@
     const char* cns =
       PerfDataManager::name_space(gc->name_space(), "space", ordinal);
 
-    _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1);
+    _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1, mtGC);
     strcpy(_name_space, cns);
 
     const char* cname = PerfDataManager::counter_name(_name_space, "name");
--- a/src/share/vm/gc_implementation/shared/hSpaceCounters.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/hSpaceCounters.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -37,7 +37,7 @@
 class HeapSpaceUsedHelper;
 class G1SpaceMonitoringSupport;
 
-class HSpaceCounters: public CHeapObj {
+class HSpaceCounters: public CHeapObj<mtGC> {
   friend class VMStructs;
 
  private:
@@ -55,7 +55,7 @@
                  size_t initial_capacity, GenerationCounters* gc);
 
   ~HSpaceCounters() {
-    if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space);
+    if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space, mtGC);
   }
 
   inline void update_capacity(size_t v) {
--- a/src/share/vm/gc_implementation/shared/immutableSpace.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/immutableSpace.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -33,7 +33,7 @@
 // Invariant: bottom() and end() are on page_size boundaries and
 // bottom() <= end()
 
-class ImmutableSpace: public CHeapObj {
+class ImmutableSpace: public CHeapObj<mtGC> {
   friend class VMStructs;
  protected:
   HeapWord* _bottom;
--- a/src/share/vm/gc_implementation/shared/markSweep.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/markSweep.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -30,13 +30,13 @@
 #include "oops/objArrayKlass.inline.hpp"
 #include "oops/oop.inline.hpp"
 
-Stack<oop>              MarkSweep::_marking_stack;
-Stack<DataLayout*>      MarkSweep::_revisit_mdo_stack;
-Stack<Klass*>           MarkSweep::_revisit_klass_stack;
-Stack<ObjArrayTask>     MarkSweep::_objarray_stack;
+Stack<oop, mtGC>              MarkSweep::_marking_stack;
+Stack<DataLayout*, mtGC>      MarkSweep::_revisit_mdo_stack;
+Stack<Klass*, mtGC>           MarkSweep::_revisit_klass_stack;
+Stack<ObjArrayTask, mtGC>     MarkSweep::_objarray_stack;
 
-Stack<oop>              MarkSweep::_preserved_oop_stack;
-Stack<markOop>          MarkSweep::_preserved_mark_stack;
+Stack<oop, mtGC>              MarkSweep::_preserved_oop_stack;
+Stack<markOop, mtGC>          MarkSweep::_preserved_mark_stack;
 size_t                  MarkSweep::_preserved_count = 0;
 size_t                  MarkSweep::_preserved_count_max = 0;
 PreservedMark*          MarkSweep::_preserved_marks = NULL;
@@ -166,7 +166,7 @@
   }
 
   // deal with the overflow stack
-  StackIterator<oop> iter(_preserved_oop_stack);
+  StackIterator<oop, mtGC> iter(_preserved_oop_stack);
   while (!iter.is_empty()) {
     oop* p = iter.next_addr();
     adjust_pointer(p);
--- a/src/share/vm/gc_implementation/shared/markSweep.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/markSweep.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -122,16 +122,16 @@
   //
  protected:
   // Traversal stacks used during phase1
-  static Stack<oop>                      _marking_stack;
-  static Stack<ObjArrayTask>             _objarray_stack;
+  static Stack<oop, mtGC>                      _marking_stack;
+  static Stack<ObjArrayTask, mtGC>             _objarray_stack;
   // Stack for live klasses to revisit at end of marking phase
-  static Stack<Klass*>                   _revisit_klass_stack;
+  static Stack<Klass*, mtGC>                   _revisit_klass_stack;
   // Set (stack) of MDO's to revisit at end of marking phase
-  static Stack<DataLayout*>              _revisit_mdo_stack;
+  static Stack<DataLayout*, mtGC>              _revisit_mdo_stack;
 
   // Space for storing/restoring mark word
-  static Stack<markOop>                  _preserved_mark_stack;
-  static Stack<oop>                      _preserved_oop_stack;
+  static Stack<markOop, mtGC>                  _preserved_mark_stack;
+  static Stack<oop, mtGC>                      _preserved_oop_stack;
   static size_t                          _preserved_count;
   static size_t                          _preserved_count_max;
   static PreservedMark*                  _preserved_marks;
--- a/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -43,7 +43,7 @@
 
 
 MutableNUMASpace::MutableNUMASpace(size_t alignment) : MutableSpace(alignment) {
-  _lgrp_spaces = new (ResourceObj::C_HEAP) GrowableArray<LGRPSpace*>(0, true);
+  _lgrp_spaces = new (ResourceObj::C_HEAP, mtGC) GrowableArray<LGRPSpace*>(0, true);
   _page_size = os::vm_page_size();
   _adaptation_cycles = 0;
   _samples_count = 0;
@@ -231,7 +231,7 @@
   if (force || changed) {
     // Compute lgrp intersection. Add/remove spaces.
     int lgrp_limit = (int)os::numa_get_groups_num();
-    int *lgrp_ids = NEW_C_HEAP_ARRAY(int, lgrp_limit);
+    int *lgrp_ids = NEW_C_HEAP_ARRAY(int, lgrp_limit, mtGC);
     int lgrp_num = (int)os::numa_get_leaf_groups(lgrp_ids, lgrp_limit);
     assert(lgrp_num > 0, "There should be at least one locality group");
     // Add new spaces for the new nodes
@@ -265,7 +265,7 @@
       }
     }
 
-    FREE_C_HEAP_ARRAY(int, lgrp_ids);
+    FREE_C_HEAP_ARRAY(int, lgrp_ids, mtGC);
 
     if (changed) {
       for (JavaThread *thread = Threads::first(); thread; thread = thread->next()) {
--- a/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -63,7 +63,7 @@
 class MutableNUMASpace : public MutableSpace {
   friend class VMStructs;
 
-  class LGRPSpace : public CHeapObj {
+  class LGRPSpace : public CHeapObj<mtGC> {
     int _lgrp_id;
     MutableSpace* _space;
     MemRegion _invalid_region;
--- a/src/share/vm/gc_implementation/shared/spaceCounters.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/spaceCounters.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -39,7 +39,7 @@
     const char* cns = PerfDataManager::name_space(gc->name_space(), "space",
                                                   ordinal);
 
-    _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1);
+    _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1, mtGC);
     strcpy(_name_space, cns);
 
     const char* cname = PerfDataManager::counter_name(_name_space, "name");
--- a/src/share/vm/gc_implementation/shared/spaceCounters.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/spaceCounters.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -35,7 +35,7 @@
 // A SpaceCounter is a holder class for performance counters
 // that track a space;
 
-class SpaceCounters: public CHeapObj {
+class SpaceCounters: public CHeapObj<mtGC> {
   friend class VMStructs;
 
  private:
@@ -55,7 +55,7 @@
                 MutableSpace* m, GenerationCounters* gc);
 
   ~SpaceCounters() {
-    if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space);
+    if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space, mtGC);
   }
 
   inline void update_capacity() {
--- a/src/share/vm/gc_implementation/shared/spaceDecorator.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_implementation/shared/spaceDecorator.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -70,7 +70,7 @@
 // These subclasses abstract the differences in the types of spaces used
 // by each heap.
 
-class SpaceMangler: public CHeapObj {
+class SpaceMangler: public CHeapObj<mtGC> {
   friend class VMStructs;
 
   // High water mark for allocations.  Typically, the space above
--- a/src/share/vm/gc_interface/collectedHeap.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/gc_interface/collectedHeap.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -74,7 +74,7 @@
 //     G1CollectedHeap
 //   ParallelScavengeHeap
 //
-class CollectedHeap : public CHeapObj {
+class CollectedHeap : public CHeapObj<mtInternal> {
   friend class VMStructs;
   friend class IsGCActiveMark; // Block structured external access to _is_gc_active
   friend class constantPoolCacheKlass; // allocate() method inserts is_conc_safe
--- a/src/share/vm/interpreter/interpreterRuntime.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/interpreter/interpreterRuntime.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -375,7 +375,6 @@
   Handle             h_exception(thread, exception);
   methodHandle       h_method   (thread, method(thread));
   constantPoolHandle h_constants(thread, h_method->constants());
-  typeArrayHandle    h_extable  (thread, h_method->exception_table());
   bool               should_repeat;
   int                handler_bci;
   int                current_bci = bci(thread);
@@ -547,23 +546,6 @@
     }
   }
 
-  if (is_put && !is_static && klass->is_subclass_of(SystemDictionary::CallSite_klass()) && (info.name() == vmSymbols::target_name())) {
-    const jint direction = frame::interpreter_frame_expression_stack_direction();
-    Handle call_site    (THREAD, *((oop*) thread->last_frame().interpreter_frame_tos_at(-1 * direction)));
-    Handle method_handle(THREAD, *((oop*) thread->last_frame().interpreter_frame_tos_at( 0 * direction)));
-    assert(call_site    ->is_a(SystemDictionary::CallSite_klass()),     "must be");
-    assert(method_handle->is_a(SystemDictionary::MethodHandle_klass()), "must be");
-
-    {
-      // Walk all nmethods depending on this call site.
-      MutexLocker mu(Compile_lock, thread);
-      Universe::flush_dependents_on(call_site, method_handle);
-    }
-
-    // Don't allow fast path for setting CallSite.target and sub-classes.
-    put_code = (Bytecodes::Code) 0;
-  }
-
   cache_entry(thread)->set_field(
     get_code,
     put_code,
@@ -1118,8 +1100,8 @@
                                       SignatureHandlerLibrary::buffer_size);
   _buffer = bb->code_begin();
 
-  _fingerprints = new(ResourceObj::C_HEAP)GrowableArray<uint64_t>(32, true);
-  _handlers     = new(ResourceObj::C_HEAP)GrowableArray<address>(32, true);
+  _fingerprints = new(ResourceObj::C_HEAP, mtCode)GrowableArray<uint64_t>(32, true);
+  _handlers     = new(ResourceObj::C_HEAP, mtCode)GrowableArray<address>(32, true);
 }
 
 address SignatureHandlerLibrary::set_handler(CodeBuffer* buffer) {
--- a/src/share/vm/interpreter/oopMapCache.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/interpreter/oopMapCache.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -348,7 +348,7 @@
   if (mask_size() > small_mask_limit) {
     assert(_bit_mask[0] == 0, "bit mask should be new or just flushed");
     _bit_mask[0] = (intptr_t)
-      NEW_C_HEAP_ARRAY(uintptr_t, mask_word_size());
+      NEW_C_HEAP_ARRAY(uintptr_t, mask_word_size(), mtClass);
   }
 }
 
@@ -356,7 +356,7 @@
   if (mask_size() > small_mask_limit && _bit_mask[0] != 0) {
     assert(!Thread::current()->resource_area()->contains((void*)_bit_mask[0]),
       "This bit mask should not be in the resource area");
-    FREE_C_HEAP_ARRAY(uintptr_t, _bit_mask[0]);
+    FREE_C_HEAP_ARRAY(uintptr_t, _bit_mask[0], mtClass);
     debug_only(_bit_mask[0] = 0;)
   }
 }
@@ -506,7 +506,7 @@
 OopMapCache::OopMapCache() :
   _mut(Mutex::leaf, "An OopMapCache lock", true)
 {
-  _array  = NEW_C_HEAP_ARRAY(OopMapCacheEntry, _size);
+  _array  = NEW_C_HEAP_ARRAY(OopMapCacheEntry, _size, mtClass);
   // Cannot call flush for initialization, since flush
   // will check if memory should be deallocated
   for(int i = 0; i < _size; i++) _array[i].initialize();
@@ -520,7 +520,7 @@
   flush();
   // Deallocate array
   NOT_PRODUCT(_total_memory_usage -= sizeof(OopMapCache) + (sizeof(OopMapCacheEntry) * _size);)
-  FREE_C_HEAP_ARRAY(OopMapCacheEntry, _array);
+  FREE_C_HEAP_ARRAY(OopMapCacheEntry, _array, mtClass);
 }
 
 OopMapCacheEntry* OopMapCache::entry_at(int i) const {
@@ -639,9 +639,9 @@
 
 void OopMapCache::compute_one_oop_map(methodHandle method, int bci, InterpreterOopMap* entry) {
   // Due to the invariants above it's tricky to allocate a temporary OopMapCacheEntry on the stack
-  OopMapCacheEntry* tmp = NEW_C_HEAP_ARRAY(OopMapCacheEntry, 1);
+  OopMapCacheEntry* tmp = NEW_C_HEAP_ARRAY(OopMapCacheEntry, 1, mtClass);
   tmp->initialize();
   tmp->fill(method, bci);
   entry->resource_copy(tmp);
-  FREE_C_HEAP_ARRAY(OopMapCacheEntry, tmp);
+  FREE_C_HEAP_ARRAY(OopMapCacheEntry, tmp, mtInternal);
 }
--- a/src/share/vm/interpreter/oopMapCache.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/interpreter/oopMapCache.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -156,7 +156,7 @@
 #endif
 };
 
-class OopMapCache : public CHeapObj {
+class OopMapCache : public CHeapObj<mtClass> {
  private:
   enum { _size        = 32,     // Use fixed size for now
          _probe_depth = 3       // probe depth in case of collisions
--- a/src/share/vm/libadt/set.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/libadt/set.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -71,7 +71,7 @@
   set.Sort();                   // Sort elements for in-order retrieval
 
   uint len = 128;               // Total string space
-  char *buf = NEW_C_HEAP_ARRAY(char,len);// Some initial string space
+  char *buf = NEW_C_HEAP_ARRAY(char,len, mtCompiler);// Some initial string space
 
   register char *s = buf;       // Current working string pointer
   *s++ = '{';
@@ -86,7 +86,7 @@
       if( buf+len-s < 25 ) {      // Generous trailing space for upcoming numbers
         int offset = (int)(s-buf);// Not enuf space; compute offset into buffer
         len <<= 1;                // Double string size
-        buf = REALLOC_C_HEAP_ARRAY(char,buf,len); // Reallocate doubled size
+        buf = REALLOC_C_HEAP_ARRAY(char,buf,len, mtCompiler); // Reallocate doubled size
         s = buf+offset;         // Get working pointer into new bigger buffer
       }
       if( lo != (uint)-2 ) {    // Startup?  No!  Then print previous range.
@@ -101,7 +101,7 @@
     if( buf+len-s < 25 ) {      // Generous trailing space for upcoming numbers
       int offset = (int)(s-buf);// Not enuf space; compute offset into buffer
       len <<= 1;                // Double string size
-      buf = (char*)ReallocateHeap(buf,len); // Reallocate doubled size
+      buf = (char*)ReallocateHeap(buf,len, mtCompiler); // Reallocate doubled size
       s = buf+offset;           // Get working pointer into new bigger buffer
     }
     if( lo != hi ) sprintf(s,"%d-%d}",lo,hi);
--- a/src/share/vm/libadt/vectset.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/libadt/vectset.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -362,7 +362,7 @@
 };
 
 SetI_ *VectorSet::iterate(uint &elem) const {
-  return new(ResourceObj::C_HEAP) VSetI_(this, elem);
+  return new(ResourceObj::C_HEAP, mtInternal) VSetI_(this, elem);
 }
 
 //=============================================================================
--- a/src/share/vm/memory/allocation.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/allocation.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -26,10 +26,13 @@
 #include "memory/allocation.hpp"
 #include "memory/allocation.inline.hpp"
 #include "memory/resourceArea.hpp"
+#include "runtime/atomic.hpp"
 #include "runtime/os.hpp"
 #include "runtime/task.hpp"
 #include "runtime/threadCritical.hpp"
+#include "services/memTracker.hpp"
 #include "utilities/ostream.hpp"
+
 #ifdef TARGET_OS_FAMILY_linux
 # include "os_linux.inline.hpp"
 #endif
@@ -43,32 +46,16 @@
 # include "os_bsd.inline.hpp"
 #endif
 
-void* CHeapObj::operator new(size_t size){
-  return (void *) AllocateHeap(size, "CHeapObj-new");
-}
-
-void* CHeapObj::operator new (size_t size, const std::nothrow_t&  nothrow_constant) {
-  char* p = (char*) os::malloc(size);
-#ifdef ASSERT
-  if (PrintMallocFree) trace_heap_malloc(size, "CHeapObj-new", p);
-#endif
-  return p;
-}
-
-void CHeapObj::operator delete(void* p){
- FreeHeap(p);
-}
-
 void* StackObj::operator new(size_t size)  { ShouldNotCallThis(); return 0; };
 void  StackObj::operator delete(void* p)   { ShouldNotCallThis(); };
 void* _ValueObj::operator new(size_t size)  { ShouldNotCallThis(); return 0; };
 void  _ValueObj::operator delete(void* p)   { ShouldNotCallThis(); };
 
-void* ResourceObj::operator new(size_t size, allocation_type type) {
+void* ResourceObj::operator new(size_t size, allocation_type type, MEMFLAGS flags) {
   address res;
   switch (type) {
    case C_HEAP:
-    res = (address)AllocateHeap(size, "C_Heap: ResourceOBJ");
+    res = (address)AllocateHeap(size, flags, CALLER_PC);
     DEBUG_ONLY(set_allocation_type(res, C_HEAP);)
     break;
    case RESOURCE_AREA:
@@ -184,7 +171,7 @@
 
 // MT-safe pool of chunks to reduce malloc/free thrashing
 // NB: not using Mutex because pools are used before Threads are initialized
-class ChunkPool {
+class ChunkPool: public CHeapObj<mtInternal> {
   Chunk*       _first;        // first cached Chunk; its first word points to next chunk
   size_t       _num_chunks;   // number of unused chunks in pool
   size_t       _num_used;     // number of chunks currently checked out
@@ -210,14 +197,16 @@
    ChunkPool(size_t size) : _size(size) { _first = NULL; _num_chunks = _num_used = 0; }
 
   // Allocate a new chunk from the pool (might expand the pool)
-  void* allocate(size_t bytes) {
+  _NOINLINE_ void* allocate(size_t bytes) {
     assert(bytes == _size, "bad size");
     void* p = NULL;
+    // No VM lock can be taken inside ThreadCritical lock, so os::malloc
+    // should be done outside ThreadCritical lock due to NMT
     { ThreadCritical tc;
       _num_used++;
       p = get_first();
-      if (p == NULL) p = os::malloc(bytes);
     }
+    if (p == NULL) p = os::malloc(bytes, mtChunk, CURRENT_PC);
     if (p == NULL)
       vm_exit_out_of_memory(bytes, "ChunkPool::allocate");
 
@@ -238,28 +227,34 @@
 
   // Prune the pool
   void free_all_but(size_t n) {
+    Chunk* cur = NULL;
+    Chunk* next;
+    {
     // if we have more than n chunks, free all of them
     ThreadCritical tc;
     if (_num_chunks > n) {
       // free chunks at end of queue, for better locality
-      Chunk* cur = _first;
+        cur = _first;
       for (size_t i = 0; i < (n - 1) && cur != NULL; i++) cur = cur->next();
 
       if (cur != NULL) {
-        Chunk* next = cur->next();
+          next = cur->next();
         cur->set_next(NULL);
         cur = next;
 
-        // Free all remaining chunks
+          _num_chunks = n;
+        }
+      }
+    }
+
+    // Free all remaining chunks, outside of ThreadCritical
+    // to avoid deadlock with NMT
         while(cur != NULL) {
           next = cur->next();
-          os::free(cur);
-          _num_chunks--;
+      os::free(cur, mtChunk);
           cur = next;
         }
       }
-    }
-  }
 
   // Accessors to preallocated pool's
   static ChunkPool* large_pool()  { assert(_large_pool  != NULL, "must be initialized"); return _large_pool;  }
@@ -323,7 +318,7 @@
    case Chunk::medium_size: return ChunkPool::medium_pool()->allocate(bytes);
    case Chunk::init_size:   return ChunkPool::small_pool()->allocate(bytes);
    default: {
-     void *p =  os::malloc(bytes);
+     void *p =  os::malloc(bytes, mtChunk, CALLER_PC);
      if (p == NULL)
        vm_exit_out_of_memory(bytes, "Chunk::new");
      return p;
@@ -337,7 +332,7 @@
    case Chunk::size:        ChunkPool::large_pool()->free(c); break;
    case Chunk::medium_size: ChunkPool::medium_pool()->free(c); break;
    case Chunk::init_size:   ChunkPool::small_pool()->free(c); break;
-   default:                 os::free(c);
+   default:                 os::free(c, mtChunk);
   }
 }
 
@@ -374,6 +369,7 @@
 }
 
 //------------------------------Arena------------------------------------------
+NOT_PRODUCT(volatile jint Arena::_instance_count = 0;)
 
 Arena::Arena(size_t init_size) {
   size_t round_size = (sizeof (char *)) - 1;
@@ -382,6 +378,7 @@
   _hwm = _chunk->bottom();      // Save the cached hwm, max
   _max = _chunk->top();
   set_size_in_bytes(init_size);
+  NOT_PRODUCT(Atomic::inc(&_instance_count);)
 }
 
 Arena::Arena() {
@@ -389,12 +386,15 @@
   _hwm = _chunk->bottom();      // Save the cached hwm, max
   _max = _chunk->top();
   set_size_in_bytes(Chunk::init_size);
+  NOT_PRODUCT(Atomic::inc(&_instance_count);)
 }
 
 Arena::Arena(Arena *a) : _chunk(a->_chunk), _hwm(a->_hwm), _max(a->_max), _first(a->_first) {
   set_size_in_bytes(a->size_in_bytes());
+  NOT_PRODUCT(Atomic::inc(&_instance_count);)
 }
 
+
 Arena *Arena::move_contents(Arena *copy) {
   copy->destruct_contents();
   copy->_chunk = _chunk;
@@ -409,6 +409,42 @@
 
 Arena::~Arena() {
   destruct_contents();
+  NOT_PRODUCT(Atomic::dec(&_instance_count);)
+}
+
+void* Arena::operator new(size_t size) {
+  assert(false, "Use dynamic memory type binding");
+  return NULL;
+}
+
+void* Arena::operator new (size_t size, const std::nothrow_t&  nothrow_constant) {
+  assert(false, "Use dynamic memory type binding");
+  return NULL;
+}
+
+  // dynamic memory type binding
+void* Arena::operator new(size_t size, MEMFLAGS flags) {
+#ifdef ASSERT
+  void* p = (void*)AllocateHeap(size, flags|otArena, CALLER_PC);
+  if (PrintMallocFree) trace_heap_malloc(size, "Arena-new", p);
+  return p;
+#else
+  return (void *) AllocateHeap(size, flags|otArena, CALLER_PC);
+#endif
+}
+
+void* Arena::operator new(size_t size, const std::nothrow_t& nothrow_constant, MEMFLAGS flags) {
+#ifdef ASSERT
+  void* p = os::malloc(size, flags|otArena, CALLER_PC);
+  if (PrintMallocFree) trace_heap_malloc(size, "Arena-new", p);
+  return p;
+#else
+  return os::malloc(size, flags|otArena, CALLER_PC);
+#endif
+}
+
+void Arena::operator delete(void* p) {
+  FreeHeap(p);
 }
 
 // Destroy this arenas contents and reset to empty
@@ -421,6 +457,14 @@
   reset();
 }
 
+// This is high traffic method, but many calls actually don't
+// change the size
+void Arena::set_size_in_bytes(size_t size) {
+  if (_size_in_bytes != size) {
+    _size_in_bytes = size;
+    MemTracker::record_arena_size((address)this, size);
+  }
+}
 
 // Total of all Chunks in arena
 size_t Arena::used() const {
@@ -448,7 +492,6 @@
   if (_chunk == NULL) {
     signal_out_of_memory(len * Chunk::aligned_overhead_size(), "Arena::grow");
   }
-
   if (k) k->set_next(_chunk);   // Append new chunk to end of linked list
   else _first = _chunk;
   _hwm  = _chunk->bottom();     // Save the cached hwm, max
@@ -538,7 +581,7 @@
   assert(UseMallocOnly, "shouldn't call");
   // use malloc, but save pointer in res. area for later freeing
   char** save = (char**)internal_malloc_4(sizeof(char*));
-  return (*save = (char*)os::malloc(size));
+  return (*save = (char*)os::malloc(size, mtChunk));
 }
 
 // for debugging with UseMallocOnly
--- a/src/share/vm/memory/allocation.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/allocation.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -40,6 +40,18 @@
 #define ARENA_ALIGN_MASK (~((size_t)ARENA_ALIGN_M1))
 #define ARENA_ALIGN(x) ((((size_t)(x)) + ARENA_ALIGN_M1) & ARENA_ALIGN_MASK)
 
+
+// noinline attribute
+#ifdef _WINDOWS
+  #define _NOINLINE_  __declspec(noinline)
+#else
+  #if __GNUC__ < 3    // gcc 2.x does not support noinline attribute
+    #define _NOINLINE_
+  #else
+    #define _NOINLINE_ __attribute__ ((noinline))
+  #endif
+#endif
+
 // All classes in the virtual machine must be subclassed
 // by one of the following allocation classes:
 //
@@ -98,12 +110,72 @@
 };
 #endif
 
-class CHeapObj ALLOCATION_SUPER_CLASS_SPEC {
+
+/*
+ * MemoryType bitmap layout:
+ * | 16 15 14 13 12 11 10 09 | 08 07 06 05 | 04 03 02 01 |
+ * |      memory type        |   object    | reserved    |
+ * |                         |     type    |             |
+ */
+enum MemoryType {
+  // Memory type by sub systems. It occupies lower byte.
+  mtNone              = 0x0000,  // undefined
+  mtClass             = 0x0100,  // memory class for Java classes
+  mtThread            = 0x0200,  // memory for thread objects
+  mtThreadStack       = 0x0300,
+  mtCode              = 0x0400,  // memory for generated code
+  mtGC                = 0x0500,  // memory for GC
+  mtCompiler          = 0x0600,  // memory for compiler
+  mtInternal          = 0x0700,  // memory used by VM, but does not belong to
+                                 // any of above categories, and not used for
+                                 // native memory tracking
+  mtOther             = 0x0800,  // memory not used by VM
+  mtSymbol            = 0x0900,  // symbol
+  mtNMT               = 0x0A00,  // memory used by native memory tracking
+  mtChunk             = 0x0B00,  // chunk that holds content of arenas
+  mtJavaHeap          = 0x0C00,  // Java heap
+  mtDontTrack         = 0x0D00,  // memory we donot or cannot track
+  mt_number_of_types  = 0x000C,  // number of memory types
+  mt_masks            = 0x7F00,
+
+  // object type mask
+  otArena             = 0x0010, // an arena object
+  otNMTRecorder       = 0x0020, // memory recorder object
+  ot_masks            = 0x00F0
+};
+
+#define IS_MEMORY_TYPE(flags, type) ((flags & mt_masks) == type)
+#define HAS_VALID_MEMORY_TYPE(flags)((flags & mt_masks) != mtNone)
+#define FLAGS_TO_MEMORY_TYPE(flags) (flags & mt_masks)
+
+#define IS_ARENA_OBJ(flags)         ((flags & ot_masks) == otArena)
+#define IS_NMT_RECORDER(flags)      ((flags & ot_masks) == otNMTRecorder)
+#define NMT_CAN_TRACK(flags)        (!IS_NMT_RECORDER(flags) && !(IS_MEMORY_TYPE(flags, mtDontTrack)))
+
+typedef unsigned short MEMFLAGS;
+
+extern bool NMT_track_callsite;
+
+// debug build does not inline
+#if defined(_DEBUG_)
+  #define CURRENT_PC       (NMT_track_callsite ? os::get_caller_pc(1) : 0)
+  #define CALLER_PC        (NMT_track_callsite ? os::get_caller_pc(2) : 0)
+  #define CALLER_CALLER_PC (NMT_track_callsite ? os::get_caller_pc(3) : 0)
+#else
+  #define CURRENT_PC      (NMT_track_callsite? os::get_caller_pc(0) : 0)
+  #define CALLER_PC       (NMT_track_callsite ? os::get_caller_pc(1) : 0)
+  #define CALLER_CALLER_PC (NMT_track_callsite ? os::get_caller_pc(2) : 0)
+#endif
+
+
+
+template <MEMFLAGS F> class CHeapObj ALLOCATION_SUPER_CLASS_SPEC {
  public:
-  void* operator new(size_t size);
-  void* operator new (size_t size, const std::nothrow_t&  nothrow_constant);
+  _NOINLINE_ void* operator new(size_t size, address caller_pc = 0);
+  _NOINLINE_ void* operator new (size_t size, const std::nothrow_t&  nothrow_constant,
+                               address caller_pc = 0);
+
   void  operator delete(void* p);
-  void* new_array(size_t size);
 };
 
 // Base class for objects allocated on the stack only.
@@ -150,7 +222,7 @@
 
 //------------------------------Chunk------------------------------------------
 // Linked list of raw memory chunks
-class Chunk: public CHeapObj {
+class Chunk: CHeapObj<mtChunk> {
   friend class VMStructs;
 
  protected:
@@ -197,7 +269,7 @@
 
 //------------------------------Arena------------------------------------------
 // Fast allocation of memory
-class Arena: public CHeapObj {
+class Arena : public CHeapObj<mtNone|otArena> {
 protected:
   friend class ResourceMark;
   friend class HandleMark;
@@ -208,7 +280,8 @@
   Chunk *_chunk;                // current chunk
   char *_hwm, *_max;            // High water mark and max in current chunk
   void* grow(size_t x);         // Get a new Chunk of at least size x
-  NOT_PRODUCT(size_t _size_in_bytes;) // Size of arena (used for memory usage tracing)
+  size_t _size_in_bytes;        // Size of arena (used for native memory tracking)
+
   NOT_PRODUCT(static julong _bytes_allocated;) // total #bytes allocated since start
   friend class AllocStats;
   debug_only(void* malloc(size_t size);)
@@ -231,6 +304,15 @@
   void  destruct_contents();
   char* hwm() const             { return _hwm; }
 
+  // new operators
+  void* operator new (size_t size);
+  void* operator new (size_t size, const std::nothrow_t& nothrow_constant);
+
+  // dynamic memory type tagging
+  void* operator new(size_t size, MEMFLAGS flags);
+  void* operator new(size_t size, const std::nothrow_t& nothrow_constant, MEMFLAGS flags);
+  void  operator delete(void* p);
+
   // Fast allocate in the arena.  Common case is: pointer test + increment.
   void* Amalloc(size_t x) {
     assert(is_power_of_2(ARENA_AMALLOC_ALIGNMENT) , "should be a power of 2");
@@ -306,16 +388,20 @@
   size_t used() const;
 
   // Total # of bytes used
-  size_t size_in_bytes() const         NOT_PRODUCT({  return _size_in_bytes; }) PRODUCT_RETURN0;
-  void set_size_in_bytes(size_t size)  NOT_PRODUCT({ _size_in_bytes = size;  }) PRODUCT_RETURN;
+  size_t size_in_bytes() const         {  return _size_in_bytes; };
+  void set_size_in_bytes(size_t size);
+
   static void free_malloced_objects(Chunk* chunk, char* hwm, char* max, char* hwm2)  PRODUCT_RETURN;
   static void free_all(char** start, char** end)                                     PRODUCT_RETURN;
 
+  // how many arena instances
+  NOT_PRODUCT(static volatile jint _instance_count;)
 private:
   // Reset this Arena to empty, access will trigger grow if necessary
   void   reset(void) {
     _first = _chunk = NULL;
     _hwm = _max = NULL;
+    set_size_in_bytes(0);
   }
 };
 
@@ -373,7 +459,7 @@
 #endif // ASSERT
 
  public:
-  void* operator new(size_t size, allocation_type type);
+  void* operator new(size_t size, allocation_type type, MEMFLAGS flags);
   void* operator new(size_t size, Arena *arena) {
       address res = (address)arena->Amalloc(size);
       DEBUG_ONLY(set_allocation_type(res, ARENA);)
@@ -409,17 +495,28 @@
 #define NEW_RESOURCE_OBJ(type)\
   NEW_RESOURCE_ARRAY(type, 1)
 
-#define NEW_C_HEAP_ARRAY(type, size)\
-  (type*) (AllocateHeap((size) * sizeof(type), XSTR(type) " in " __FILE__))
+#define NEW_C_HEAP_ARRAY(type, size, memflags)\
+  (type*) (AllocateHeap((size) * sizeof(type), memflags))
 
-#define REALLOC_C_HEAP_ARRAY(type, old, size)\
-  (type*) (ReallocateHeap((char*)old, (size) * sizeof(type), XSTR(type) " in " __FILE__))
+#define REALLOC_C_HEAP_ARRAY(type, old, size, memflags)\
+  (type*) (ReallocateHeap((char*)old, (size) * sizeof(type), memflags))
+
+#define FREE_C_HEAP_ARRAY(type,old,memflags) \
+  FreeHeap((char*)(old), memflags)
 
-#define FREE_C_HEAP_ARRAY(type,old) \
-  FreeHeap((char*)(old))
+#define NEW_C_HEAP_OBJ(type, memflags)\
+  NEW_C_HEAP_ARRAY(type, 1, memflags)
+
+
+#define NEW_C_HEAP_ARRAY2(type, size, memflags, pc)\
+  (type*) (AllocateHeap((size) * sizeof(type), memflags, pc))
 
-#define NEW_C_HEAP_OBJ(type)\
-  NEW_C_HEAP_ARRAY(type, 1)
+#define REALLOC_C_HEAP_ARRAY2(type, old, size, memflags, pc)\
+  (type*) (ReallocateHeap((char*)old, (size) * sizeof(type), memflags, pc))
+
+#define NEW_C_HEAP_OBJ2(type, memflags, pc)\
+  NEW_C_HEAP_ARRAY2(type, 1, memflags, pc)
+
 
 extern bool warn_new_operator;
 
--- a/src/share/vm/memory/allocation.inline.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/allocation.inline.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -48,33 +48,60 @@
 #endif
 
 // allocate using malloc; will fail if no memory available
-inline char* AllocateHeap(size_t size, const char* name = NULL) {
-  char* p = (char*) os::malloc(size);
+inline char* AllocateHeap(size_t size, MEMFLAGS flags, address pc = 0) {
+  if (pc == 0) {
+    pc = CURRENT_PC;
+  }
+  char* p = (char*) os::malloc(size, flags, pc);
   #ifdef ASSERT
-  if (PrintMallocFree) trace_heap_malloc(size, name, p);
-  #else
-  Unused_Variable(name);
+  if (PrintMallocFree) trace_heap_malloc(size, "AllocateHeap", p);
   #endif
-  if (p == NULL) vm_exit_out_of_memory(size, name);
+  if (p == NULL) vm_exit_out_of_memory(size, "AllocateHeap");
+  return p;
+}
+
+inline char* ReallocateHeap(char *old, size_t size, MEMFLAGS flags) {
+  char* p = (char*) os::realloc(old, size, flags, CURRENT_PC);
+  #ifdef ASSERT
+  if (PrintMallocFree) trace_heap_malloc(size, "ReallocateHeap", p);
+  #endif
+  if (p == NULL) vm_exit_out_of_memory(size, "ReallocateHeap");
   return p;
 }
 
-inline char* ReallocateHeap(char *old, size_t size, const char* name = NULL) {
-  char* p = (char*) os::realloc(old,size);
-  #ifdef ASSERT
-  if (PrintMallocFree) trace_heap_malloc(size, name, p);
-  #else
-  Unused_Variable(name);
-  #endif
-  if (p == NULL) vm_exit_out_of_memory(size, name);
-  return p;
-}
-
-inline void FreeHeap(void* p) {
+inline void FreeHeap(void* p, MEMFLAGS memflags = mtInternal) {
   #ifdef ASSERT
   if (PrintMallocFree) trace_heap_free(p);
   #endif
-  os::free(p);
+  os::free(p, memflags);
 }
 
+
+template <MEMFLAGS F> void* CHeapObj<F>::operator new(size_t size,
+      address caller_pc){
+#ifdef ASSERT
+    void* p = (void*)AllocateHeap(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC));
+    if (PrintMallocFree) trace_heap_malloc(size, "CHeapObj-new", p);
+    return p;
+#else
+    return (void *) AllocateHeap(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC));
+#endif
+  }
+
+template <MEMFLAGS F> void* CHeapObj<F>::operator new (size_t size,
+  const std::nothrow_t&  nothrow_constant, address caller_pc) {
+#ifdef ASSERT
+    void* p = os::malloc(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC));
+    if (PrintMallocFree) trace_heap_malloc(size, "CHeapObj-new", p);
+    return p;
+#else
+    return os::malloc(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC));
+#endif
+}
+
+template <MEMFLAGS F> void CHeapObj<F>::operator delete(void* p){
+   FreeHeap(p, F);
+}
+
+
 #endif // SHARE_VM_MEMORY_ALLOCATION_INLINE_HPP
--- a/src/share/vm/memory/barrierSet.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/barrierSet.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -31,7 +31,7 @@
 // This class provides the interface between a barrier implementation and
 // the rest of the system.
 
-class BarrierSet: public CHeapObj {
+class BarrierSet: public CHeapObj<mtGC> {
   friend class VMStructs;
 public:
   enum Name {
--- a/src/share/vm/memory/blockOffsetTable.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/blockOffsetTable.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -30,6 +30,7 @@
 #include "memory/universe.hpp"
 #include "oops/oop.inline.hpp"
 #include "runtime/java.hpp"
+#include "services/memTracker.hpp"
 
 //////////////////////////////////////////////////////////////////////
 // BlockOffsetSharedArray
@@ -44,6 +45,9 @@
   if (!rs.is_reserved()) {
     vm_exit_during_initialization("Could not reserve enough space for heap offset array");
   }
+
+  MemTracker::record_virtual_memory_type((address)rs.base(), mtGC);
+
   if (!_vs.initialize(rs, 0)) {
     vm_exit_during_initialization("Could not reserve enough space for heap offset array");
   }
--- a/src/share/vm/memory/blockOffsetTable.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/blockOffsetTable.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -100,7 +100,7 @@
 //////////////////////////////////////////////////////////////////////////
 // BlockOffsetSharedArray
 //////////////////////////////////////////////////////////////////////////
-class BlockOffsetSharedArray: public CHeapObj {
+class BlockOffsetSharedArray: public CHeapObj<mtGC> {
   friend class BlockOffsetArray;
   friend class BlockOffsetArrayNonContigSpace;
   friend class BlockOffsetArrayContigSpace;
--- a/src/share/vm/memory/cardTableModRefBS.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/cardTableModRefBS.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -33,6 +33,7 @@
 #include "runtime/java.hpp"
 #include "runtime/mutexLocker.hpp"
 #include "runtime/virtualspace.hpp"
+#include "services/memTracker.hpp"
 #ifdef COMPILER1
 #include "c1/c1_LIR.hpp"
 #include "c1/c1_LIRGenerator.hpp"
@@ -90,6 +91,9 @@
   const size_t rs_align = _page_size == (size_t) os::vm_page_size() ? 0 :
     MAX2(_page_size, (size_t) os::vm_allocation_granularity());
   ReservedSpace heap_rs(_byte_map_size, rs_align, false);
+
+  MemTracker::record_virtual_memory_type((address)heap_rs.base(), mtGC);
+
   os::trace_page_sizes("card table", _guard_index + 1, _guard_index + 1,
                        _page_size, heap_rs.base(), heap_rs.size());
   if (!heap_rs.is_reserved()) {
@@ -113,16 +117,17 @@
     // Do better than this for Merlin
     vm_exit_out_of_memory(_page_size, "card table last card");
   }
+
   *guard_card = last_card;
 
    _lowest_non_clean =
-    NEW_C_HEAP_ARRAY(CardArr, max_covered_regions);
+    NEW_C_HEAP_ARRAY(CardArr, max_covered_regions, mtGC);
   _lowest_non_clean_chunk_size =
-    NEW_C_HEAP_ARRAY(size_t, max_covered_regions);
+    NEW_C_HEAP_ARRAY(size_t, max_covered_regions, mtGC);
   _lowest_non_clean_base_chunk_index =
-    NEW_C_HEAP_ARRAY(uintptr_t, max_covered_regions);
+    NEW_C_HEAP_ARRAY(uintptr_t, max_covered_regions, mtGC);
   _last_LNC_resizing_collection =
-    NEW_C_HEAP_ARRAY(int, max_covered_regions);
+    NEW_C_HEAP_ARRAY(int, max_covered_regions, mtGC);
   if (_lowest_non_clean == NULL
       || _lowest_non_clean_chunk_size == NULL
       || _lowest_non_clean_base_chunk_index == NULL
--- a/src/share/vm/memory/collectorPolicy.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/collectorPolicy.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -56,7 +56,7 @@
 class PermanentGenerationSpec;
 class MarkSweepPolicy;
 
-class CollectorPolicy : public CHeapObj {
+class CollectorPolicy : public CHeapObj<mtGC> {
  protected:
   PermanentGenerationSpec *_permanent_generation;
   GCPolicyCounters* _gc_policy_counters;
--- a/src/share/vm/memory/defNewGeneration.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/defNewGeneration.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -89,8 +89,8 @@
 
   // Together, these keep <object with a preserved mark, mark value> pairs.
   // They should always contain the same number of elements.
-  Stack<oop>     _objs_with_preserved_marks;
-  Stack<markOop> _preserved_marks_of_objs;
+  Stack<oop, mtGC>     _objs_with_preserved_marks;
+  Stack<markOop, mtGC> _preserved_marks_of_objs;
 
   // Promotion failure handling
   OopClosure *_promo_failure_scan_stack_closure;
@@ -98,7 +98,7 @@
     _promo_failure_scan_stack_closure = scan_stack_closure;
   }
 
-  Stack<oop> _promo_failure_scan_stack;
+  Stack<oop, mtGC> _promo_failure_scan_stack;
   void drain_promo_failure_scan_stack(void);
   bool _promo_failure_drain_in_progress;
 
--- a/src/share/vm/memory/dump.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/dump.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -62,8 +62,8 @@
 // written later, increasing the likelihood that the shared page contain
 // the hash can be shared.
 //
-// NOTE THAT the algorithm in StringTable::hash_string() MUST MATCH the
-// algorithm in java.lang.String.hashCode().
+// NOTE THAT we have to call java_lang_String::to_hash() to match the
+// algorithm in java.lang.String.toHash().
 
 class StringHashCodeClosure: public OopClosure {
 private:
@@ -80,7 +80,7 @@
       oop obj = *p;
       if (obj->klass() == SystemDictionary::String_klass() &&
           java_lang_String::has_hash_field()) {
-        int hash = java_lang_String::hash_string(obj);
+        int hash = java_lang_String::to_hash(obj);
         obj->int_field_put(hash_offset, hash);
       }
     }
@@ -231,8 +231,6 @@
     if (obj->is_constMethod()) {
       mark_object(obj);
       mark_object(constMethodOop(obj)->stackmap_data());
-      // Exception tables are needed by ci code during compilation.
-      mark_object(constMethodOop(obj)->exception_table());
     }
 
     // Mark objects referenced by klass objects which are read-only.
@@ -513,7 +511,6 @@
       for(i = 0; i < methods->length(); i++) {
         methodOop m = methodOop(methods->obj_at(i));
         mark_and_move_for_policy(OP_favor_startup, m->constMethod(), _move_ro);
-        mark_and_move_for_policy(OP_favor_runtime, m->constMethod()->exception_table(), _move_ro);
         mark_and_move_for_policy(OP_favor_runtime, m->constMethod()->stackmap_data(), _move_ro);
       }
 
--- a/src/share/vm/memory/filemap.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/filemap.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -44,7 +44,7 @@
 
 
 
-class FileMapInfo : public CHeapObj {
+class FileMapInfo : public CHeapObj<mtInternal> {
 private:
   enum {
     _invalid_version = -1,
--- a/src/share/vm/memory/freeBlockDictionary.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/freeBlockDictionary.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -34,7 +34,7 @@
 // A FreeBlockDictionary is an abstract superclass that will allow
 // a number of alternative implementations in the future.
 template <class Chunk>
-class FreeBlockDictionary: public CHeapObj {
+class FreeBlockDictionary: public CHeapObj<mtGC> {
  public:
   enum Dither {
     atLeast,
--- a/src/share/vm/memory/genMarkSweep.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/genMarkSweep.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -203,21 +203,21 @@
 
 #ifdef VALIDATE_MARK_SWEEP
   if (ValidateMarkSweep) {
-    _root_refs_stack    = new (ResourceObj::C_HEAP) GrowableArray<void*>(100, true);
-    _other_refs_stack   = new (ResourceObj::C_HEAP) GrowableArray<void*>(100, true);
-    _adjusted_pointers  = new (ResourceObj::C_HEAP) GrowableArray<void*>(100, true);
-    _live_oops          = new (ResourceObj::C_HEAP) GrowableArray<oop>(100, true);
-    _live_oops_moved_to = new (ResourceObj::C_HEAP) GrowableArray<oop>(100, true);
-    _live_oops_size     = new (ResourceObj::C_HEAP) GrowableArray<size_t>(100, true);
+    _root_refs_stack    = new (ResourceObj::C_HEAP, mtGC) GrowableArray<void*>(100, true);
+    _other_refs_stack   = new (ResourceObj::C_HEAP, mtGC) GrowableArray<void*>(100, true);
+    _adjusted_pointers  = new (ResourceObj::C_HEAP, mtGC) GrowableArray<void*>(100, true);
+    _live_oops          = new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(100, true);
+    _live_oops_moved_to = new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(100, true);
+    _live_oops_size     = new (ResourceObj::C_HEAP, mtGC) GrowableArray<size_t>(100, true);
   }
   if (RecordMarkSweepCompaction) {
     if (_cur_gc_live_oops == NULL) {
-      _cur_gc_live_oops           = new(ResourceObj::C_HEAP) GrowableArray<HeapWord*>(100, true);
-      _cur_gc_live_oops_moved_to  = new(ResourceObj::C_HEAP) GrowableArray<HeapWord*>(100, true);
-      _cur_gc_live_oops_size      = new(ResourceObj::C_HEAP) GrowableArray<size_t>(100, true);
-      _last_gc_live_oops          = new(ResourceObj::C_HEAP) GrowableArray<HeapWord*>(100, true);
-      _last_gc_live_oops_moved_to = new(ResourceObj::C_HEAP) GrowableArray<HeapWord*>(100, true);
-      _last_gc_live_oops_size     = new(ResourceObj::C_HEAP) GrowableArray<size_t>(100, true);
+      _cur_gc_live_oops           = new(ResourceObj::C_HEAP, mtGC) GrowableArray<HeapWord*>(100, true);
+      _cur_gc_live_oops_moved_to  = new(ResourceObj::C_HEAP, mtGC) GrowableArray<HeapWord*>(100, true);
+      _cur_gc_live_oops_size      = new(ResourceObj::C_HEAP, mtGC) GrowableArray<size_t>(100, true);
+      _last_gc_live_oops          = new(ResourceObj::C_HEAP, mtGC) GrowableArray<HeapWord*>(100, true);
+      _last_gc_live_oops_moved_to = new(ResourceObj::C_HEAP, mtGC) GrowableArray<HeapWord*>(100, true);
+      _last_gc_live_oops_size     = new(ResourceObj::C_HEAP, mtGC) GrowableArray<size_t>(100, true);
     } else {
       _cur_gc_live_oops->clear();
       _cur_gc_live_oops_moved_to->clear();
--- a/src/share/vm/memory/genOopClosures.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/genOopClosures.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -34,10 +34,10 @@
 class CardTableModRefBS;
 class DefNewGeneration;
 
-template<class E, unsigned int N> class GenericTaskQueue;
-typedef GenericTaskQueue<oop, TASKQUEUE_SIZE> OopTaskQueue;
-template<class T> class GenericTaskQueueSet;
-typedef GenericTaskQueueSet<OopTaskQueue> OopTaskQueueSet;
+template<class E, MEMFLAGS F, unsigned int N> class GenericTaskQueue;
+typedef GenericTaskQueue<oop, mtGC, TASKQUEUE_SIZE> OopTaskQueue;
+template<class T, MEMFLAGS F> class GenericTaskQueueSet;
+typedef GenericTaskQueueSet<OopTaskQueue, mtGC> OopTaskQueueSet;
 
 // Closure for iterating roots from a particular generation
 // Note: all classes deriving from this MUST call this do_barrier
--- a/src/share/vm/memory/genRemSet.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/genRemSet.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -35,7 +35,7 @@
 class OopsInGenClosure;
 class CardTableRS;
 
-class GenRemSet: public CHeapObj {
+class GenRemSet: public CHeapObj<mtGC> {
   friend class Generation;
 
   BarrierSet* _bs;
--- a/src/share/vm/memory/generation.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/generation.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -86,7 +86,7 @@
 };
 
 
-class Generation: public CHeapObj {
+class Generation: public CHeapObj<mtGC> {
   friend class VMStructs;
  private:
   jlong _time_of_last_gc; // time when last gc on this generation happened (ms)
--- a/src/share/vm/memory/generationSpec.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/generationSpec.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -32,7 +32,7 @@
 // some generation-specific behavior.  This is done here rather than as a
 // virtual function of Generation because these methods are needed in
 // initialization of the Generations.
-class GenerationSpec : public CHeapObj {
+class GenerationSpec : public CHeapObj<mtGC> {
   friend class VMStructs;
 private:
   Generation::Name _name;
@@ -71,7 +71,7 @@
 // The specification of a permanent generation. This class is very
 // similar to GenerationSpec in use. Due to PermGen's not being a
 // true Generation, we cannot combine the spec classes either.
-class PermanentGenerationSpec : public CHeapObj {
+class PermanentGenerationSpec : public CHeapObj<mtGC> {
   friend class VMStructs;
 private:
   PermGen::Name    _name;
--- a/src/share/vm/memory/heap.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/heap.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -26,7 +26,7 @@
 #include "memory/heap.hpp"
 #include "oops/oop.inline.hpp"
 #include "runtime/os.hpp"
-
+#include "services/memTracker.hpp"
 
 size_t CodeHeap::header_size() {
   return sizeof(HeapBlock);
@@ -130,6 +130,9 @@
   if (!_segmap.initialize(align_to_page_size(_number_of_reserved_segments), align_to_page_size(_number_of_committed_segments))) {
     return false;
   }
+
+  MemTracker::record_virtual_memory_type((address)_segmap.low_boundary(), mtCode);
+
   assert(_segmap.committed_size() >= (size_t) _number_of_committed_segments, "could not commit  enough space for segment map");
   assert(_segmap.reserved_size()  >= (size_t) _number_of_reserved_segments , "could not reserve enough space for segment map");
   assert(_segmap.reserved_size()  >= _segmap.committed_size()     , "just checking");
--- a/src/share/vm/memory/heap.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/heap.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -77,7 +77,7 @@
   void set_link(FreeBlock* link)             { _link = link; }
 };
 
-class CodeHeap : public CHeapObj {
+class CodeHeap : public CHeapObj<mtCode> {
   friend class VMStructs;
  private:
   VirtualSpace _memory;                          // the memory holding the blocks
--- a/src/share/vm/memory/heapInspection.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/heapInspection.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -116,7 +116,7 @@
 KlassInfoTable::KlassInfoTable(int size, HeapWord* ref) {
   _size = 0;
   _ref = ref;
-  _buckets = NEW_C_HEAP_ARRAY(KlassInfoBucket, size);
+  _buckets = NEW_C_HEAP_ARRAY(KlassInfoBucket, size, mtInternal);
   if (_buckets != NULL) {
     _size = size;
     for (int index = 0; index < _size; index++) {
@@ -130,7 +130,7 @@
     for (int index = 0; index < _size; index++) {
       _buckets[index].empty();
     }
-    FREE_C_HEAP_ARRAY(KlassInfoBucket, _buckets);
+    FREE_C_HEAP_ARRAY(KlassInfoBucket, _buckets, mtInternal);
     _size = 0;
   }
 }
@@ -179,7 +179,7 @@
 
 KlassInfoHisto::KlassInfoHisto(const char* title, int estimatedCount) :
   _title(title) {
-  _elements = new (ResourceObj::C_HEAP) GrowableArray<KlassInfoEntry*>(estimatedCount,true);
+  _elements = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<KlassInfoEntry*>(estimatedCount,true);
 }
 
 KlassInfoHisto::~KlassInfoHisto() {
--- a/src/share/vm/memory/heapInspection.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/heapInspection.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -44,7 +44,7 @@
 // to KlassInfoEntry's and is used to sort
 // the entries.
 
-class KlassInfoEntry: public CHeapObj {
+class KlassInfoEntry: public CHeapObj<mtInternal> {
  private:
   KlassInfoEntry* _next;
   klassOop        _klass;
@@ -72,7 +72,7 @@
   virtual void do_cinfo(KlassInfoEntry* cie) = 0;
 };
 
-class KlassInfoBucket: public CHeapObj {
+class KlassInfoBucket: public CHeapObj<mtInternal> {
  private:
   KlassInfoEntry* _list;
   KlassInfoEntry* list()           { return _list; }
--- a/src/share/vm/memory/memRegion.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/memRegion.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -99,8 +99,8 @@
 
 class MemRegionClosureRO: public MemRegionClosure {
 public:
-  void* operator new(size_t size, ResourceObj::allocation_type type) {
-        return ResourceObj::operator new(size, type);
+  void* operator new(size_t size, ResourceObj::allocation_type type, MEMFLAGS flags) {
+        return ResourceObj::operator new(size, type, flags);
   }
   void* operator new(size_t size, Arena *arena) {
         return ResourceObj::operator new(size, arena);
--- a/src/share/vm/memory/oopFactory.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/oopFactory.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -140,14 +140,15 @@
 constMethodOop oopFactory::new_constMethod(int byte_code_size,
                                            int compressed_line_number_size,
                                            int localvariable_table_length,
+                                           int exception_table_length,
                                            int checked_exceptions_length,
                                            bool is_conc_safe,
                                            TRAPS) {
   klassOop cmkObj = Universe::constMethodKlassObj();
   constMethodKlass* cmk = constMethodKlass::cast(cmkObj);
   return cmk->allocate(byte_code_size, compressed_line_number_size,
-                       localvariable_table_length, checked_exceptions_length,
-                       is_conc_safe,
+                       localvariable_table_length, exception_table_length,
+                       checked_exceptions_length, is_conc_safe,
                        CHECK_NULL);
 }
 
@@ -155,6 +156,7 @@
 methodOop oopFactory::new_method(int byte_code_size, AccessFlags access_flags,
                                  int compressed_line_number_size,
                                  int localvariable_table_length,
+                                 int exception_table_length,
                                  int checked_exceptions_length,
                                  bool is_conc_safe,
                                  TRAPS) {
@@ -164,6 +166,7 @@
   constMethodOop cm = new_constMethod(byte_code_size,
                                       compressed_line_number_size,
                                       localvariable_table_length,
+                                      exception_table_length,
                                       checked_exceptions_length,
                                       is_conc_safe, CHECK_NULL);
   constMethodHandle rw(THREAD, cm);
--- a/src/share/vm/memory/oopFactory.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/oopFactory.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -86,6 +86,7 @@
   static constMethodOop  new_constMethod(int byte_code_size,
                                          int compressed_line_number_size,
                                          int localvariable_table_length,
+                                         int exception_table_length,
                                          int checked_exceptions_length,
                                          bool is_conc_safe,
                                          TRAPS);
@@ -97,6 +98,7 @@
                                     AccessFlags access_flags,
                                     int compressed_line_number_size,
                                     int localvariable_table_length,
+                                    int exception_table_length,
                                     int checked_exceptions_length,
                                     bool is_conc_safe,
                                     TRAPS);
--- a/src/share/vm/memory/permGen.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/permGen.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -42,7 +42,7 @@
 
 // PermGen models the part of the heap used to allocate class meta-data.
 
-class PermGen : public CHeapObj {
+class PermGen : public CHeapObj<mtGC> {
   friend class VMStructs;
  protected:
   size_t _capacity_expansion_limit;  // maximum expansion allowed without a
--- a/src/share/vm/memory/referencePolicy.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/referencePolicy.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -29,7 +29,7 @@
 // should be cleared.
 
 
-class ReferencePolicy : public CHeapObj {
+class ReferencePolicy : public CHeapObj<mtGC> {
  public:
   virtual bool should_clear_reference(oop p, jlong timestamp_clock) {
     ShouldNotReachHere();
--- a/src/share/vm/memory/referenceProcessor.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/referenceProcessor.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -108,7 +108,8 @@
   _num_q               = MAX2(1U, mt_processing_degree);
   _max_num_q           = MAX2(_num_q, mt_discovery_degree);
   _discovered_refs     = NEW_C_HEAP_ARRAY(DiscoveredList,
-                                          _max_num_q * number_of_subclasses_of_ref());
+            _max_num_q * number_of_subclasses_of_ref(), mtGC);
+
   if (_discovered_refs == NULL) {
     vm_exit_during_initialization("Could not allocated RefProc Array");
   }
--- a/src/share/vm/memory/referenceProcessor.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/referenceProcessor.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -203,7 +203,7 @@
   }
 };
 
-class ReferenceProcessor : public CHeapObj {
+class ReferenceProcessor : public CHeapObj<mtGC> {
  protected:
   // Compatibility with pre-4965777 JDK's
   static bool _pending_list_uses_discovered_field;
--- a/src/share/vm/memory/resourceArea.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/resourceArea.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -75,7 +75,7 @@
     if (UseMallocOnly) {
       // use malloc, but save pointer in res. area for later freeing
       char** save = (char**)internal_malloc_4(sizeof(char*));
-      return (*save = (char*)os::malloc(size));
+      return (*save = (char*)os::malloc(size, mtThread));
     }
 #endif
     return (char*)Amalloc(size);
@@ -93,18 +93,17 @@
   ResourceArea *_area;          // Resource area to stack allocate
   Chunk *_chunk;                // saved arena chunk
   char *_hwm, *_max;
-  NOT_PRODUCT(size_t _size_in_bytes;)
+  size_t _size_in_bytes;
 
   void initialize(Thread *thread) {
     _area = thread->resource_area();
     _chunk = _area->_chunk;
     _hwm = _area->_hwm;
     _max= _area->_max;
-    NOT_PRODUCT(_size_in_bytes = _area->size_in_bytes();)
+    _size_in_bytes = _area->size_in_bytes();
     debug_only(_area->_nesting++;)
     assert( _area->_nesting > 0, "must stack allocate RMs" );
   }
-
  public:
 
 #ifndef ASSERT
@@ -120,7 +119,7 @@
 
   ResourceMark( ResourceArea *r ) :
     _area(r), _chunk(r->_chunk), _hwm(r->_hwm), _max(r->_max) {
-    NOT_PRODUCT(_size_in_bytes = _area->size_in_bytes();)
+    _size_in_bytes = r->_size_in_bytes;
     debug_only(_area->_nesting++;)
     assert( _area->_nesting > 0, "must stack allocate RMs" );
   }
@@ -148,7 +147,7 @@
 
  private:
   void free_malloced_objects()                                         PRODUCT_RETURN;
-  size_t size_in_bytes()       NOT_PRODUCT({ return _size_in_bytes; }) PRODUCT_RETURN0;
+  size_t size_in_bytes() { return _size_in_bytes; }
 };
 
 //------------------------------DeoptResourceMark-----------------------------------
@@ -180,19 +179,19 @@
 // and they would be stack allocated. This leaves open the possibilty of accidental
 // misuse so we simple duplicate the ResourceMark functionality here.
 
-class DeoptResourceMark: public CHeapObj {
+class DeoptResourceMark: public CHeapObj<mtInternal> {
 protected:
   ResourceArea *_area;          // Resource area to stack allocate
   Chunk *_chunk;                // saved arena chunk
   char *_hwm, *_max;
-  NOT_PRODUCT(size_t _size_in_bytes;)
+  size_t _size_in_bytes;
 
   void initialize(Thread *thread) {
     _area = thread->resource_area();
     _chunk = _area->_chunk;
     _hwm = _area->_hwm;
     _max= _area->_max;
-    NOT_PRODUCT(_size_in_bytes = _area->size_in_bytes();)
+    _size_in_bytes = _area->size_in_bytes();
     debug_only(_area->_nesting++;)
     assert( _area->_nesting > 0, "must stack allocate RMs" );
   }
@@ -212,7 +211,7 @@
 
   DeoptResourceMark( ResourceArea *r ) :
     _area(r), _chunk(r->_chunk), _hwm(r->_hwm), _max(r->_max) {
-    NOT_PRODUCT(_size_in_bytes = _area->size_in_bytes();)
+    _size_in_bytes = _area->size_in_bytes();
     debug_only(_area->_nesting++;)
     assert( _area->_nesting > 0, "must stack allocate RMs" );
   }
@@ -240,7 +239,7 @@
 
  private:
   void free_malloced_objects()                                         PRODUCT_RETURN;
-  size_t size_in_bytes()       NOT_PRODUCT({ return _size_in_bytes; }) PRODUCT_RETURN0;
+  size_t size_in_bytes() { return _size_in_bytes; };
 };
 
 #endif // SHARE_VM_MEMORY_RESOURCEAREA_HPP
--- a/src/share/vm/memory/restore.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/restore.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -132,7 +132,7 @@
   buffer += sizeof(intptr_t);
   int number_of_entries = *(intptr_t*)buffer;
   buffer += sizeof(intptr_t);
-  SymbolTable::create_table((HashtableBucket*)buffer, symbolTableLen,
+  SymbolTable::create_table((HashtableBucket<mtSymbol>*)buffer, symbolTableLen,
                             number_of_entries);
   buffer += symbolTableLen;
 
@@ -144,7 +144,7 @@
   buffer += sizeof(intptr_t);
   number_of_entries = *(intptr_t*)buffer;
   buffer += sizeof(intptr_t);
-  StringTable::create_table((HashtableBucket*)buffer, stringTableLen,
+  StringTable::create_table((HashtableBucket<mtSymbol>*)buffer, stringTableLen,
                             number_of_entries);
   buffer += stringTableLen;
 
@@ -157,7 +157,7 @@
   buffer += sizeof(intptr_t);
   number_of_entries = *(intptr_t*)buffer;
   buffer += sizeof(intptr_t);
-  SystemDictionary::set_shared_dictionary((HashtableBucket*)buffer,
+  SystemDictionary::set_shared_dictionary((HashtableBucket<mtClass>*)buffer,
                                           sharedDictionaryLen,
                                           number_of_entries);
   buffer += sharedDictionaryLen;
@@ -171,7 +171,7 @@
   buffer += sizeof(intptr_t);
   number_of_entries = *(intptr_t*)buffer;
   buffer += sizeof(intptr_t);
-  ClassLoader::create_package_info_table((HashtableBucket*)buffer, pkgInfoLen,
+  ClassLoader::create_package_info_table((HashtableBucket<mtClass>*)buffer, pkgInfoLen,
                                          number_of_entries);
   buffer += pkgInfoLen;
   ClassLoader::verify();
--- a/src/share/vm/memory/space.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/space.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -105,7 +105,7 @@
 // bottom() <= top() <= end()
 // top() is inclusive and end() is exclusive.
 
-class Space: public CHeapObj {
+class Space: public CHeapObj<mtGC> {
   friend class VMStructs;
  protected:
   HeapWord* _bottom;
--- a/src/share/vm/memory/tenuredGeneration.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/tenuredGeneration.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -65,7 +65,7 @@
   if (UseParNewGC && ParallelGCThreads > 0) {
     typedef ParGCAllocBufferWithBOT* ParGCAllocBufferWithBOTPtr;
     _alloc_buffers = NEW_C_HEAP_ARRAY(ParGCAllocBufferWithBOTPtr,
-                                      ParallelGCThreads);
+                                      ParallelGCThreads, mtGC);
     if (_alloc_buffers == NULL)
       vm_exit_during_initialization("Could not allocate alloc_buffers");
     for (uint i = 0; i < ParallelGCThreads; i++) {
--- a/src/share/vm/memory/threadLocalAllocBuffer.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/threadLocalAllocBuffer.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -36,7 +36,7 @@
 //            It is thread-private at any time, but maybe multiplexed over
 //            time across multiple threads. The park()/unpark() pair is
 //            used to make it avaiable for such multiplexing.
-class ThreadLocalAllocBuffer: public CHeapObj {
+class ThreadLocalAllocBuffer: public CHeapObj<mtThread> {
   friend class VMStructs;
 private:
   HeapWord* _start;                              // address of TLAB
@@ -172,7 +172,7 @@
   void verify();
 };
 
-class GlobalTLABStats: public CHeapObj {
+class GlobalTLABStats: public CHeapObj<mtThread> {
 private:
 
   // Accumulate perfdata in private variables because
--- a/src/share/vm/memory/universe.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/universe.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -764,7 +764,7 @@
 
   FileMapInfo* mapinfo = NULL;
   if (UseSharedSpaces) {
-    mapinfo = NEW_C_HEAP_OBJ(FileMapInfo);
+    mapinfo = NEW_C_HEAP_OBJ(FileMapInfo, mtInternal);
     memset(mapinfo, 0, sizeof(FileMapInfo));
 
     // Open the shared archive file, read and validate the header. If
@@ -1546,7 +1546,7 @@
     // This is the first previous version so make some space.
     // Start with 2 elements under the assumption that the class
     // won't be redefined much.
-    _prev_methods = new (ResourceObj::C_HEAP) GrowableArray<jweak>(2, true);
+    _prev_methods = new (ResourceObj::C_HEAP, mtClass) GrowableArray<jweak>(2, true);
   }
 
   // RC_TRACE macro has an embedded ResourceMark
--- a/src/share/vm/memory/universe.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/memory/universe.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -43,7 +43,7 @@
 // Common parts of a methodOop cache. This cache safely interacts with
 // the RedefineClasses API.
 //
-class CommonMethodOopCache : public CHeapObj {
+class CommonMethodOopCache : public CHeapObj<mtClass> {
   // We save the klassOop and the idnum of methodOop in order to get
   // the current cached methodOop.
  private:
@@ -273,7 +273,7 @@
   }
 
   static klassOop typeArrayKlassObj(BasicType t) {
-    assert((uint)t < T_VOID+1, "range check");
+    assert((uint)t < T_VOID+1, err_msg("range check for type: %s", type2name(t)));
     assert(_typeArrayKlassObjs[t] != NULL, "domain check");
     return _typeArrayKlassObjs[t];
   }
@@ -455,7 +455,7 @@
   static int base_vtable_size()               { return _base_vtable_size; }
 };
 
-class DeferredObjAllocEvent : public CHeapObj {
+class DeferredObjAllocEvent : public CHeapObj<mtInternal> {
   private:
     oop    _oop;
     size_t _bytesize;
--- a/src/share/vm/oops/constMethodKlass.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/oops/constMethodKlass.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -65,6 +65,7 @@
 constMethodOop constMethodKlass::allocate(int byte_code_size,
                                           int compressed_line_number_size,
                                           int localvariable_table_length,
+                                          int exception_table_length,
                                           int checked_exceptions_length,
                                           bool is_conc_safe,
                                           TRAPS) {
@@ -72,6 +73,7 @@
   int size = constMethodOopDesc::object_size(byte_code_size,
                                              compressed_line_number_size,
                                              localvariable_table_length,
+                                             exception_table_length,
                                              checked_exceptions_length);
   KlassHandle h_k(THREAD, as_klassOop());
   constMethodOop cm = (constMethodOop)
@@ -82,12 +84,12 @@
   cm->init_fingerprint();
   cm->set_constants(NULL);
   cm->set_stackmap_data(NULL);
-  cm->set_exception_table(NULL);
   cm->set_code_size(byte_code_size);
   cm->set_constMethod_size(size);
   cm->set_inlined_tables_length(checked_exceptions_length,
                                 compressed_line_number_size,
-                                localvariable_table_length);
+                                localvariable_table_length,
+                                exception_table_length);
   assert(cm->size() == size, "wrong size for object");
   cm->set_is_conc_safe(is_conc_safe);
   cm->set_partially_loaded();
@@ -100,7 +102,6 @@
   constMethodOop cm = constMethodOop(obj);
   MarkSweep::mark_and_push(cm->adr_constants());
   MarkSweep::mark_and_push(cm->adr_stackmap_data());
-  MarkSweep::mark_and_push(cm->adr_exception_table());
   // Performance tweak: We skip iterating over the klass pointer since we
   // know that Universe::constMethodKlassObj never moves.
 }
@@ -112,7 +113,6 @@
   constMethodOop cm_oop = constMethodOop(obj);
   PSParallelCompact::mark_and_push(cm, cm_oop->adr_constants());
   PSParallelCompact::mark_and_push(cm, cm_oop->adr_stackmap_data());
-  PSParallelCompact::mark_and_push(cm, cm_oop->adr_exception_table());
   // Performance tweak: We skip iterating over the klass pointer since we
   // know that Universe::constMethodKlassObj never moves.
 }
@@ -123,7 +123,6 @@
   constMethodOop cm = constMethodOop(obj);
   blk->do_oop(cm->adr_constants());
   blk->do_oop(cm->adr_stackmap_data());
-  blk->do_oop(cm->adr_exception_table());
   // Get size before changing pointers.
   // Don't call size() or oop_size() since that is a virtual call.
   int size = cm->object_size();
@@ -139,8 +138,6 @@
   if (mr.contains(adr)) blk->do_oop(adr);
   adr = cm->adr_stackmap_data();
   if (mr.contains(adr)) blk->do_oop(adr);
-  adr = cm->adr_exception_table();
-  if (mr.contains(adr)) blk->do_oop(adr);
   // Get size before changing pointers.
   // Don't call size() or oop_size() since that is a virtual call.
   int size = cm->object_size();
@@ -155,7 +152,6 @@
   constMethodOop cm = constMethodOop(obj);
   MarkSweep::adjust_pointer(cm->adr_constants());
   MarkSweep::adjust_pointer(cm->adr_stackmap_data());
-  MarkSweep::adjust_pointer(cm->adr_exception_table());
   // Get size before changing pointers.
   // Don't call size() or oop_size() since that is a virtual call.
   int size = cm->object_size();
@@ -190,7 +186,6 @@
   constMethodOop m = constMethodOop(obj);
   st->print(" - constants:       " INTPTR_FORMAT " ", (address)m->constants());
   m->constants()->print_value_on(st); st->cr();
-  st->print(" - exceptions:   " INTPTR_FORMAT "\n", (address)m->exception_table());
   if (m->has_stackmap_table()) {
     st->print(" - stackmap data:       ");
     m->stackmap_data()->print_value_on(st);
@@ -228,8 +223,6 @@
     typeArrayOop stackmap_data = m->stackmap_data();
     guarantee(stackmap_data == NULL ||
               stackmap_data->is_perm(),  "should be in permspace");
-    guarantee(m->exception_table()->is_perm(), "should be in permspace");
-    guarantee(m->exception_table()->is_typeArray(), "should be type array");
 
     address m_end = (address)((oop*) m + m->size());
     address compressed_table_start = m->code_end();
@@ -244,11 +237,15 @@
       compressed_table_end += stream.position();
     }
     guarantee(compressed_table_end <= m_end, "invalid method layout");
-    // Verify checked exceptions and local variable tables
+    // Verify checked exceptions, exception table and local variable tables
     if (m->has_checked_exceptions()) {
       u2* addr = m->checked_exceptions_length_addr();
       guarantee(*addr > 0 && (address) addr >= compressed_table_end && (address) addr < m_end, "invalid method layout");
     }
+    if (m->has_exception_handler()) {
+      u2* addr = m->exception_table_length_addr();
+      guarantee(*addr > 0 && (address) addr >= compressed_table_end && (address) addr < m_end, "invalid method layout");
+    }
     if (m->has_localvariable_table()) {
       u2* addr = m->localvariable_table_length_addr();
       guarantee(*addr > 0 && (address) addr >= compressed_table_end && (address) addr < m_end, "invalid method layout");
@@ -257,12 +254,12 @@
     u2* uncompressed_table_start;
     if (m->has_localvariable_table()) {
       uncompressed_table_start = (u2*) m->localvariable_table_start();
-    } else {
-      if (m->has_checked_exceptions()) {
+    } else if (m->has_exception_handler()) {
+      uncompressed_table_start = (u2*) m->exception_table_start();
+    } else if (m->has_checked_exceptions()) {
         uncompressed_table_start = (u2*) m->checked_exceptions_start();
-      } else {
+    } else {
         uncompressed_table_start = (u2*) m_end;
-      }
     }
     int gap = (intptr_t) uncompressed_table_start - (intptr_t) compressed_table_end;
     int max_gap = align_object_size(1)*BytesPerWord;
@@ -273,8 +270,8 @@
 bool constMethodKlass::oop_partially_loaded(oop obj) const {
   assert(obj->is_constMethod(), "object must be klass");
   constMethodOop m = constMethodOop(obj);
-  // check whether exception_table points to self (flag for partially loaded)
-  return m->exception_table() == (typeArrayOop)obj;
+  // check whether stackmap_data points to self (flag for partially loaded)
+  return m->stackmap_data() == (typeArrayOop)obj;
 }
 
 
@@ -282,6 +279,6 @@
 void constMethodKlass::oop_set_partially_loaded(oop obj) {
   assert(obj->is_constMethod(), "object must be klass");
   constMethodOop m = constMethodOop(obj);
-  // Temporarily set exception_table to point to self
-  m->set_exception_table((typeArrayOop)obj);
+  // Temporarily set stackmap_data to point to self
+  m->set_stackmap_data((typeArrayOop)obj);
 }
--- a/src/share/vm/oops/constMethodKlass.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/oops/constMethodKlass.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -46,6 +46,7 @@
   DEFINE_ALLOCATE_PERMANENT(constMethodKlass);
   constMethodOop allocate(int byte_code_size, int compressed_line_number_size,
                           int localvariable_table_length,
+                          int exception_table_length,
                           int checked_exceptions_length,
                           bool is_conc_safe,
                           TRAPS);
--- a/src/share/vm/oops/constMethodOop.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/oops/constMethodOop.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -35,6 +35,7 @@
 int constMethodOopDesc::object_size(int code_size,
                                     int compressed_line_number_size,
                                     int local_variable_table_length,
+                                    int exception_table_length,
                                     int checked_exceptions_length) {
   int extra_bytes = code_size;
   if (compressed_line_number_size > 0) {
@@ -49,6 +50,10 @@
     extra_bytes +=
               local_variable_table_length * sizeof(LocalVariableTableElement);
   }
+  if (exception_table_length > 0) {
+    extra_bytes += sizeof(u2);
+    extra_bytes += exception_table_length * sizeof(ExceptionTableElement);
+  }
   int extra_words = align_size_up(extra_bytes, BytesPerWord) / BytesPerWord;
   return align_object_size(header_size() + extra_words);
 }
@@ -73,23 +78,40 @@
   return last_u2_element();
 }
 
-u2* constMethodOopDesc::localvariable_table_length_addr() const {
-  assert(has_localvariable_table(), "called only if table is present");
+u2* constMethodOopDesc::exception_table_length_addr() const {
+  assert(has_exception_handler(), "called only if table is present");
   if (has_checked_exceptions()) {
     // If checked_exception present, locate immediately before them.
     return (u2*) checked_exceptions_start() - 1;
   } else {
-    // Else, the linenumber table is at the end of the constMethod.
+    // Else, the exception table is at the end of the constMethod.
     return last_u2_element();
   }
 }
 
+u2* constMethodOopDesc::localvariable_table_length_addr() const {
+  assert(has_localvariable_table(), "called only if table is present");
+  if (has_exception_handler()) {
+    // If exception_table present, locate immediately before them.
+    return (u2*) exception_table_start() - 1;
+  } else {
+    if (has_checked_exceptions()) {
+      // If checked_exception present, locate immediately before them.
+      return (u2*) checked_exceptions_start() - 1;
+    } else {
+      // Else, the linenumber table is at the end of the constMethod.
+      return last_u2_element();
+    }
+  }
+}
+
 
 // Update the flags to indicate the presence of these optional fields.
 void constMethodOopDesc::set_inlined_tables_length(
                                               int checked_exceptions_len,
                                               int compressed_line_number_size,
-                                              int localvariable_table_len) {
+                                              int localvariable_table_len,
+                                              int exception_table_len) {
   // Must be done in the order below, otherwise length_addr accessors
   // will not work. Only set bit in header if length is positive.
   assert(_flags == 0, "Error");
@@ -100,6 +122,10 @@
     _flags |= _has_checked_exceptions;
     *(checked_exceptions_length_addr()) = checked_exceptions_len;
   }
+  if (exception_table_len > 0) {
+    _flags |= _has_exception_table;
+    *(exception_table_length_addr()) = exception_table_len;
+  }
   if (localvariable_table_len > 0) {
     _flags |= _has_localvariable_table;
     *(localvariable_table_length_addr()) = localvariable_table_len;
@@ -133,3 +159,15 @@
   addr -= length * sizeof(LocalVariableTableElement) / sizeof(u2);
   return (LocalVariableTableElement*) addr;
 }
+
+int constMethodOopDesc::exception_table_length() const {
+  return has_exception_handler() ? *(exception_table_length_addr()) : 0;
+}
+
+ExceptionTableElement* constMethodOopDesc::exception_table_start() const {
+  u2* addr = exception_table_length_addr();
+  u2 length = *addr;
+  assert(length > 0, "should only be called if table is present");
+  addr -= length * sizeof(ExceptionTableElement) / sizeof(u2);
+  return (ExceptionTableElement*)addr;
+}
--- a/src/share/vm/oops/constMethodOop.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/oops/constMethodOop.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -43,7 +43,6 @@
 // | fingerprint 2                                        |
 // | constants                      (oop)                 |
 // | stackmap_data                  (oop)                 |
-// | exception_table                (oop)                 |
 // | constMethod_size                                     |
 // | interp_kind  | flags    | code_size                  |
 // | name index              | signature index            |
@@ -64,7 +63,13 @@
 // |  (length is u2, elements are 6-tuples of u2)         |
 // |  (see class LocalVariableTableElement)               |
 // |  (access flags bit tells whether table is present)   |
-// |  (indexed from end of contMethodOop)                 |
+// |  (indexed from end of constMethodOop)                |
+// |------------------------------------------------------|
+// | exception table + length (length last)               |
+// |  (length is u2, elements are 4-tuples of u2)         |
+// |  (see class ExceptionTableElement)                   |
+// |  (access flags bit tells whether table is present)   |
+// |  (indexed from end of constMethodOop)                |
 // |------------------------------------------------------|
 // | checked exceptions elements + length (length last)   |
 // |  (length is u2, elements are u2)                     |
@@ -93,6 +98,15 @@
 };
 
 
+// Utitily class describing elements in exception table
+class ExceptionTableElement VALUE_OBJ_CLASS_SPEC {
+ public:
+  u2 start_pc;
+  u2 end_pc;
+  u2 handler_pc;
+  u2 catch_type_index;
+};
+
 class constMethodOopDesc : public oopDesc {
   friend class constMethodKlass;
   friend class VMStructs;
@@ -100,7 +114,8 @@
   enum {
     _has_linenumber_table = 1,
     _has_checked_exceptions = 2,
-    _has_localvariable_table = 4
+    _has_localvariable_table = 4,
+    _has_exception_table = 8
   };
 
   // Bit vector of signature
@@ -114,7 +129,7 @@
 
 public:
   oop* oop_block_beg() const { return adr_constants(); }
-  oop* oop_block_end() const { return adr_exception_table() + 1; }
+  oop* oop_block_end() const { return adr_stackmap_data() + 1; }
 
 private:
   //
@@ -126,11 +141,6 @@
   // Raw stackmap data for the method
   typeArrayOop      _stackmap_data;
 
-  // The exception handler table. 4-tuples of ints [start_pc, end_pc,
-  // handler_pc, catch_type index] For methods with no exceptions the
-  // table is pointing to Universe::the_empty_int_array
-  typeArrayOop      _exception_table;
-
   //
   // End of the oop block.
   //
@@ -152,7 +162,8 @@
   // Inlined tables
   void set_inlined_tables_length(int checked_exceptions_len,
                                  int compressed_line_number_size,
-                                 int localvariable_table_len);
+                                 int localvariable_table_len,
+                                 int exception_table_len);
 
   bool has_linenumber_table() const
     { return (_flags & _has_linenumber_table) != 0; }
@@ -163,6 +174,9 @@
   bool has_localvariable_table() const
     { return (_flags & _has_localvariable_table) != 0; }
 
+  bool has_exception_handler() const
+    { return (_flags & _has_exception_table) != 0; }
+
   void set_interpreter_kind(int kind)      { _interpreter_kind = kind; }
   int  interpreter_kind(void) const        { return _interpreter_kind; }
 
@@ -181,11 +195,6 @@
   }
   bool has_stackmap_table() const { return _stackmap_data != NULL; }
 
-  // exception handler table
-  typeArrayOop exception_table() const           { return _exception_table; }
-  void set_exception_table(typeArrayOop e)       { oop_store_without_check((oop*) &_exception_table, (oop) e); }
-  bool has_exception_handler() const             { return exception_table() != NULL && exception_table()->length() > 0; }
-
   void init_fingerprint() {
     const uint64_t initval = CONST64(0x8000000000000000);
     _fingerprint = initval;
@@ -235,6 +244,7 @@
   // Object size needed
   static int object_size(int code_size, int compressed_line_number_size,
                          int local_variable_table_length,
+                         int exception_table_length,
                          int checked_exceptions_length);
 
   int object_size() const                 { return _constMethod_size; }
@@ -256,6 +266,7 @@
   u_char* compressed_linenumber_table() const;         // not preserved by gc
   u2* checked_exceptions_length_addr() const;
   u2* localvariable_table_length_addr() const;
+  u2* exception_table_length_addr() const;
 
   // checked exceptions
   int checked_exceptions_length() const;
@@ -265,6 +276,10 @@
   int localvariable_table_length() const;
   LocalVariableTableElement* localvariable_table_start() const;
 
+  // exception table
+  int exception_table_length() const;
+  ExceptionTableElement* exception_table_start() const;
+
   // byte codes
   void    set_code(address code) {
     if (code_size() > 0) {
@@ -282,13 +297,10 @@
   // interpreter support
   static ByteSize constants_offset()
                { return byte_offset_of(constMethodOopDesc, _constants); }
-  static ByteSize exception_table_offset()
-               { return byte_offset_of(constMethodOopDesc, _exception_table); }
 
   // Garbage collection support
   oop*  adr_constants() const          { return (oop*)&_constants; }
   oop*  adr_stackmap_data() const      { return (oop*)&_stackmap_data;   }
-  oop*  adr_exception_table() const    { return (oop*)&_exception_table; }
   bool is_conc_safe() { return _is_conc_safe; }
   void set_is_conc_safe(bool v) { _is_conc_safe = v; }
 
--- a/src/share/vm/oops/constantPoolOop.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/oops/constantPoolOop.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -764,7 +764,7 @@
                         unsigned char *bytes);
 };
 
-class SymbolHashMapEntry : public CHeapObj {
+class SymbolHashMapEntry : public CHeapObj<mtSymbol> {
  private:
   unsigned int        _hash;   // 32-bit hash for item
   SymbolHashMapEntry* _next;   // Next element in the linked list for this bucket
@@ -790,7 +790,7 @@
 }; // End SymbolHashMapEntry class
 
 
-class SymbolHashMapBucket : public CHeapObj {
+class SymbolHashMapBucket : public CHeapObj<mtSymbol> {
 
 private:
   SymbolHashMapEntry*    _entry;
@@ -803,7 +803,7 @@
 }; // End SymbolHashMapBucket class
 
 
-class SymbolHashMap: public CHeapObj {
+class SymbolHashMap: public CHeapObj<mtSymbol> {
 
  private:
   // Default number of entries in the table
@@ -816,7 +816,7 @@
 
   void initialize_table(int table_size) {
     _table_size = table_size;
-    _buckets = NEW_C_HEAP_ARRAY(SymbolHashMapBucket, table_size);
+    _buckets = NEW_C_HEAP_ARRAY(SymbolHashMapBucket, table_size, mtSymbol);
     for (int index = 0; index < table_size; index++) {
       _buckets[index].clear();
     }
--- a/src/share/vm/oops/generateOopMap.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/oops/generateOopMap.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -400,10 +400,9 @@
   bool fellThrough = false;  // False to get first BB marked.
 
   // First mark all exception handlers as start of a basic-block
-  typeArrayOop excps = method()->exception_table();
-  for(int i = 0; i < excps->length(); i += 4) {
-    int handler_pc_idx = i+2;
-    bb_mark_fct(this, excps->int_at(handler_pc_idx), NULL);
+  ExceptionTable excps(method());
+  for(int i = 0; i < excps.length(); i ++) {
+    bb_mark_fct(this, excps.handler_pc(i), NULL);
   }
 
   // Then iterate through the code
@@ -450,10 +449,9 @@
 
   // Mark entry basic block as alive and all exception handlers
   _basic_blocks[0].mark_as_alive();
-  typeArrayOop excps = method()->exception_table();
-  for(int i = 0; i < excps->length(); i += 4) {
-    int handler_pc_idx = i+2;
-    BasicBlock *bb = get_basic_block_at(excps->int_at(handler_pc_idx));
+  ExceptionTable excps(method());
+  for(int i = 0; i < excps.length(); i++) {
+    BasicBlock *bb = get_basic_block_at(excps.handler_pc(i));
     // If block is not already alive (due to multiple exception handlers to same bb), then
     // make it alive
     if (bb->is_dead()) bb->mark_as_alive();
@@ -1181,12 +1179,12 @@
 
   if (_has_exceptions) {
     int bci = itr->bci();
-    typeArrayOop exct  = method()->exception_table();
-    for(int i = 0; i< exct->length(); i+=4) {
-      int start_pc   = exct->int_at(i);
-      int end_pc     = exct->int_at(i+1);
-      int handler_pc = exct->int_at(i+2);
-      int catch_type = exct->int_at(i+3);
+    ExceptionTable exct(method());
+    for(int i = 0; i< exct.length(); i++) {
+      int start_pc   = exct.start_pc(i);
+      int end_pc     = exct.end_pc(i);
+      int handler_pc = exct.handler_pc(i);
+      int catch_type = exct.catch_type_index(i);
 
       if (start_pc <= bci && bci < end_pc) {
         BasicBlock *excBB = get_basic_block_at(handler_pc);
@@ -2055,7 +2053,7 @@
   _conflict       = false;
   _max_locals     = method()->max_locals();
   _max_stack      = method()->max_stack();
-  _has_exceptions = (method()->exception_table()->length() > 0);
+  _has_exceptions = (method()->has_exception_handler());
   _nof_refval_conflicts = 0;
   _init_vars      = new GrowableArray<intptr_t>(5);  // There are seldom more than 5 init_vars
   _report_result  = false;
@@ -2070,9 +2068,10 @@
     if (Verbose) {
       _method->print_codes();
       tty->print_cr("Exception table:");
-      typeArrayOop excps = method()->exception_table();
-      for(int i = 0; i < excps->length(); i += 4) {
-        tty->print_cr("[%d - %d] -> %d", excps->int_at(i + 0), excps->int_at(i + 1), excps->int_at(i + 2));
+      ExceptionTable excps(method());
+      for(int i = 0; i < excps.length(); i ++) {
+        tty->print_cr("[%d - %d] -> %d",
+                      excps.start_pc(i), excps.end_pc(i), excps.handler_pc(i));
       }
     }
   }
--- a/src/share/vm/oops/instanceKlass.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/oops/instanceKlass.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -847,7 +847,6 @@
   Klass::shared_symbols_iterate(closure);
   closure->do_symbol(&_generic_signature);
   closure->do_symbol(&_source_file_name);
-  closure->do_symbol(&_source_debug_extension);
 
   for (JavaFieldStream fs(this); !fs.done(); fs.next()) {
     int name_index = fs.name_index();
@@ -989,7 +988,7 @@
   fieldDescriptor fd;
   int length = java_fields_count();
   // In DebugInfo nonstatic fields are sorted by offset.
-  int* fields_sorted = NEW_C_HEAP_ARRAY(int, 2*(length+1));
+  int* fields_sorted = NEW_C_HEAP_ARRAY(int, 2*(length+1), mtClass);
   int j = 0;
   for (int i = 0; i < length; i += 1) {
     fd.initialize(as_klassOop(), i);
@@ -1009,7 +1008,7 @@
       cl->do_field(&fd);
     }
   }
-  FREE_C_HEAP_ARRAY(int, fields_sorted);
+  FREE_C_HEAP_ARRAY(int, fields_sorted, mtClass);
 }
 
 
@@ -1236,7 +1235,7 @@
     if (length <= idnum) {
       // allocate a new cache that might be used
       size_t size = MAX2(idnum+1, (size_t)ik_h->idnum_allocated_count());
-      new_jmeths = NEW_C_HEAP_ARRAY(jmethodID, size+1);
+      new_jmeths = NEW_C_HEAP_ARRAY(jmethodID, size+1, mtClass);
       memset(new_jmeths, 0, (size+1)*sizeof(jmethodID));
       // cache size is stored in element[0], other elements offset by one
       new_jmeths[0] = (jmethodID)size;
@@ -1397,7 +1396,7 @@
     // cache size is stored in element[0], other elements offset by one
     if (indices == NULL || (length = (size_t)indices[0]) <= idnum) {
       size_t size = MAX2(idnum+1, (size_t)idnum_allocated_count());
-      int* new_indices = NEW_C_HEAP_ARRAY(int, size+1);
+      int* new_indices = NEW_C_HEAP_ARRAY(int, size+1, mtClass);
       new_indices[0] = (int)size;
       // copy any existing entries
       size_t i;
@@ -1933,7 +1932,7 @@
 
   // deallocate the cached class file
   if (_cached_class_file_bytes != NULL) {
-    os::free(_cached_class_file_bytes);
+    os::free(_cached_class_file_bytes, mtClass);
     _cached_class_file_bytes = NULL;
     _cached_class_file_len = 0;
   }
@@ -1944,9 +1943,10 @@
   // class can't be referenced anymore).
   if (_array_name != NULL)  _array_name->decrement_refcount();
   if (_source_file_name != NULL) _source_file_name->decrement_refcount();
-  if (_source_debug_extension != NULL) _source_debug_extension->decrement_refcount();
   // walk constant pool and decrement symbol reference counts
   _constants->unreference_symbols();
+
+  if (_source_debug_extension != NULL) FREE_C_HEAP_ARRAY(char, _source_debug_extension, mtClass);
 }
 
 void instanceKlass::set_source_file_name(Symbol* n) {
@@ -1954,9 +1954,22 @@
   if (_source_file_name != NULL) _source_file_name->increment_refcount();
 }
 
-void instanceKlass::set_source_debug_extension(Symbol* n) {
-  _source_debug_extension = n;
-  if (_source_debug_extension != NULL) _source_debug_extension->increment_refcount();
+void instanceKlass::set_source_debug_extension(char* array, int length) {
+  if (array == NULL) {
+    _source_debug_extension = NULL;
+  } else {
+    // Adding one to the attribute length in order to store a null terminator
+    // character could cause an overflow because the attribute length is
+    // already coded with an u4 in the classfile, but in practice, it's
+    // unlikely to happen.
+    assert((length+1) > length, "Overflow checking");
+    char* sde = NEW_C_HEAP_ARRAY(char, (length + 1), mtClass);
+    for (int i = 0; i < length; i++) {
+      sde[i] = array[i];
+    }
+    sde[length] = '\0';
+    _source_debug_extension = sde;
+  }
 }
 
 address instanceKlass::static_field_addr(int offset) {
@@ -2530,7 +2543,7 @@
     // This is the first previous version so make some space.
     // Start with 2 elements under the assumption that the class
     // won't be redefined much.
-    _previous_versions =  new (ResourceObj::C_HEAP)
+    _previous_versions =  new (ResourceObj::C_HEAP, mtClass)
                             GrowableArray<PreviousVersionNode *>(2, true);
   }
 
@@ -2556,7 +2569,7 @@
       ("add: all methods are obsolete; flushing any EMCP weak refs"));
   } else {
     int local_count = 0;
-    GrowableArray<jweak>* method_refs = new (ResourceObj::C_HEAP)
+    GrowableArray<jweak>* method_refs = new (ResourceObj::C_HEAP, mtClass)
       GrowableArray<jweak>(emcp_method_count, true);
     for (int i = 0; i < old_methods->length(); i++) {
       if (emcp_methods->at(i)) {
@@ -2948,7 +2961,7 @@
 
   while (_current_index < length) {
     PreviousVersionNode * pv_node = _previous_versions->at(_current_index++);
-    PreviousVersionInfo * pv_info = new (ResourceObj::C_HEAP)
+    PreviousVersionInfo * pv_info = new (ResourceObj::C_HEAP, mtClass)
                                           PreviousVersionInfo(pv_node);
 
     constantPoolHandle cp_h = pv_info->prev_constant_pool_handle();
--- a/src/share/vm/oops/instanceKlass.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/oops/instanceKlass.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -226,7 +226,9 @@
   // Name of source file containing this klass, NULL if not specified.
   Symbol*         _source_file_name;
   // the source debug extension for this klass, NULL if not specified.
-  Symbol*         _source_debug_extension;
+  // Specified as UTF-8 string without terminating zero byte in the classfile,
+  // it is stored in the instanceklass as a NULL-terminated UTF-8 string
+  char*           _source_debug_extension;
   // Generic signature, or null if none.
   Symbol*         _generic_signature;
   // Array name derived from this class which needs unreferencing
@@ -542,8 +544,8 @@
   void set_major_version(u2 major_version) { _major_version = major_version; }
 
   // source debug extension
-  Symbol* source_debug_extension() const   { return _source_debug_extension; }
-  void set_source_debug_extension(Symbol* n);
+  char* source_debug_extension() const     { return _source_debug_extension; }
+  void set_source_debug_extension(char* array, int length);
 
   // symbol unloading support (refcount already added)
   Symbol* array_name()                     { return _array_name; }
@@ -1008,7 +1010,7 @@
 
 
 /* JNIid class for jfieldIDs only */
-class JNIid: public CHeapObj {
+class JNIid: public CHeapObj<mtClass> {
   friend class VMStructs;
  private:
   klassOop           _holder;
@@ -1059,7 +1061,7 @@
 // reference must be used because a weak reference would be seen as
 // collectible. A GrowableArray of PreviousVersionNodes is attached
 // to the instanceKlass as needed. See PreviousVersionWalker below.
-class PreviousVersionNode : public CHeapObj {
+class PreviousVersionNode : public CHeapObj<mtClass> {
  private:
   // A shared ConstantPool is never collected so we'll always have
   // a reference to it so we can update items in the cache. We'll
@@ -1154,7 +1156,7 @@
 // noticed since an nmethod should be removed as many times are it's
 // added.
 //
-class nmethodBucket: public CHeapObj {
+class nmethodBucket: public CHeapObj<mtClass> {
   friend class VMStructs;
  private:
   nmethod*       _nmethod;
--- a/src/share/vm/oops/instanceKlassKlass.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/oops/instanceKlassKlass.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -421,8 +421,7 @@
     ik->set_protection_domain(NULL);
     ik->set_signers(NULL);
     ik->set_source_file_name(NULL);
-    ik->set_source_debug_extension(NULL);
-    ik->set_source_debug_extension(NULL);
+    ik->set_source_debug_extension(NULL, 0);
     ik->set_array_name(NULL);
     ik->set_inner_classes(NULL);
     ik->set_static_oop_field_count(0);
@@ -531,7 +530,7 @@
   }
   if (ik->source_debug_extension() != NULL) {
     st->print(BULLET"source debug extension:       ");
-    ik->source_debug_extension()->print_value_on(st);
+    st->print_cr("%s", ik->source_debug_extension());
     st->cr();
   }
 
--- a/src/share/vm/oops/methodOop.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/oops/methodOop.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -111,25 +111,21 @@
 
 int  methodOopDesc::fast_exception_handler_bci_for(KlassHandle ex_klass, int throw_bci, TRAPS) {
   // exception table holds quadruple entries of the form (beg_bci, end_bci, handler_bci, klass_index)
-  const int beg_bci_offset     = 0;
-  const int end_bci_offset     = 1;
-  const int handler_bci_offset = 2;
-  const int klass_index_offset = 3;
-  const int entry_size         = 4;
   // access exception table
-  typeArrayHandle table (THREAD, constMethod()->exception_table());
-  int length = table->length();
-  assert(length % entry_size == 0, "exception table format has changed");
+  ExceptionTable table(this);
+  int length = table.length();
   // iterate through all entries sequentially
   constantPoolHandle pool(THREAD, constants());
-  for (int i = 0; i < length; i += entry_size) {
-    int beg_bci = table->int_at(i + beg_bci_offset);
-    int end_bci = table->int_at(i + end_bci_offset);
+  for (int i = 0; i < length; i ++) {
+    //reacquire the table in case a GC happened
+    ExceptionTable table(this);
+    int beg_bci = table.start_pc(i);
+    int end_bci = table.end_pc(i);
     assert(beg_bci <= end_bci, "inconsistent exception table");
     if (beg_bci <= throw_bci && throw_bci < end_bci) {
       // exception handler bci range covers throw_bci => investigate further
-      int handler_bci = table->int_at(i + handler_bci_offset);
-      int klass_index = table->int_at(i + klass_index_offset);
+      int handler_bci = table.handler_pc(i);
+      int klass_index = table.catch_type_index(i);
       if (klass_index == 0) {
         return handler_bci;
       } else if (ex_klass.is_null()) {
@@ -980,7 +976,7 @@
   {
     int flags_bits = (JVM_MH_INVOKE_BITS | JVM_ACC_PUBLIC | JVM_ACC_FINAL);
     methodOop m_oop = oopFactory::new_method(0, accessFlags_from(flags_bits),
-                                             0, 0, 0, IsSafeConc, CHECK_(empty));
+                                             0, 0, 0, 0, IsSafeConc, CHECK_(empty));
     m = methodHandle(THREAD, m_oop);
   }
   m->set_constants(cp());
@@ -994,7 +990,6 @@
   m->set_result_index(rtf.type());
 #endif
   m->compute_size_of_parameters(THREAD);
-  m->set_exception_table(Universe::the_empty_int_array());
   m->init_intrinsic_id();
   assert(m->intrinsic_id() == vmIntrinsics::_invokeExact ||
          m->intrinsic_id() == vmIntrinsics::_invokeGeneric, "must be an invoker");
@@ -1038,6 +1033,7 @@
   AccessFlags flags = m->access_flags();
   int checked_exceptions_len = m->checked_exceptions_length();
   int localvariable_len = m->localvariable_table_length();
+  int exception_table_len = m->exception_table_length();
   // Allocate newm_oop with the is_conc_safe parameter set
   // to IsUnsafeConc to indicate that newm_oop is not yet
   // safe for concurrent processing by a GC.
@@ -1045,6 +1041,7 @@
                                               flags,
                                               new_compressed_linenumber_size,
                                               localvariable_len,
+                                              exception_table_len,
                                               checked_exceptions_len,
                                               IsUnsafeConc,
                                               CHECK_(methodHandle()));
@@ -1085,6 +1082,7 @@
   newm->set_method_size(new_method_size);
   assert(newm->code_size() == new_code_length, "check");
   assert(newm->checked_exceptions_length() == checked_exceptions_len, "check");
+  assert(newm->exception_table_length() == exception_table_len, "check");
   assert(newm->localvariable_table_length() == localvariable_len, "check");
   // Copy new byte codes
   memcpy(newm->code_base(), new_code, new_code_length);
@@ -1100,6 +1098,12 @@
            m->checked_exceptions_start(),
            checked_exceptions_len * sizeof(CheckedExceptionElement));
   }
+  // Copy exception table
+  if (exception_table_len > 0) {
+    memcpy(newm->exception_table_start(),
+           m->exception_table_start(),
+           exception_table_len * sizeof(ExceptionTableElement));
+  }
   // Copy local variable number table
   if (localvariable_len > 0) {
     memcpy(newm->localvariable_table_start(),
--- a/src/share/vm/oops/methodOop.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/oops/methodOop.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -122,8 +122,9 @@
   u2                _max_locals;                 // Number of local variables used by this method
   u2                _size_of_parameters;         // size of the parameter block (receiver + arguments) in words
   u1                _intrinsic_id;               // vmSymbols::intrinsic_id (0 == _none)
-  u1                _jfr_towrite : 1,            // Flags
-                                 : 7;
+  u1                _jfr_towrite  : 1,           // Flags
+                    _force_inline : 1,
+                                  : 6;
   u2                _interpreter_throwout_count; // Count of times method was exited via exception while interpreting
   u2                _number_of_breakpoints;      // fullspeed debugging support
   InvocationCounter _invocation_counter;         // Incremented before each activation of the method - used to trigger frequency-based optimizations
@@ -282,12 +283,12 @@
   }
 
   // exception handler table
-  typeArrayOop exception_table() const
-                                   { return constMethod()->exception_table(); }
-  void set_exception_table(typeArrayOop e)
-                                     { constMethod()->set_exception_table(e); }
   bool has_exception_handler() const
                              { return constMethod()->has_exception_handler(); }
+  int exception_table_length() const
+                             { return constMethod()->exception_table_length(); }
+  ExceptionTableElement* exception_table_start() const
+                             { return constMethod()->exception_table_start(); }
 
   // Finds the first entry point bci of an exception handler for an
   // exception of klass ex_klass thrown at throw_bci. A value of NULL
@@ -655,6 +656,9 @@
   bool jfr_towrite()                 { return _jfr_towrite; }
   void set_jfr_towrite(bool towrite) { _jfr_towrite = towrite; }
 
+  bool force_inline()            { return _force_inline; }
+  void set_force_inline(bool fi) { _force_inline = fi; }
+
   // On-stack replacement support
   bool has_osr_nmethod(int level, bool match_level) {
    return instanceKlass::cast(method_holder())->lookup_osr_nmethod(this, InvocationEntryBci, level, match_level) != NULL;
@@ -801,7 +805,7 @@
 // breakpoints are written only at safepoints, and are read
 // concurrently only outside of safepoints.
 
-class BreakpointInfo : public CHeapObj {
+class BreakpointInfo : public CHeapObj<mtClass> {
   friend class VMStructs;
  private:
   Bytecodes::Code  _orig_bytecode;
@@ -835,4 +839,66 @@
   void clear(methodOop method);
 };
 
+// Utility class for access exception handlers
+class ExceptionTable : public StackObj {
+ private:
+  ExceptionTableElement* _table;
+  u2  _length;
+
+ public:
+  ExceptionTable(methodOop m) {
+    if (m->has_exception_handler()) {
+      _table = m->exception_table_start();
+      _length = m->exception_table_length();
+    } else {
+      _table = NULL;
+      _length = 0;
+    }
+  }
+
+  int length() const {
+    return _length;
+  }
+
+  u2 start_pc(int idx) const {
+    assert(idx < _length, "out of bounds");
+    return _table[idx].start_pc;
+  }
+
+  void set_start_pc(int idx, u2 value) {
+    assert(idx < _length, "out of bounds");
+    _table[idx].start_pc = value;
+  }
+
+  u2 end_pc(int idx) const {
+    assert(idx < _length, "out of bounds");
+    return _table[idx].end_pc;
+  }
+
+  void set_end_pc(int idx, u2 value) {
+    assert(idx < _length, "out of bounds");
+    _table[idx].end_pc = value;
+  }
+
+  u2 handler_pc(int idx) const {
+    assert(idx < _length, "out of bounds");
+    return _table[idx].handler_pc;
+  }
+
+  void set_handler_pc(int idx, u2 value) {
+    assert(idx < _length, "out of bounds");
+    _table[idx].handler_pc = value;
+  }
+
+  u2 catch_type_index(int idx) const {
+    assert(idx < _length, "out of bounds");
+    return _table[idx].catch_type_index;
+  }
+
+  void set_catch_type_index(int idx, u2 value) {
+    assert(idx < _length, "out of bounds");
+    _table[idx].catch_type_index = value;
+  }
+};
+
 #endif // SHARE_VM_OOPS_METHODOOP_HPP
--- a/src/share/vm/oops/symbol.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/oops/symbol.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -38,7 +38,7 @@
 
 void* Symbol::operator new(size_t sz, int len, TRAPS) {
   int alloc_size = object_size(len)*HeapWordSize;
-  address res = (address) AllocateHeap(alloc_size, "symbol");
+  address res = (address) AllocateHeap(alloc_size, mtSymbol);
   DEBUG_ONLY(set_allocation_type(res, ResourceObj::C_HEAP);)
   return res;
 }
--- a/src/share/vm/opto/c2_globals.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/c2_globals.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -81,6 +81,13 @@
   product(intx, MaxLoopPad, (OptoLoopAlignment-1),                          \
           "Align a loop if padding size in bytes is less or equal to this value") \
                                                                             \
+  product(intx, MaxVectorSize, 32,                                          \
+          "Max vector size in bytes, "                                      \
+          "actual size could be less depending on elements type")           \
+                                                                            \
+  product(bool, AlignVector, false,                                         \
+          "Perform vector store/load alignment in loop")                    \
+                                                                            \
   product(intx, NumberOfLoopInstrToAlign, 4,                                \
           "Number of first instructions in a loop to align")                \
                                                                             \
@@ -292,9 +299,12 @@
   develop(bool, SuperWordRTDepCheck, false,                                 \
           "Enable runtime dependency checks.")                              \
                                                                             \
-  product(bool, TraceSuperWord, false,                                      \
+  notproduct(bool, TraceSuperWord, false,                                   \
           "Trace superword transforms")                                     \
                                                                             \
+  notproduct(bool, TraceNewVectors, false,                                  \
+          "Trace creation of Vector nodes")                                 \
+                                                                            \
   product_pd(bool, OptoBundling,                                            \
           "Generate nops to fill i-cache lines")                            \
                                                                             \
--- a/src/share/vm/opto/callGenerator.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/callGenerator.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -172,9 +172,11 @@
 
 JVMState* DynamicCallGenerator::generate(JVMState* jvms) {
   GraphKit kit(jvms);
+  Compile* C = kit.C;
+  PhaseGVN& gvn = kit.gvn();
 
-  if (kit.C->log() != NULL) {
-    kit.C->log()->elem("dynamic_call bci='%d'", jvms->bci());
+  if (C->log() != NULL) {
+    C->log()->elem("dynamic_call bci='%d'", jvms->bci());
   }
 
   // Get the constant pool cache from the caller class.
@@ -190,18 +192,21 @@
   size_t call_site_offset = cpcache->get_f1_offset(index);
 
   // Load the CallSite object from the constant pool cache.
-  const TypeOopPtr* cpcache_ptr = TypeOopPtr::make_from_constant(cpcache);
-  Node* cpcache_adr = kit.makecon(cpcache_ptr);
-  Node* call_site_adr = kit.basic_plus_adr(cpcache_adr, cpcache_adr, call_site_offset);
-  Node* call_site = kit.make_load(kit.control(), call_site_adr, TypeInstPtr::BOTTOM, T_OBJECT, Compile::AliasIdxRaw);
+  const TypeOopPtr* cpcache_type   = TypeOopPtr::make_from_constant(cpcache);  // returns TypeAryPtr of type T_OBJECT
+  const TypeOopPtr* call_site_type = TypeOopPtr::make_from_klass(C->env()->CallSite_klass());
+  Node* cpcache_adr   = kit.makecon(cpcache_type);
+  Node* call_site_adr = kit.basic_plus_adr(cpcache_adr, call_site_offset);
+  // The oops in the constant pool cache are not compressed; load then as raw pointers.
+  Node* call_site     = kit.make_load(kit.control(), call_site_adr, call_site_type, T_ADDRESS, Compile::AliasIdxRaw);
 
   // Load the target MethodHandle from the CallSite object.
-  Node* target_mh_adr = kit.basic_plus_adr(call_site, call_site, java_lang_invoke_CallSite::target_offset_in_bytes());
-  Node* target_mh = kit.make_load(kit.control(), target_mh_adr, TypeInstPtr::BOTTOM, T_OBJECT);
+  const TypeOopPtr* target_type = TypeOopPtr::make_from_klass(C->env()->MethodHandle_klass());
+  Node* target_mh_adr = kit.basic_plus_adr(call_site, java_lang_invoke_CallSite::target_offset_in_bytes());
+  Node* target_mh     = kit.make_load(kit.control(), target_mh_adr, target_type, T_OBJECT);
 
   address resolve_stub = SharedRuntime::get_resolve_opt_virtual_call_stub();
 
-  CallStaticJavaNode *call = new (kit.C, tf()->domain()->cnt()) CallStaticJavaNode(tf(), resolve_stub, method(), kit.bci());
+  CallStaticJavaNode* call = new (C, tf()->domain()->cnt()) CallStaticJavaNode(tf(), resolve_stub, method(), kit.bci());
   // invokedynamic is treated as an optimized invokevirtual.
   call->set_optimized_virtual(true);
   // Take extra care (in the presence of argument motion) not to trash the SP:
@@ -785,9 +790,10 @@
 
 JVMState* PredictedDynamicCallGenerator::generate(JVMState* jvms) {
   GraphKit kit(jvms);
+  Compile* C = kit.C;
   PhaseGVN& gvn = kit.gvn();
 
-  CompileLog* log = kit.C->log();
+  CompileLog* log = C->log();
   if (log != NULL) {
     log->elem("predicted_dynamic_call bci='%d'", jvms->bci());
   }
@@ -803,8 +809,8 @@
     Node* receiver = kit.argument(0);
 
     // Check if the MethodHandle is the expected one
-    Node* cmp = gvn.transform(new(kit.C, 3) CmpPNode(receiver, predicted_mh));
-    bol = gvn.transform(new(kit.C, 2) BoolNode(cmp, BoolTest::eq) );
+    Node* cmp = gvn.transform(new (C, 3) CmpPNode(receiver, predicted_mh));
+    bol = gvn.transform(new (C, 2) BoolNode(cmp, BoolTest::eq) );
   } else {
     // Get the constant pool cache from the caller class.
     ciMethod* caller_method = jvms->method();
@@ -818,22 +824,25 @@
     size_t call_site_offset = cpcache->get_f1_offset(index);
 
     // Load the CallSite object from the constant pool cache.
-    const TypeOopPtr* cpcache_ptr = TypeOopPtr::make_from_constant(cpcache);
-    Node* cpcache_adr   = kit.makecon(cpcache_ptr);
-    Node* call_site_adr = kit.basic_plus_adr(cpcache_adr, cpcache_adr, call_site_offset);
-    Node* call_site     = kit.make_load(kit.control(), call_site_adr, TypeInstPtr::BOTTOM, T_OBJECT, Compile::AliasIdxRaw);
+    const TypeOopPtr* cpcache_type   = TypeOopPtr::make_from_constant(cpcache);  // returns TypeAryPtr of type T_OBJECT
+    const TypeOopPtr* call_site_type = TypeOopPtr::make_from_klass(C->env()->CallSite_klass());
+    Node* cpcache_adr   = kit.makecon(cpcache_type);
+    Node* call_site_adr = kit.basic_plus_adr(cpcache_adr, call_site_offset);
+    // The oops in the constant pool cache are not compressed; load then as raw pointers.
+    Node* call_site     = kit.make_load(kit.control(), call_site_adr, call_site_type, T_ADDRESS, Compile::AliasIdxRaw);
 
     // Load the target MethodHandle from the CallSite object.
+    const TypeOopPtr* target_type = TypeOopPtr::make_from_klass(C->env()->MethodHandle_klass());
     Node* target_adr = kit.basic_plus_adr(call_site, call_site, java_lang_invoke_CallSite::target_offset_in_bytes());
-    Node* target_mh  = kit.make_load(kit.control(), target_adr, TypeInstPtr::BOTTOM, T_OBJECT);
+    Node* target_mh  = kit.make_load(kit.control(), target_adr, target_type, T_OBJECT);
 
     // Check if the MethodHandle is still the same.
-    Node* cmp = gvn.transform(new(kit.C, 3) CmpPNode(target_mh, predicted_mh));
-    bol = gvn.transform(new(kit.C, 2) BoolNode(cmp, BoolTest::eq) );
+    Node* cmp = gvn.transform(new (C, 3) CmpPNode(target_mh, predicted_mh));
+    bol = gvn.transform(new (C, 2) BoolNode(cmp, BoolTest::eq) );
   }
   IfNode* iff = kit.create_and_xform_if(kit.control(), bol, _hit_prob, COUNT_UNKNOWN);
-  kit.set_control( gvn.transform(new(kit.C, 1) IfTrueNode (iff)));
-  Node* slow_ctl = gvn.transform(new(kit.C, 1) IfFalseNode(iff));
+  kit.set_control( gvn.transform(new (C, 1) IfTrueNode (iff)));
+  Node* slow_ctl = gvn.transform(new (C, 1) IfFalseNode(iff));
 
   SafePointNode* slow_map = NULL;
   JVMState* slow_jvms;
@@ -882,7 +891,7 @@
 
   // Finish the diamond.
   kit.C->set_has_split_ifs(true); // Has chance for split-if optimization
-  RegionNode* region = new (kit.C, 3) RegionNode(3);
+  RegionNode* region = new (C, 3) RegionNode(3);
   region->init_req(1, kit.control());
   region->init_req(2, slow_map->control());
   kit.set_control(gvn.transform(region));
--- a/src/share/vm/opto/chaitin.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/chaitin.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -75,6 +75,7 @@
   // Flags
   if( _is_oop ) tty->print("Oop ");
   if( _is_float ) tty->print("Float ");
+  if( _is_vector ) tty->print("Vector ");
   if( _was_spilled1 ) tty->print("Spilled ");
   if( _was_spilled2 ) tty->print("Spilled2 ");
   if( _direct_conflict ) tty->print("Direct_conflict ");
@@ -479,16 +480,18 @@
 
   // Move important info out of the live_arena to longer lasting storage.
   alloc_node_regs(_names.Size());
-  for( uint i=0; i < _names.Size(); i++ ) {
-    if( _names[i] ) {           // Live range associated with Node?
-      LRG &lrg = lrgs( _names[i] );
-      if( lrg.num_regs() == 1 ) {
-        _node_regs[i].set1( lrg.reg() );
+  for (uint i=0; i < _names.Size(); i++) {
+    if (_names[i]) {           // Live range associated with Node?
+      LRG &lrg = lrgs(_names[i]);
+      if (!lrg.alive()) {
+        _node_regs[i].set_bad();
+      } else if (lrg.num_regs() == 1) {
+        _node_regs[i].set1(lrg.reg());
       } else {                  // Must be a register-pair
-        if( !lrg._fat_proj ) {  // Must be aligned adjacent register pair
+        if (!lrg._fat_proj) {   // Must be aligned adjacent register pair
           // Live ranges record the highest register in their mask.
           // We want the low register for the AD file writer's convenience.
-          _node_regs[i].set2( OptoReg::add(lrg.reg(),-1) );
+          _node_regs[i].set2( OptoReg::add(lrg.reg(),(1-lrg.num_regs())) );
         } else {                // Misaligned; extract 2 bits
           OptoReg::Name hi = lrg.reg(); // Get hi register
           lrg.Remove(hi);       // Yank from mask
@@ -568,7 +571,7 @@
         // Check for float-vs-int live range (used in register-pressure
         // calculations)
         const Type *n_type = n->bottom_type();
-        if( n_type->is_floatingpoint() )
+        if (n_type->is_floatingpoint())
           lrg._is_float = 1;
 
         // Check for twice prior spilling.  Once prior spilling might have
@@ -599,18 +602,28 @@
         // Limit result register mask to acceptable registers
         const RegMask &rm = n->out_RegMask();
         lrg.AND( rm );
-        // Check for bound register masks
-        const RegMask &lrgmask = lrg.mask();
-        if( lrgmask.is_bound1() || lrgmask.is_bound2() )
-          lrg._is_bound = 1;
-
-        // Check for maximum frequency value
-        if( lrg._maxfreq < b->_freq )
-          lrg._maxfreq = b->_freq;
 
         int ireg = n->ideal_reg();
         assert( !n->bottom_type()->isa_oop_ptr() || ireg == Op_RegP,
                 "oops must be in Op_RegP's" );
+
+        // Check for vector live range (only if vector register is used).
+        // On SPARC vector uses RegD which could be misaligned so it is not
+        // processes as vector in RA.
+        if (RegMask::is_vector(ireg))
+          lrg._is_vector = 1;
+        assert(n_type->isa_vect() == NULL || lrg._is_vector || ireg == Op_RegD,
+               "vector must be in vector registers");
+
+        // Check for bound register masks
+        const RegMask &lrgmask = lrg.mask();
+        if (lrgmask.is_bound(ireg))
+          lrg._is_bound = 1;
+
+        // Check for maximum frequency value
+        if (lrg._maxfreq < b->_freq)
+          lrg._maxfreq = b->_freq;
+
         // Check for oop-iness, or long/double
         // Check for multi-kill projection
         switch( ireg ) {
@@ -689,7 +702,7 @@
           // AND changes how we count interferences.  A mis-aligned
           // double can interfere with TWO aligned pairs, or effectively
           // FOUR registers!
-          if( rm.is_misaligned_Pair() ) {
+          if (rm.is_misaligned_pair()) {
             lrg._fat_proj = 1;
             lrg._is_bound = 1;
           }
@@ -706,6 +719,33 @@
           lrg.set_reg_pressure(1);
 #endif
           break;
+        case Op_VecS:
+          assert(Matcher::vector_size_supported(T_BYTE,4), "sanity");
+          assert(RegMask::num_registers(Op_VecS) == RegMask::SlotsPerVecS, "sanity");
+          lrg.set_num_regs(RegMask::SlotsPerVecS);
+          lrg.set_reg_pressure(1);
+          break;
+        case Op_VecD:
+          assert(Matcher::vector_size_supported(T_FLOAT,RegMask::SlotsPerVecD), "sanity");
+          assert(RegMask::num_registers(Op_VecD) == RegMask::SlotsPerVecD, "sanity");
+          assert(lrgmask.is_aligned_sets(RegMask::SlotsPerVecD), "vector should be aligned");
+          lrg.set_num_regs(RegMask::SlotsPerVecD);
+          lrg.set_reg_pressure(1);
+          break;
+        case Op_VecX:
+          assert(Matcher::vector_size_supported(T_FLOAT,RegMask::SlotsPerVecX), "sanity");
+          assert(RegMask::num_registers(Op_VecX) == RegMask::SlotsPerVecX, "sanity");
+          assert(lrgmask.is_aligned_sets(RegMask::SlotsPerVecX), "vector should be aligned");
+          lrg.set_num_regs(RegMask::SlotsPerVecX);
+          lrg.set_reg_pressure(1);
+          break;
+        case Op_VecY:
+          assert(Matcher::vector_size_supported(T_FLOAT,RegMask::SlotsPerVecY), "sanity");
+          assert(RegMask::num_registers(Op_VecY) == RegMask::SlotsPerVecY, "sanity");
+          assert(lrgmask.is_aligned_sets(RegMask::SlotsPerVecY), "vector should be aligned");
+          lrg.set_num_regs(RegMask::SlotsPerVecY);
+          lrg.set_reg_pressure(1);
+          break;
         default:
           ShouldNotReachHere();
         }
@@ -763,24 +803,38 @@
         } else {
           lrg.AND( rm );
         }
+
         // Check for bound register masks
         const RegMask &lrgmask = lrg.mask();
-        if( lrgmask.is_bound1() || lrgmask.is_bound2() )
+        int kreg = n->in(k)->ideal_reg();
+        bool is_vect = RegMask::is_vector(kreg);
+        assert(n->in(k)->bottom_type()->isa_vect() == NULL ||
+               is_vect || kreg == Op_RegD,
+               "vector must be in vector registers");
+        if (lrgmask.is_bound(kreg))
           lrg._is_bound = 1;
+
         // If this use of a double forces a mis-aligned double,
         // flag as '_fat_proj' - really flag as allowing misalignment
         // AND changes how we count interferences.  A mis-aligned
         // double can interfere with TWO aligned pairs, or effectively
         // FOUR registers!
-        if( lrg.num_regs() == 2 && !lrg._fat_proj && rm.is_misaligned_Pair() ) {
+#ifdef ASSERT
+        if (is_vect) {
+          assert(lrgmask.is_aligned_sets(lrg.num_regs()), "vector should be aligned");
+          assert(!lrg._fat_proj, "sanity");
+          assert(RegMask::num_registers(kreg) == lrg.num_regs(), "sanity");
+        }
+#endif
+        if (!is_vect && lrg.num_regs() == 2 && !lrg._fat_proj && rm.is_misaligned_pair()) {
           lrg._fat_proj = 1;
           lrg._is_bound = 1;
         }
         // if the LRG is an unaligned pair, we will have to spill
         // so clear the LRG's register mask if it is not already spilled
-        if ( !n->is_SpillCopy() &&
-               (lrg._def == NULL || lrg.is_multidef() || !lrg._def->is_SpillCopy()) &&
-               lrgmask.is_misaligned_Pair()) {
+        if (!is_vect && !n->is_SpillCopy() &&
+            (lrg._def == NULL || lrg.is_multidef() || !lrg._def->is_SpillCopy()) &&
+            lrgmask.is_misaligned_pair()) {
           lrg.Clear();
         }
 
@@ -793,12 +847,14 @@
   } // end for all blocks
 
   // Final per-liverange setup
-  for( uint i2=0; i2<_maxlrg; i2++ ) {
+  for (uint i2=0; i2<_maxlrg; i2++) {
     LRG &lrg = lrgs(i2);
-    if( lrg.num_regs() == 2 && !lrg._fat_proj )
-      lrg.ClearToPairs();
+    assert(!lrg._is_vector || !lrg._fat_proj, "sanity");
+    if (lrg.num_regs() > 1 && !lrg._fat_proj) {
+      lrg.clear_to_sets();
+    }
     lrg.compute_set_mask_size();
-    if( lrg.not_free() ) {      // Handle case where we lose from the start
+    if (lrg.not_free()) {      // Handle case where we lose from the start
       lrg.set_reg(OptoReg::Name(LRG::SPILL_REG));
       lrg._direct_conflict = 1;
     }
@@ -1104,22 +1160,17 @@
       // Choose a color which is legal for him
       RegMask tempmask = lrg.mask();
       tempmask.AND(lrgs(copy_lrg).mask());
-      OptoReg::Name reg;
-      if( lrg.num_regs() == 1 ) {
-        reg = tempmask.find_first_elem();
-      } else {
-        tempmask.ClearToPairs();
-        reg = tempmask.find_first_pair();
-      }
-      if( OptoReg::is_valid(reg) )
+      tempmask.clear_to_sets(lrg.num_regs());
+      OptoReg::Name reg = tempmask.find_first_set(lrg.num_regs());
+      if (OptoReg::is_valid(reg))
         return reg;
     }
   }
 
   // If no bias info exists, just go with the register selection ordering
-  if( lrg.num_regs() == 2 ) {
-    // Find an aligned pair
-    return OptoReg::add(lrg.mask().find_first_pair(),chunk);
+  if (lrg._is_vector || lrg.num_regs() == 2) {
+    // Find an aligned set
+    return OptoReg::add(lrg.mask().find_first_set(lrg.num_regs()),chunk);
   }
 
   // CNC - Fun hack.  Alternate 1st and 2nd selection.  Enables post-allocate
@@ -1149,6 +1200,7 @@
     // Use a heuristic to "bias" the color choice
     return bias_color(lrg, chunk);
 
+  assert(!lrg._is_vector, "should be not vector here" );
   assert( lrg.num_regs() >= 2, "dead live ranges do not color" );
 
   // Fat-proj case or misaligned double argument.
@@ -1238,14 +1290,16 @@
     }
     //assert(is_allstack == lrg->mask().is_AllStack(), "nbrs must not change AllStackedness");
     // Aligned pairs need aligned masks
-    if( lrg->num_regs() == 2 && !lrg->_fat_proj )
-      lrg->ClearToPairs();
+    assert(!lrg->_is_vector || !lrg->_fat_proj, "sanity");
+    if (lrg->num_regs() > 1 && !lrg->_fat_proj) {
+      lrg->clear_to_sets();
+    }
 
     // Check if a color is available and if so pick the color
     OptoReg::Name reg = choose_color( *lrg, chunk );
 #ifdef SPARC
     debug_only(lrg->compute_set_mask_size());
-    assert(lrg->num_regs() != 2 || lrg->is_bound() || is_even(reg-1), "allocate all doubles aligned");
+    assert(lrg->num_regs() < 2 || lrg->is_bound() || is_even(reg-1), "allocate all doubles aligned");
 #endif
 
     //---------------
@@ -1277,17 +1331,16 @@
       // If the live range is not bound, then we actually had some choices
       // to make.  In this case, the mask has more bits in it than the colors
       // chosen.  Restrict the mask to just what was picked.
-      if( lrg->num_regs() == 1 ) { // Size 1 live range
+      int n_regs = lrg->num_regs();
+      assert(!lrg->_is_vector || !lrg->_fat_proj, "sanity");
+      if (n_regs == 1 || !lrg->_fat_proj) {
+        assert(!lrg->_is_vector || n_regs <= RegMask::SlotsPerVecY, "sanity");
         lrg->Clear();           // Clear the mask
         lrg->Insert(reg);       // Set regmask to match selected reg
-        lrg->set_mask_size(1);
-      } else if( !lrg->_fat_proj ) {
-        // For pairs, also insert the low bit of the pair
-        assert( lrg->num_regs() == 2, "unbound fatproj???" );
-        lrg->Clear();           // Clear the mask
-        lrg->Insert(reg);       // Set regmask to match selected reg
-        lrg->Insert(OptoReg::add(reg,-1));
-        lrg->set_mask_size(2);
+        // For vectors and pairs, also insert the low bit of the pair
+        for (int i = 1; i < n_regs; i++)
+          lrg->Insert(OptoReg::add(reg,-i));
+        lrg->set_mask_size(n_regs);
       } else {                  // Else fatproj
         // mask must be equal to fatproj bits, by definition
       }
@@ -1483,7 +1536,7 @@
 
   // Check for AddP-related opcodes
   if( !derived->is_Phi() ) {
-    assert( derived->as_Mach()->ideal_Opcode() == Op_AddP, "" );
+    assert(derived->as_Mach()->ideal_Opcode() == Op_AddP, err_msg("but is: %s", derived->Name()));
     Node *base = derived->in(AddPNode::Base);
     derived_base_map[derived->_idx] = base;
     return base;
@@ -1860,12 +1913,20 @@
       sprintf(buf,"L%d",lidx);  // No register binding yet
     } else if( !lidx ) {        // Special, not allocated value
       strcpy(buf,"Special");
-    } else if( (lrgs(lidx).num_regs() == 1)
-                ? !lrgs(lidx).mask().is_bound1()
-                : !lrgs(lidx).mask().is_bound2() ) {
-      sprintf(buf,"L%d",lidx); // No register binding yet
-    } else {                    // Hah!  We have a bound machine register
-      print_reg( lrgs(lidx).reg(), this, buf );
+    } else {
+      if (lrgs(lidx)._is_vector) {
+        if (lrgs(lidx).mask().is_bound_set(lrgs(lidx).num_regs()))
+          print_reg( lrgs(lidx).reg(), this, buf ); // a bound machine register
+        else
+          sprintf(buf,"L%d",lidx); // No register binding yet
+      } else if( (lrgs(lidx).num_regs() == 1)
+                 ? lrgs(lidx).mask().is_bound1()
+                 : lrgs(lidx).mask().is_bound_pair() ) {
+        // Hah!  We have a bound machine register
+        print_reg( lrgs(lidx).reg(), this, buf );
+      } else {
+        sprintf(buf,"L%d",lidx); // No register binding yet
+      }
     }
   }
   return buf+strlen(buf);
--- a/src/share/vm/opto/chaitin.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/chaitin.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -99,8 +99,15 @@
   void set_mask_size( int size ) {
     assert((size == 65535) || (size == (int)_mask.Size()), "");
     _mask_size = size;
-    debug_only(_msize_valid=1;)
-    debug_only( if( _num_regs == 2 && !_fat_proj ) _mask.VerifyPairs(); )
+#ifdef ASSERT
+    _msize_valid=1;
+    if (_is_vector) {
+      assert(!_fat_proj, "sanity");
+      _mask.verify_sets(_num_regs);
+    } else if (_num_regs == 2 && !_fat_proj) {
+      _mask.verify_pairs();
+    }
+#endif
   }
   void compute_set_mask_size() { set_mask_size(compute_mask_size()); }
   int mask_size() const { assert( _msize_valid, "mask size not valid" );
@@ -116,7 +123,8 @@
   void Set_All() { _mask.Set_All(); debug_only(_msize_valid=1); _mask_size = RegMask::CHUNK_SIZE; }
   void Insert( OptoReg::Name reg ) { _mask.Insert(reg);  debug_only(_msize_valid=0;) }
   void Remove( OptoReg::Name reg ) { _mask.Remove(reg);  debug_only(_msize_valid=0;) }
-  void ClearToPairs() { _mask.ClearToPairs(); debug_only(_msize_valid=0;) }
+  void clear_to_pairs() { _mask.clear_to_pairs(); debug_only(_msize_valid=0;) }
+  void clear_to_sets()  { _mask.clear_to_sets(_num_regs); debug_only(_msize_valid=0;) }
 
   // Number of registers this live range uses when it colors
 private:
@@ -150,6 +158,7 @@
 
   uint   _is_oop:1,             // Live-range holds an oop
          _is_float:1,           // True if in float registers
+         _is_vector:1,          // True if in vector registers
          _was_spilled1:1,       // True if prior spilling on def
          _was_spilled2:1,       // True if twice prior spilling on def
          _is_bound:1,           // live range starts life with no
--- a/src/share/vm/opto/classes.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/classes.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -245,14 +245,12 @@
 macro(XorL)
 macro(Vector)
 macro(AddVB)
-macro(AddVC)
 macro(AddVS)
 macro(AddVI)
 macro(AddVL)
 macro(AddVF)
 macro(AddVD)
 macro(SubVB)
-macro(SubVC)
 macro(SubVS)
 macro(SubVI)
 macro(SubVL)
@@ -263,74 +261,36 @@
 macro(DivVF)
 macro(DivVD)
 macro(LShiftVB)
-macro(LShiftVC)
 macro(LShiftVS)
 macro(LShiftVI)
-macro(URShiftVB)
-macro(URShiftVC)
-macro(URShiftVS)
-macro(URShiftVI)
+macro(RShiftVB)
+macro(RShiftVS)
+macro(RShiftVI)
 macro(AndV)
 macro(OrV)
 macro(XorV)
-macro(VectorLoad)
-macro(Load16B)
-macro(Load8B)
-macro(Load4B)
-macro(Load8C)
-macro(Load4C)
-macro(Load2C)
-macro(Load8S)
-macro(Load4S)
-macro(Load2S)
-macro(Load4I)
-macro(Load2I)
-macro(Load2L)
-macro(Load4F)
-macro(Load2F)
-macro(Load2D)
-macro(VectorStore)
-macro(Store16B)
-macro(Store8B)
-macro(Store4B)
-macro(Store8C)
-macro(Store4C)
-macro(Store2C)
-macro(Store4I)
-macro(Store2I)
-macro(Store2L)
-macro(Store4F)
-macro(Store2F)
-macro(Store2D)
+macro(LoadVector)
+macro(StoreVector)
 macro(Pack)
 macro(PackB)
 macro(PackS)
-macro(PackC)
 macro(PackI)
 macro(PackL)
 macro(PackF)
 macro(PackD)
-macro(Pack2x1B)
-macro(Pack2x2B)
-macro(Replicate16B)
-macro(Replicate8B)
-macro(Replicate4B)
-macro(Replicate8S)
-macro(Replicate4S)
-macro(Replicate2S)
-macro(Replicate8C)
-macro(Replicate4C)
-macro(Replicate2C)
-macro(Replicate4I)
-macro(Replicate2I)
-macro(Replicate2L)
-macro(Replicate4F)
-macro(Replicate2F)
-macro(Replicate2D)
+macro(Pack2L)
+macro(Pack2D)
+macro(ReplicateB)
+macro(ReplicateS)
+macro(ReplicateI)
+macro(ReplicateL)
+macro(ReplicateF)
+macro(ReplicateD)
 macro(Extract)
 macro(ExtractB)
+macro(ExtractUB)
+macro(ExtractC)
 macro(ExtractS)
-macro(ExtractC)
 macro(ExtractI)
 macro(ExtractL)
 macro(ExtractF)
--- a/src/share/vm/opto/compile.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/compile.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -2591,38 +2591,12 @@
     }
     break;
 
-  case Op_Load16B:
-  case Op_Load8B:
-  case Op_Load4B:
-  case Op_Load8S:
-  case Op_Load4S:
-  case Op_Load2S:
-  case Op_Load8C:
-  case Op_Load4C:
-  case Op_Load2C:
-  case Op_Load4I:
-  case Op_Load2I:
-  case Op_Load2L:
-  case Op_Load4F:
-  case Op_Load2F:
-  case Op_Load2D:
-  case Op_Store16B:
-  case Op_Store8B:
-  case Op_Store4B:
-  case Op_Store8C:
-  case Op_Store4C:
-  case Op_Store2C:
-  case Op_Store4I:
-  case Op_Store2I:
-  case Op_Store2L:
-  case Op_Store4F:
-  case Op_Store2F:
-  case Op_Store2D:
+  case Op_LoadVector:
+  case Op_StoreVector:
     break;
 
   case Op_PackB:
   case Op_PackS:
-  case Op_PackC:
   case Op_PackI:
   case Op_PackF:
   case Op_PackL:
--- a/src/share/vm/opto/idealGraphPrinter.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/idealGraphPrinter.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -130,15 +130,15 @@
       } else {
         st.print("%s%d", PrintIdealGraphFile, _file_count);
       }
-      fileStream *stream = new (ResourceObj::C_HEAP) fileStream(st.as_string());
+      fileStream *stream = new (ResourceObj::C_HEAP, mtCompiler) fileStream(st.as_string());
       _output = stream;
     } else {
-      fileStream *stream = new (ResourceObj::C_HEAP) fileStream(PrintIdealGraphFile);
+      fileStream *stream = new (ResourceObj::C_HEAP, mtCompiler) fileStream(PrintIdealGraphFile);
       _output = stream;
     }
     _file_count++;
   } else {
-    _stream = new (ResourceObj::C_HEAP) networkStream();
+    _stream = new (ResourceObj::C_HEAP, mtCompiler) networkStream();
 
     // Try to connect to visualizer
     if (_stream->connect(PrintIdealGraphAddress, PrintIdealGraphPort)) {
@@ -160,7 +160,7 @@
     }
   }
 
-  _xml = new (ResourceObj::C_HEAP) xmlStream(_output);
+  _xml = new (ResourceObj::C_HEAP, mtCompiler) xmlStream(_output);
 
   head(TOP_ELEMENT);
 }
--- a/src/share/vm/opto/ifg.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/ifg.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -416,6 +416,7 @@
     if( lrgs(lidx).mask().is_UP() &&
         lrgs(lidx).mask_size() &&
         !lrgs(lidx)._is_float &&
+        !lrgs(lidx)._is_vector &&
         lrgs(lidx).mask().overlap(*Matcher::idealreg2regmask[Op_RegI]) )
       cnt += lrgs(lidx).reg_pressure();
   }
@@ -430,7 +431,7 @@
   while ((lidx = elements.next()) != 0) {
     if( lrgs(lidx).mask().is_UP() &&
         lrgs(lidx).mask_size() &&
-        lrgs(lidx)._is_float )
+        (lrgs(lidx)._is_float || lrgs(lidx)._is_vector))
       cnt += lrgs(lidx).reg_pressure();
   }
   return cnt;
@@ -439,8 +440,8 @@
 //------------------------------lower_pressure---------------------------------
 // Adjust register pressure down by 1.  Capture last hi-to-low transition,
 static void lower_pressure( LRG *lrg, uint where, Block *b, uint *pressure, uint *hrp_index ) {
-  if( lrg->mask().is_UP() && lrg->mask_size() ) {
-    if( lrg->_is_float ) {
+  if (lrg->mask().is_UP() && lrg->mask_size()) {
+    if (lrg->_is_float || lrg->_is_vector) {
       pressure[1] -= lrg->reg_pressure();
       if( pressure[1] == (uint)FLOATPRESSURE ) {
         hrp_index[1] = where;
@@ -522,8 +523,8 @@
       LRG &lrg = lrgs(lidx);
       lrg._area += cost;
       // Compute initial register pressure
-      if( lrg.mask().is_UP() && lrg.mask_size() ) {
-        if( lrg._is_float ) {   // Count float pressure
+      if (lrg.mask().is_UP() && lrg.mask_size()) {
+        if (lrg._is_float || lrg._is_vector) {   // Count float pressure
           pressure[1] += lrg.reg_pressure();
 #ifdef EXACT_PRESSURE
           if( pressure[1] > b->_freg_pressure )
@@ -681,13 +682,10 @@
         // according to its bindings.
         const RegMask &rmask = lrgs(r).mask();
         if( lrgs(r).is_bound() && !(n->rematerialize()) && rmask.is_NotEmpty() ) {
-          // Smear odd bits; leave only aligned pairs of bits.
-          RegMask r2mask = rmask;
-          r2mask.SmearToPairs();
           // Check for common case
           int r_size = lrgs(r).num_regs();
           OptoReg::Name r_reg = (r_size == 1) ? rmask.find_first_elem() : OptoReg::Physical;
-
+          // Smear odd bits
           IndexSetIterator elements(&liveout);
           uint l;
           while ((l = elements.next()) != 0) {
@@ -701,10 +699,15 @@
             // Remove the bits from LRG 'r' from LRG 'l' so 'l' no
             // longer interferes with 'r'.  If 'l' requires aligned
             // adjacent pairs, subtract out bit pairs.
-            if( lrg.num_regs() == 2 && !lrg._fat_proj ) {
+            assert(!lrg._is_vector || !lrg._fat_proj, "sanity");
+            if (lrg.num_regs() > 1 && !lrg._fat_proj) {
+              RegMask r2mask = rmask;
+              // Leave only aligned set of bits.
+              r2mask.smear_to_sets(lrg.num_regs());
+              // It includes vector case.
               lrg.SUBTRACT( r2mask );
               lrg.compute_set_mask_size();
-            } else if( r_size != 1 ) {
+            } else if( r_size != 1 ) { // fat proj
               lrg.SUBTRACT( rmask );
               lrg.compute_set_mask_size();
             } else {            // Common case: size 1 bound removal
@@ -763,8 +766,8 @@
             // Newly live things assumed live from here to top of block
             lrg._area += cost;
             // Adjust register pressure
-            if( lrg.mask().is_UP() && lrg.mask_size() ) {
-              if( lrg._is_float ) {
+            if (lrg.mask().is_UP() && lrg.mask_size()) {
+              if (lrg._is_float || lrg._is_vector) {
                 pressure[1] += lrg.reg_pressure();
 #ifdef EXACT_PRESSURE
                 if( pressure[1] > b->_freg_pressure )
--- a/src/share/vm/opto/lcm.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/lcm.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -139,6 +139,7 @@
     int iop = mach->ideal_Opcode();
     switch( iop ) {
     case Op_LoadB:
+    case Op_LoadUB:
     case Op_LoadUS:
     case Op_LoadD:
     case Op_LoadF:
@@ -445,6 +446,11 @@
     if( e->is_MachNullCheck() && e->in(1) == n )
       continue;
 
+    // Schedule IV increment last.
+    if (e->is_Mach() && e->as_Mach()->ideal_Opcode() == Op_CountedLoopEnd &&
+        e->in(1)->in(1) == n && n->is_iteratively_computed())
+      continue;
+
     uint n_choice  = 2;
 
     // See if this instruction is consumed by a branch. If so, then (as the
--- a/src/share/vm/opto/library_call.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/library_call.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -160,6 +160,7 @@
   bool inline_trans(vmIntrinsics::ID id);
   bool inline_abs(vmIntrinsics::ID id);
   bool inline_sqrt(vmIntrinsics::ID id);
+  void finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName);
   bool inline_pow(vmIntrinsics::ID id);
   bool inline_exp(vmIntrinsics::ID id);
   bool inline_min_max(vmIntrinsics::ID id);
@@ -1535,40 +1536,79 @@
   return true;
 }
 
+void LibraryCallKit::finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName) {
+  //-------------------
+  //result=(result.isNaN())? funcAddr():result;
+  // Check: If isNaN() by checking result!=result? then either trap
+  // or go to runtime
+  Node* cmpisnan = _gvn.transform(new (C, 3) CmpDNode(result,result));
+  // Build the boolean node
+  Node* bolisnum = _gvn.transform( new (C, 2) BoolNode(cmpisnan, BoolTest::eq) );
+
+  if (!too_many_traps(Deoptimization::Reason_intrinsic)) {
+    {
+      BuildCutout unless(this, bolisnum, PROB_STATIC_FREQUENT);
+      // End the current control-flow path
+      push_pair(x);
+      if (y != NULL) {
+        push_pair(y);
+      }
+      // The pow or exp intrinsic returned a NaN, which requires a call
+      // to the runtime.  Recompile with the runtime call.
+      uncommon_trap(Deoptimization::Reason_intrinsic,
+                    Deoptimization::Action_make_not_entrant);
+    }
+    push_pair(result);
+  } else {
+    // If this inlining ever returned NaN in the past, we compile a call
+    // to the runtime to properly handle corner cases
+
+    IfNode* iff = create_and_xform_if(control(), bolisnum, PROB_STATIC_FREQUENT, COUNT_UNKNOWN);
+    Node* if_slow = _gvn.transform( new (C, 1) IfFalseNode(iff) );
+    Node* if_fast = _gvn.transform( new (C, 1) IfTrueNode(iff) );
+
+    if (!if_slow->is_top()) {
+      RegionNode* result_region = new(C, 3) RegionNode(3);
+      PhiNode*    result_val = new (C, 3) PhiNode(result_region, Type::DOUBLE);
+
+      result_region->init_req(1, if_fast);
+      result_val->init_req(1, result);
+
+      set_control(if_slow);
+
+      const TypePtr* no_memory_effects = NULL;
+      Node* rt = make_runtime_call(RC_LEAF, call_type, funcAddr, funcName,
+                                   no_memory_effects,
+                                   x, top(), y, y ? top() : NULL);
+      Node* value = _gvn.transform(new (C, 1) ProjNode(rt, TypeFunc::Parms+0));
+#ifdef ASSERT
+      Node* value_top = _gvn.transform(new (C, 1) ProjNode(rt, TypeFunc::Parms+1));
+      assert(value_top == top(), "second value must be top");
+#endif
+
+      result_region->init_req(2, control());
+      result_val->init_req(2, value);
+      push_result(result_region, result_val);
+    } else {
+      push_pair(result);
+    }
+  }
+}
+
 //------------------------------inline_exp-------------------------------------
 // Inline exp instructions, if possible.  The Intel hardware only misses
 // really odd corner cases (+/- Infinity).  Just uncommon-trap them.
 bool LibraryCallKit::inline_exp(vmIntrinsics::ID id) {
   assert(id == vmIntrinsics::_dexp, "Not exp");
 
-  // If this inlining ever returned NaN in the past, we do not intrinsify it
-  // every again.  NaN results requires StrictMath.exp handling.
-  if (too_many_traps(Deoptimization::Reason_intrinsic))  return false;
-
   _sp += arg_size();        // restore stack pointer
   Node *x = pop_math_arg();
   Node *result = _gvn.transform(new (C, 2) ExpDNode(0,x));
 
-  //-------------------
-  //result=(result.isNaN())? StrictMath::exp():result;
-  // Check: If isNaN() by checking result!=result? then go to Strict Math
-  Node* cmpisnan = _gvn.transform(new (C, 3) CmpDNode(result,result));
-  // Build the boolean node
-  Node* bolisnum = _gvn.transform( new (C, 2) BoolNode(cmpisnan, BoolTest::eq) );
-
-  { BuildCutout unless(this, bolisnum, PROB_STATIC_FREQUENT);
-    // End the current control-flow path
-    push_pair(x);
-    // Math.exp intrinsic returned a NaN, which requires StrictMath.exp
-    // to handle.  Recompile without intrinsifying Math.exp
-    uncommon_trap(Deoptimization::Reason_intrinsic,
-                  Deoptimization::Action_make_not_entrant);
-  }
+  finish_pow_exp(result, x, NULL, OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dexp), "EXP");
 
   C->set_has_split_ifs(true); // Has chance for split-if optimization
 
-  push_pair(result);
-
   return true;
 }
 
@@ -1577,17 +1617,12 @@
 bool LibraryCallKit::inline_pow(vmIntrinsics::ID id) {
   assert(id == vmIntrinsics::_dpow, "Not pow");
 
-  // If this inlining ever returned NaN in the past, we do not intrinsify it
-  // every again.  NaN results requires StrictMath.pow handling.
-  if (too_many_traps(Deoptimization::Reason_intrinsic))  return false;
-
-  // Do not intrinsify on older platforms which lack cmove.
-  if (ConditionalMoveLimit == 0)  return false;
-
   // Pseudocode for pow
   // if (x <= 0.0) {
-  //   if ((double)((int)y)==y) { // if y is int
-  //     result = ((1&(int)y)==0)?-DPow(abs(x), y):DPow(abs(x), y)
+  //   long longy = (long)y;
+  //   if ((double)longy == y) { // if y is long
+  //     if (y + 1 == y) longy = 0; // huge number: even
+  //     result = ((1&longy) == 0)?-DPow(abs(x), y):DPow(abs(x), y);
   //   } else {
   //     result = NaN;
   //   }
@@ -1595,7 +1630,7 @@
   //   result = DPow(x,y);
   // }
   // if (result != result)?  {
-  //   uncommon_trap();
+  //   result = uncommon_trap() or runtime_call();
   // }
   // return result;
 
@@ -1603,15 +1638,14 @@
   Node* y = pop_math_arg();
   Node* x = pop_math_arg();
 
-  Node *fast_result = _gvn.transform( new (C, 3) PowDNode(0, x, y) );
-
-  // Short form: if not top-level (i.e., Math.pow but inlining Math.pow
-  // inside of something) then skip the fancy tests and just check for
-  // NaN result.
-  Node *result = NULL;
-  if( jvms()->depth() >= 1 ) {
-    result = fast_result;
+  Node* result = NULL;
+
+  if (!too_many_traps(Deoptimization::Reason_intrinsic)) {
+    // Short form: skip the fancy tests and just check for NaN result.
+    result = _gvn.transform( new (C, 3) PowDNode(0, x, y) );
   } else {
+    // If this inlining ever returned NaN in the past, include all
+    // checks + call to the runtime.
 
     // Set the merge point for If node with condition of (x <= 0.0)
     // There are four possible paths to region node and phi node
@@ -1627,55 +1661,95 @@
     Node *bol1 = _gvn.transform( new (C, 2) BoolNode( cmp, BoolTest::le ) );
     // Branch either way
     IfNode *if1 = create_and_xform_if(control(),bol1, PROB_STATIC_INFREQUENT, COUNT_UNKNOWN);
-    Node *opt_test = _gvn.transform(if1);
-    //assert( opt_test->is_If(), "Expect an IfNode");
-    IfNode *opt_if1 = (IfNode*)opt_test;
     // Fast path taken; set region slot 3
-    Node *fast_taken = _gvn.transform( new (C, 1) IfFalseNode(opt_if1) );
+    Node *fast_taken = _gvn.transform( new (C, 1) IfFalseNode(if1) );
     r->init_req(3,fast_taken); // Capture fast-control
 
     // Fast path not-taken, i.e. slow path
-    Node *complex_path = _gvn.transform( new (C, 1) IfTrueNode(opt_if1) );
+    Node *complex_path = _gvn.transform( new (C, 1) IfTrueNode(if1) );
 
     // Set fast path result
-    Node *fast_result = _gvn.transform( new (C, 3) PowDNode(0, y, x) );
+    Node *fast_result = _gvn.transform( new (C, 3) PowDNode(0, x, y) );
     phi->init_req(3, fast_result);
 
     // Complex path
-    // Build the second if node (if y is int)
-    // Node for (int)y
-    Node *inty = _gvn.transform( new (C, 2) ConvD2INode(y));
-    // Node for (double)((int) y)
-    Node *doubleinty= _gvn.transform( new (C, 2) ConvI2DNode(inty));
-    // Check (double)((int) y) : y
-    Node *cmpinty= _gvn.transform(new (C, 3) CmpDNode(doubleinty, y));
-    // Check if (y isn't int) then go to slow path
-
-    Node *bol2 = _gvn.transform( new (C, 2) BoolNode( cmpinty, BoolTest::ne ) );
+    // Build the second if node (if y is long)
+    // Node for (long)y
+    Node *longy = _gvn.transform( new (C, 2) ConvD2LNode(y));
+    // Node for (double)((long) y)
+    Node *doublelongy= _gvn.transform( new (C, 2) ConvL2DNode(longy));
+    // Check (double)((long) y) : y
+    Node *cmplongy= _gvn.transform(new (C, 3) CmpDNode(doublelongy, y));
+    // Check if (y isn't long) then go to slow path
+
+    Node *bol2 = _gvn.transform( new (C, 2) BoolNode( cmplongy, BoolTest::ne ) );
     // Branch either way
     IfNode *if2 = create_and_xform_if(complex_path,bol2, PROB_STATIC_INFREQUENT, COUNT_UNKNOWN);
-    Node *slow_path = opt_iff(r,if2); // Set region path 2
-
-    // Calculate DPow(abs(x), y)*(1 & (int)y)
+    Node* ylong_path = _gvn.transform( new (C, 1) IfFalseNode(if2));
+
+    Node *slow_path = _gvn.transform( new (C, 1) IfTrueNode(if2) );
+
+    // Calculate DPow(abs(x), y)*(1 & (long)y)
     // Node for constant 1
-    Node *conone = intcon(1);
-    // 1& (int)y
-    Node *signnode= _gvn.transform( new (C, 3) AndINode(conone, inty) );
+    Node *conone = longcon(1);
+    // 1& (long)y
+    Node *signnode= _gvn.transform( new (C, 3) AndLNode(conone, longy) );
+
+    // A huge number is always even. Detect a huge number by checking
+    // if y + 1 == y and set integer to be tested for parity to 0.
+    // Required for corner case:
+    // (long)9.223372036854776E18 = max_jlong
+    // (double)(long)9.223372036854776E18 = 9.223372036854776E18
+    // max_jlong is odd but 9.223372036854776E18 is even
+    Node* yplus1 = _gvn.transform( new (C, 3) AddDNode(y, makecon(TypeD::make(1))));
+    Node *cmpyplus1= _gvn.transform(new (C, 3) CmpDNode(yplus1, y));
+    Node *bolyplus1 = _gvn.transform( new (C, 2) BoolNode( cmpyplus1, BoolTest::eq ) );
+    Node* correctedsign = NULL;
+    if (ConditionalMoveLimit != 0) {
+      correctedsign = _gvn.transform( CMoveNode::make(C, NULL, bolyplus1, signnode, longcon(0), TypeLong::LONG));
+    } else {
+      IfNode *ifyplus1 = create_and_xform_if(ylong_path,bolyplus1, PROB_FAIR, COUNT_UNKNOWN);
+      RegionNode *r = new (C, 3) RegionNode(3);
+      Node *phi = new (C, 3) PhiNode(r, TypeLong::LONG);
+      r->init_req(1, _gvn.transform( new (C, 1) IfFalseNode(ifyplus1)));
+      r->init_req(2, _gvn.transform( new (C, 1) IfTrueNode(ifyplus1)));
+      phi->init_req(1, signnode);
+      phi->init_req(2, longcon(0));
+      correctedsign = _gvn.transform(phi);
+      ylong_path = _gvn.transform(r);
+      record_for_igvn(r);
+    }
+
     // zero node
-    Node *conzero = intcon(0);
-    // Check (1&(int)y)==0?
-    Node *cmpeq1 = _gvn.transform(new (C, 3) CmpINode(signnode, conzero));
-    // Check if (1&(int)y)!=0?, if so the result is negative
+    Node *conzero = longcon(0);
+    // Check (1&(long)y)==0?
+    Node *cmpeq1 = _gvn.transform(new (C, 3) CmpLNode(correctedsign, conzero));
+    // Check if (1&(long)y)!=0?, if so the result is negative
     Node *bol3 = _gvn.transform( new (C, 2) BoolNode( cmpeq1, BoolTest::ne ) );
     // abs(x)
     Node *absx=_gvn.transform( new (C, 2) AbsDNode(x));
     // abs(x)^y
-    Node *absxpowy = _gvn.transform( new (C, 3) PowDNode(0, y, absx) );
+    Node *absxpowy = _gvn.transform( new (C, 3) PowDNode(0, absx, y) );
     // -abs(x)^y
     Node *negabsxpowy = _gvn.transform(new (C, 2) NegDNode (absxpowy));
-    // (1&(int)y)==1?-DPow(abs(x), y):DPow(abs(x), y)
-    Node *signresult = _gvn.transform( CMoveNode::make(C, NULL, bol3, absxpowy, negabsxpowy, Type::DOUBLE));
+    // (1&(long)y)==1?-DPow(abs(x), y):DPow(abs(x), y)
+    Node *signresult = NULL;
+    if (ConditionalMoveLimit != 0) {
+      signresult = _gvn.transform( CMoveNode::make(C, NULL, bol3, absxpowy, negabsxpowy, Type::DOUBLE));
+    } else {
+      IfNode *ifyeven = create_and_xform_if(ylong_path,bol3, PROB_FAIR, COUNT_UNKNOWN);
+      RegionNode *r = new (C, 3) RegionNode(3);
+      Node *phi = new (C, 3) PhiNode(r, Type::DOUBLE);
+      r->init_req(1, _gvn.transform( new (C, 1) IfFalseNode(ifyeven)));
+      r->init_req(2, _gvn.transform( new (C, 1) IfTrueNode(ifyeven)));
+      phi->init_req(1, absxpowy);
+      phi->init_req(2, negabsxpowy);
+      signresult = _gvn.transform(phi);
+      ylong_path = _gvn.transform(r);
+      record_for_igvn(r);
+    }
     // Set complex path fast result
+    r->init_req(2, ylong_path);
     phi->init_req(2, signresult);
 
     static const jlong nan_bits = CONST64(0x7ff8000000000000);
@@ -1689,27 +1763,10 @@
     result=_gvn.transform(phi);
   }
 
-  //-------------------
-  //result=(result.isNaN())? uncommon_trap():result;
-  // Check: If isNaN() by checking result!=result? then go to Strict Math
-  Node* cmpisnan = _gvn.transform(new (C, 3) CmpDNode(result,result));
-  // Build the boolean node
-  Node* bolisnum = _gvn.transform( new (C, 2) BoolNode(cmpisnan, BoolTest::eq) );
-
-  { BuildCutout unless(this, bolisnum, PROB_STATIC_FREQUENT);
-    // End the current control-flow path
-    push_pair(x);
-    push_pair(y);
-    // Math.pow intrinsic returned a NaN, which requires StrictMath.pow
-    // to handle.  Recompile without intrinsifying Math.pow.
-    uncommon_trap(Deoptimization::Reason_intrinsic,
-                  Deoptimization::Action_make_not_entrant);
-  }
+  finish_pow_exp(result, x, y, OptoRuntime::Math_DD_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dpow), "POW");
 
   C->set_has_split_ifs(true); // Has chance for split-if optimization
 
-  push_pair(result);
-
   return true;
 }
 
@@ -3592,8 +3649,10 @@
     }
 
     // Bail out if length is negative.
-    // ...Not needed, since the new_array will throw the right exception.
-    //generate_negative_guard(length, bailout, &length);
+    // Without this the new_array would throw
+    // NegativeArraySizeException but IllegalArgumentException is what
+    // should be thrown
+    generate_negative_guard(length, bailout, &length);
 
     if (bailout->req() > 1) {
       PreserveJVMState pjvms(this);
@@ -3617,7 +3676,9 @@
       // Extreme case:  Arrays.copyOf((Integer[])x, 10, String[].class).
       // This will fail a store-check if x contains any non-nulls.
       bool disjoint_bases = true;
-      bool length_never_negative = true;
+      // if start > orig_length then the length of the copy may be
+      // negative.
+      bool length_never_negative = !is_copyOfRange;
       generate_arraycopy(TypeAryPtr::OOPS, T_OBJECT,
                          original, start, newcopy, intcon(0), moved,
                          disjoint_bases, length_never_negative);
--- a/src/share/vm/opto/loopnode.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/loopnode.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -2751,7 +2751,8 @@
         // Do not count uncommon calls
         if( !n->is_CallStaticJava() || !n->as_CallStaticJava()->_name ) {
           Node *iff = n->in(0)->in(0);
-          if( !iff->is_If() ||
+          // No any calls for vectorized loops.
+          if( UseSuperWord || !iff->is_If() ||
               (n->in(0)->Opcode() == Op_IfFalse &&
                (1.0 - iff->as_If()->_prob) >= 0.01) ||
               (iff->as_If()->_prob >= 0.01) )
@@ -3216,7 +3217,8 @@
     case Op_ModF:
     case Op_ModD:
     case Op_LoadB:              // Same with Loads; they can sink
-    case Op_LoadUS:             // during loop optimizations.
+    case Op_LoadUB:             // during loop optimizations.
+    case Op_LoadUS:
     case Op_LoadD:
     case Op_LoadF:
     case Op_LoadI:
--- a/src/share/vm/opto/machnode.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/machnode.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -439,9 +439,9 @@
   // Don't remateralize somebody with bound inputs - it stretches a
   // fixed register lifetime.
   uint idx = oper_input_base();
-  if( req() > idx ) {
+  if (req() > idx) {
     const RegMask &rm = in_RegMask(idx);
-    if( rm.is_bound1() || rm.is_bound2() )
+    if (rm.is_bound(ideal_reg()))
       return false;
   }
 
--- a/src/share/vm/opto/machnode.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/machnode.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -319,6 +319,7 @@
 class MachTypeNode : public MachNode {
   virtual uint size_of() const { return sizeof(*this); } // Size is bigger
 public:
+  MachTypeNode( ) {}
   const Type *_bottom_type;
 
   virtual const class Type *bottom_type() const { return _bottom_type; }
@@ -370,12 +371,12 @@
 
 //------------------------------MachConstantNode-------------------------------
 // Machine node that holds a constant which is stored in the constant table.
-class MachConstantNode : public MachNode {
+class MachConstantNode : public MachTypeNode {
 protected:
   Compile::Constant _constant;  // This node's constant.
 
 public:
-  MachConstantNode() : MachNode() {
+  MachConstantNode() : MachTypeNode() {
     init_class_id(Class_MachConstant);
   }
 
--- a/src/share/vm/opto/macro.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/macro.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -409,7 +409,7 @@
   Node *alloc_mem = alloc->in(TypeFunc::Memory);
 
   uint length = mem->req();
-  GrowableArray <Node *> values(length, length, NULL);
+  GrowableArray <Node *> values(length, length, NULL, false);
 
   // create a new Phi for the value
   PhiNode *phi = new (C, length) PhiNode(mem->in(0), phi_type, NULL, instance_id, alias_idx, offset);
--- a/src/share/vm/opto/matcher.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/matcher.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -35,6 +35,7 @@
 #include "opto/rootnode.hpp"
 #include "opto/runtime.hpp"
 #include "opto/type.hpp"
+#include "opto/vectornode.hpp"
 #include "runtime/atomic.hpp"
 #include "runtime/os.hpp"
 #ifdef TARGET_ARCH_MODEL_x86_32
@@ -58,18 +59,6 @@
 
 OptoReg::Name OptoReg::c_frame_pointer;
 
-
-
-const int Matcher::base2reg[Type::lastype] = {
-  Node::NotAMachineReg,0,0, Op_RegI, Op_RegL, 0, Op_RegN,
-  Node::NotAMachineReg, Node::NotAMachineReg, /* tuple, array */
-  Op_RegP, Op_RegP, Op_RegP, Op_RegP, Op_RegP, Op_RegP, /* the pointers */
-  0, 0/*abio*/,
-  Op_RegP /* Return address */, 0, /* the memories */
-  Op_RegF, Op_RegF, Op_RegF, Op_RegD, Op_RegD, Op_RegD,
-  0  /*bottom*/
-};
-
 const RegMask *Matcher::idealreg2regmask[_last_machine_leaf];
 RegMask Matcher::mreg2regmask[_last_Mach_Reg];
 RegMask Matcher::STACK_ONLY_mask;
@@ -107,6 +96,10 @@
   idealreg2spillmask  [Op_RegF] = NULL;
   idealreg2spillmask  [Op_RegD] = NULL;
   idealreg2spillmask  [Op_RegP] = NULL;
+  idealreg2spillmask  [Op_VecS] = NULL;
+  idealreg2spillmask  [Op_VecD] = NULL;
+  idealreg2spillmask  [Op_VecX] = NULL;
+  idealreg2spillmask  [Op_VecY] = NULL;
 
   idealreg2debugmask  [Op_RegI] = NULL;
   idealreg2debugmask  [Op_RegN] = NULL;
@@ -114,6 +107,10 @@
   idealreg2debugmask  [Op_RegF] = NULL;
   idealreg2debugmask  [Op_RegD] = NULL;
   idealreg2debugmask  [Op_RegP] = NULL;
+  idealreg2debugmask  [Op_VecS] = NULL;
+  idealreg2debugmask  [Op_VecD] = NULL;
+  idealreg2debugmask  [Op_VecX] = NULL;
+  idealreg2debugmask  [Op_VecY] = NULL;
 
   idealreg2mhdebugmask[Op_RegI] = NULL;
   idealreg2mhdebugmask[Op_RegN] = NULL;
@@ -121,6 +118,10 @@
   idealreg2mhdebugmask[Op_RegF] = NULL;
   idealreg2mhdebugmask[Op_RegD] = NULL;
   idealreg2mhdebugmask[Op_RegP] = NULL;
+  idealreg2mhdebugmask[Op_VecS] = NULL;
+  idealreg2mhdebugmask[Op_VecD] = NULL;
+  idealreg2mhdebugmask[Op_VecX] = NULL;
+  idealreg2mhdebugmask[Op_VecY] = NULL;
 
   debug_only(_mem_node = NULL;)   // Ideal memory node consumed by mach node
 }
@@ -134,7 +135,7 @@
     warped = OptoReg::add(warped, C->out_preserve_stack_slots());
     if( warped >= _in_arg_limit )
       _in_arg_limit = OptoReg::add(warped, 1); // Bump max stack slot seen
-    if (!RegMask::can_represent(warped)) {
+    if (!RegMask::can_represent_arg(warped)) {
       // the compiler cannot represent this method's calling sequence
       C->record_method_not_compilable_all_tiers("unsupported incoming calling sequence");
       return OptoReg::Bad;
@@ -302,7 +303,7 @@
   _out_arg_limit = OptoReg::add(_new_SP, C->out_preserve_stack_slots());
   assert( is_even(_out_arg_limit), "out_preserve must be even" );
 
-  if (!RegMask::can_represent(OptoReg::add(_out_arg_limit,-1))) {
+  if (!RegMask::can_represent_arg(OptoReg::add(_out_arg_limit,-1))) {
     // the compiler cannot represent this method's calling sequence
     C->record_method_not_compilable("must be able to represent all call arguments in reg mask");
   }
@@ -428,7 +429,7 @@
 void Matcher::init_first_stack_mask() {
 
   // Allocate storage for spill masks as masks for the appropriate load type.
-  RegMask *rms = (RegMask*)C->comp_arena()->Amalloc_D(sizeof(RegMask) * 3*6);
+  RegMask *rms = (RegMask*)C->comp_arena()->Amalloc_D(sizeof(RegMask) * (3*6+4));
 
   idealreg2spillmask  [Op_RegN] = &rms[0];
   idealreg2spillmask  [Op_RegI] = &rms[1];
@@ -451,6 +452,11 @@
   idealreg2mhdebugmask[Op_RegD] = &rms[16];
   idealreg2mhdebugmask[Op_RegP] = &rms[17];
 
+  idealreg2spillmask  [Op_VecS] = &rms[18];
+  idealreg2spillmask  [Op_VecD] = &rms[19];
+  idealreg2spillmask  [Op_VecX] = &rms[20];
+  idealreg2spillmask  [Op_VecY] = &rms[21];
+
   OptoReg::Name i;
 
   // At first, start with the empty mask
@@ -462,7 +468,7 @@
     C->FIRST_STACK_mask().Insert(i);
 
   // Add in all bits past the outgoing argument area
-  guarantee(RegMask::can_represent(OptoReg::add(_out_arg_limit,-1)),
+  guarantee(RegMask::can_represent_arg(OptoReg::add(_out_arg_limit,-1)),
             "must be able to represent all call arguments in reg mask");
   init = _out_arg_limit;
   for (i = init; RegMask::can_represent(i); i = OptoReg::add(i,1))
@@ -472,21 +478,48 @@
   C->FIRST_STACK_mask().set_AllStack();
 
   // Make spill masks.  Registers for their class, plus FIRST_STACK_mask.
+  RegMask aligned_stack_mask = C->FIRST_STACK_mask();
+  // Keep spill masks aligned.
+  aligned_stack_mask.clear_to_pairs();
+  assert(aligned_stack_mask.is_AllStack(), "should be infinite stack");
+
+  *idealreg2spillmask[Op_RegP] = *idealreg2regmask[Op_RegP];
 #ifdef _LP64
   *idealreg2spillmask[Op_RegN] = *idealreg2regmask[Op_RegN];
    idealreg2spillmask[Op_RegN]->OR(C->FIRST_STACK_mask());
+   idealreg2spillmask[Op_RegP]->OR(aligned_stack_mask);
+#else
+   idealreg2spillmask[Op_RegP]->OR(C->FIRST_STACK_mask());
 #endif
   *idealreg2spillmask[Op_RegI] = *idealreg2regmask[Op_RegI];
    idealreg2spillmask[Op_RegI]->OR(C->FIRST_STACK_mask());
   *idealreg2spillmask[Op_RegL] = *idealreg2regmask[Op_RegL];
-   idealreg2spillmask[Op_RegL]->OR(C->FIRST_STACK_mask());
+   idealreg2spillmask[Op_RegL]->OR(aligned_stack_mask);
   *idealreg2spillmask[Op_RegF] = *idealreg2regmask[Op_RegF];
    idealreg2spillmask[Op_RegF]->OR(C->FIRST_STACK_mask());
   *idealreg2spillmask[Op_RegD] = *idealreg2regmask[Op_RegD];
-   idealreg2spillmask[Op_RegD]->OR(C->FIRST_STACK_mask());
-  *idealreg2spillmask[Op_RegP] = *idealreg2regmask[Op_RegP];
-   idealreg2spillmask[Op_RegP]->OR(C->FIRST_STACK_mask());
+   idealreg2spillmask[Op_RegD]->OR(aligned_stack_mask);
 
+  if (Matcher::vector_size_supported(T_BYTE,4)) {
+    *idealreg2spillmask[Op_VecS] = *idealreg2regmask[Op_VecS];
+     idealreg2spillmask[Op_VecS]->OR(C->FIRST_STACK_mask());
+  }
+  if (Matcher::vector_size_supported(T_FLOAT,2)) {
+    *idealreg2spillmask[Op_VecD] = *idealreg2regmask[Op_VecD];
+     idealreg2spillmask[Op_VecD]->OR(aligned_stack_mask);
+  }
+  if (Matcher::vector_size_supported(T_FLOAT,4)) {
+     aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecX);
+     assert(aligned_stack_mask.is_AllStack(), "should be infinite stack");
+    *idealreg2spillmask[Op_VecX] = *idealreg2regmask[Op_VecX];
+     idealreg2spillmask[Op_VecX]->OR(aligned_stack_mask);
+  }
+  if (Matcher::vector_size_supported(T_FLOAT,8)) {
+     aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecY);
+     assert(aligned_stack_mask.is_AllStack(), "should be infinite stack");
+    *idealreg2spillmask[Op_VecY] = *idealreg2regmask[Op_VecY];
+     idealreg2spillmask[Op_VecY]->OR(aligned_stack_mask);
+  }
    if (UseFPUForSpilling) {
      // This mask logic assumes that the spill operations are
      // symmetric and that the registers involved are the same size.
@@ -807,6 +840,25 @@
   idealreg2regmask[Op_RegF] = &spillF->out_RegMask();
   idealreg2regmask[Op_RegD] = &spillD->out_RegMask();
   idealreg2regmask[Op_RegP] = &spillP->out_RegMask();
+
+  // Vector regmasks.
+  if (Matcher::vector_size_supported(T_BYTE,4)) {
+    TypeVect::VECTS = TypeVect::make(T_BYTE, 4);
+    MachNode *spillVectS = match_tree(new (C, 3) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTS));
+    idealreg2regmask[Op_VecS] = &spillVectS->out_RegMask();
+  }
+  if (Matcher::vector_size_supported(T_FLOAT,2)) {
+    MachNode *spillVectD = match_tree(new (C, 3) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTD));
+    idealreg2regmask[Op_VecD] = &spillVectD->out_RegMask();
+  }
+  if (Matcher::vector_size_supported(T_FLOAT,4)) {
+    MachNode *spillVectX = match_tree(new (C, 3) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTX));
+    idealreg2regmask[Op_VecX] = &spillVectX->out_RegMask();
+  }
+  if (Matcher::vector_size_supported(T_FLOAT,8)) {
+    MachNode *spillVectY = match_tree(new (C, 3) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTY));
+    idealreg2regmask[Op_VecY] = &spillVectY->out_RegMask();
+  }
 }
 
 #ifdef ASSERT
@@ -1063,7 +1115,7 @@
     // that is killed by the call.
     if( warped >= out_arg_limit_per_call )
       out_arg_limit_per_call = OptoReg::add(warped,1);
-    if (!RegMask::can_represent(warped)) {
+    if (!RegMask::can_represent_arg(warped)) {
       C->record_method_not_compilable_all_tiers("unsupported calling sequence");
       return OptoReg::Bad;
     }
@@ -1251,7 +1303,7 @@
     // this killed area.
     uint r_cnt = mcall->tf()->range()->cnt();
     MachProjNode *proj = new (C, 1) MachProjNode( mcall, r_cnt+10000, RegMask::Empty, MachProjNode::fat_proj );
-    if (!RegMask::can_represent(OptoReg::Name(out_arg_limit_per_call-1))) {
+    if (!RegMask::can_represent_arg(OptoReg::Name(out_arg_limit_per_call-1))) {
       C->record_method_not_compilable_all_tiers("unsupported outgoing calling sequence");
     } else {
       for (int i = begin_out_arg_area; i < out_arg_limit_per_call; i++)
--- a/src/share/vm/opto/matcher.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/matcher.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -250,10 +250,21 @@
   static const bool convL2FSupported(void);
 
   // Vector width in bytes
-  static const uint vector_width_in_bytes(void);
+  static const int vector_width_in_bytes(BasicType bt);
+
+  // Limits on vector size (number of elements).
+  static const int max_vector_size(const BasicType bt);
+  static const int min_vector_size(const BasicType bt);
+  static const bool vector_size_supported(const BasicType bt, int size) {
+    return (Matcher::max_vector_size(bt) >= size &&
+            Matcher::min_vector_size(bt) <= size);
+  }
 
   // Vector ideal reg
-  static const uint vector_ideal_reg(void);
+  static const int vector_ideal_reg(int len);
+
+  // CPU supports misaligned vectors store/load.
+  static const bool misaligned_vectors_ok();
 
   // Used to determine a "low complexity" 64-bit constant.  (Zero is simple.)
   // The standard of comparison is one (StoreL ConL) vs. two (StoreI ConI).
--- a/src/share/vm/opto/memnode.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/memnode.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -1543,6 +1543,7 @@
     // had an original form like p1:(AddP x x (LShiftL quux 3)), where the
     // expression (LShiftL quux 3) independently optimized to the constant 8.
     if ((t->isa_int() == NULL) && (t->isa_long() == NULL)
+        && (_type->isa_vect() == NULL)
         && Opcode() != Op_LoadKlass && Opcode() != Op_LoadNKlass) {
       // t might actually be lower than _type, if _type is a unique
       // concrete subclass of abstract class t.
--- a/src/share/vm/opto/mulnode.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/mulnode.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -41,7 +41,9 @@
 class MulNode : public Node {
   virtual uint hash() const;
 public:
-  MulNode( Node *in1, Node *in2 ): Node(0,in1,in2) {}
+  MulNode( Node *in1, Node *in2 ): Node(0,in1,in2) {
+    init_class_id(Class_Mul);
+  }
 
   // Handle algebraic identities here.  If we have an identity, return the Node
   // we are equivalent to.  We look for "add of zero" as an identity.
--- a/src/share/vm/opto/node.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/node.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -1576,6 +1576,9 @@
     } else {
       tty->print("no type");
     }
+  } else if (t->isa_vect() && this->is_MachSpillCopy()) {
+    // Dump MachSpillcopy vector type.
+    t->dump();
   }
   if (is_new) {
     debug_only(dump_orig(debug_orig()));
--- a/src/share/vm/opto/node.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/node.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -100,6 +100,7 @@
 class MemBarStoreStoreNode;
 class MemNode;
 class MergeMemNode;
+class MulNode;
 class MultiNode;
 class MultiBranchNode;
 class NeverBranchNode;
@@ -133,8 +134,8 @@
 class TypeNode;
 class UnlockNode;
 class VectorNode;
-class VectorLoadNode;
-class VectorStoreNode;
+class LoadVectorNode;
+class StoreVectorNode;
 class VectorSet;
 typedef void (*NFunc)(Node&,void*);
 extern "C" {
@@ -609,9 +610,9 @@
 
     DEFINE_CLASS_ID(Mem,   Node, 4)
       DEFINE_CLASS_ID(Load,  Mem, 0)
-        DEFINE_CLASS_ID(VectorLoad,  Load, 0)
+        DEFINE_CLASS_ID(LoadVector,  Load, 0)
       DEFINE_CLASS_ID(Store, Mem, 1)
-        DEFINE_CLASS_ID(VectorStore, Store, 0)
+        DEFINE_CLASS_ID(StoreVector, Store, 0)
       DEFINE_CLASS_ID(LoadStore, Mem, 2)
 
     DEFINE_CLASS_ID(Region, Node, 5)
@@ -629,8 +630,9 @@
     DEFINE_CLASS_ID(AddP,     Node, 9)
     DEFINE_CLASS_ID(BoxLock,  Node, 10)
     DEFINE_CLASS_ID(Add,      Node, 11)
-    DEFINE_CLASS_ID(Vector,   Node, 12)
-    DEFINE_CLASS_ID(ClearArray, Node, 13)
+    DEFINE_CLASS_ID(Mul,      Node, 12)
+    DEFINE_CLASS_ID(Vector,   Node, 13)
+    DEFINE_CLASS_ID(ClearArray, Node, 14)
 
     _max_classes  = ClassMask_ClearArray
   };
@@ -752,6 +754,7 @@
   DEFINE_CLASS_QUERY(MemBar)
   DEFINE_CLASS_QUERY(MemBarStoreStore)
   DEFINE_CLASS_QUERY(MergeMem)
+  DEFINE_CLASS_QUERY(Mul)
   DEFINE_CLASS_QUERY(Multi)
   DEFINE_CLASS_QUERY(MultiBranch)
   DEFINE_CLASS_QUERY(Parm)
@@ -767,8 +770,8 @@
   DEFINE_CLASS_QUERY(Sub)
   DEFINE_CLASS_QUERY(Type)
   DEFINE_CLASS_QUERY(Vector)
-  DEFINE_CLASS_QUERY(VectorLoad)
-  DEFINE_CLASS_QUERY(VectorStore)
+  DEFINE_CLASS_QUERY(LoadVector)
+  DEFINE_CLASS_QUERY(StoreVector)
   DEFINE_CLASS_QUERY(Unlock)
 
   #undef DEFINE_CLASS_QUERY
--- a/src/share/vm/opto/opcodes.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/opcodes.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -38,6 +38,10 @@
   "RegD",
   "RegL",
   "RegFlags",
+  "VecS",
+  "VecD",
+  "VecX",
+  "VecY",
   "_last_machine_leaf",
 #include "classes.hpp"
   "_last_class_name",
--- a/src/share/vm/opto/opcodes.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/opcodes.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -36,6 +36,10 @@
   macro(RegF)                   // Machine float   register
   macro(RegD)                   // Machine double  register
   macro(RegL)                   // Machine long    register
+  macro(VecS)                   // Machine vectors register
+  macro(VecD)                   // Machine vectord register
+  macro(VecX)                   // Machine vectorx register
+  macro(VecY)                   // Machine vectory register
   macro(RegFlags)               // Machine flags   register
   _last_machine_leaf,           // Split between regular opcodes and machine
 #include "classes.hpp"
--- a/src/share/vm/opto/parse2.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/parse2.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1278,9 +1278,9 @@
        // or the narrowOop equivalent.
        const Type* obj_type = _gvn.type(obj);
        const TypeOopPtr* tboth = obj_type->join(con_type)->isa_oopptr();
-       if (tboth != NULL && tboth != obj_type && tboth->higher_equal(obj_type)) {
+       if (tboth != NULL && tboth->klass_is_exact() && tboth != obj_type &&
+           tboth->higher_equal(obj_type)) {
           // obj has to be of the exact type Foo if the CmpP succeeds.
-          assert(tboth->klass_is_exact(), "klass should be exact");
           int obj_in_map = map()->find_edge(obj);
           JVMState* jvms = this->jvms();
           if (obj_in_map >= 0 &&
--- a/src/share/vm/opto/phaseX.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/phaseX.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -757,6 +757,7 @@
 //------------------------------PhaseIterGVN-----------------------------------
 // Initialize hash table to fresh and clean for +VerifyOpto
 PhaseIterGVN::PhaseIterGVN( PhaseIterGVN *igvn, const char *dummy ) : PhaseGVN(igvn,dummy), _worklist( ),
+                                                                      _stack(C->unique() >> 1),
                                                                       _delay_transform(false) {
 }
 
@@ -764,6 +765,7 @@
 // Initialize with previous PhaseIterGVN info; used by PhaseCCP
 PhaseIterGVN::PhaseIterGVN( PhaseIterGVN *igvn ) : PhaseGVN(igvn),
                                                    _worklist( igvn->_worklist ),
+                                                   _stack( igvn->_stack ),
                                                    _delay_transform(igvn->_delay_transform)
 {
 }
@@ -772,6 +774,7 @@
 // Initialize with previous PhaseGVN info from Parser
 PhaseIterGVN::PhaseIterGVN( PhaseGVN *gvn ) : PhaseGVN(gvn),
                                               _worklist(*C->for_igvn()),
+                                              _stack(C->unique() >> 1),
                                               _delay_transform(false)
 {
   uint max;
@@ -1138,51 +1141,77 @@
 // Kill a globally dead Node.  All uses are also globally dead and are
 // aggressively trimmed.
 void PhaseIterGVN::remove_globally_dead_node( Node *dead ) {
-  assert(dead != C->root(), "killing root, eh?");
-  if (dead->is_top())  return;
-  NOT_PRODUCT( set_progress(); )
-  // Remove from iterative worklist
-  _worklist.remove(dead);
-  if (!dead->is_Con()) { // Don't kill cons but uses
-    // Remove from hash table
-    _table.hash_delete( dead );
-    // Smash all inputs to 'dead', isolating him completely
-    for( uint i = 0; i < dead->req(); i++ ) {
-      Node *in = dead->in(i);
-      if( in ) {                 // Points to something?
-        dead->set_req(i,NULL);  // Kill the edge
-        if (in->outcnt() == 0 && in != C->top()) {// Made input go dead?
-          remove_dead_node(in); // Recursively remove
-        } else if (in->outcnt() == 1 &&
-                   in->has_special_unique_user()) {
-          _worklist.push(in->unique_out());
-        } else if (in->outcnt() <= 2 && dead->is_Phi()) {
-          if( in->Opcode() == Op_Region )
-            _worklist.push(in);
-          else if( in->is_Store() ) {
-            DUIterator_Fast imax, i = in->fast_outs(imax);
-            _worklist.push(in->fast_out(i));
-            i++;
-            if(in->outcnt() == 2) {
-              _worklist.push(in->fast_out(i));
-              i++;
+  enum DeleteProgress {
+    PROCESS_INPUTS,
+    PROCESS_OUTPUTS
+  };
+  assert(_stack.is_empty(), "not empty");
+  _stack.push(dead, PROCESS_INPUTS);
+
+  while (_stack.is_nonempty()) {
+    dead = _stack.node();
+    uint progress_state = _stack.index();
+    assert(dead != C->root(), "killing root, eh?");
+    assert(!dead->is_top(), "add check for top when pushing");
+    NOT_PRODUCT( set_progress(); )
+    if (progress_state == PROCESS_INPUTS) {
+      // After following inputs, continue to outputs
+      _stack.set_index(PROCESS_OUTPUTS);
+      // Remove from iterative worklist
+      _worklist.remove(dead);
+      if (!dead->is_Con()) { // Don't kill cons but uses
+        bool recurse = false;
+        // Remove from hash table
+        _table.hash_delete( dead );
+        // Smash all inputs to 'dead', isolating him completely
+        for( uint i = 0; i < dead->req(); i++ ) {
+          Node *in = dead->in(i);
+          if( in ) {                 // Points to something?
+            dead->set_req(i,NULL);  // Kill the edge
+            if (in->outcnt() == 0 && in != C->top()) {// Made input go dead?
+              _stack.push(in, PROCESS_INPUTS); // Recursively remove
+              recurse = true;
+            } else if (in->outcnt() == 1 &&
+                       in->has_special_unique_user()) {
+              _worklist.push(in->unique_out());
+            } else if (in->outcnt() <= 2 && dead->is_Phi()) {
+              if( in->Opcode() == Op_Region )
+                _worklist.push(in);
+              else if( in->is_Store() ) {
+                DUIterator_Fast imax, i = in->fast_outs(imax);
+                _worklist.push(in->fast_out(i));
+                i++;
+                if(in->outcnt() == 2) {
+                  _worklist.push(in->fast_out(i));
+                  i++;
+                }
+                assert(!(i < imax), "sanity");
+              }
             }
-            assert(!(i < imax), "sanity");
           }
         }
+
+        if (dead->is_macro()) {
+          C->remove_macro_node(dead);
+        }
+
+        if (recurse) {
+          continue;
+        }
       }
     }
 
-    if (dead->is_macro()) {
-      C->remove_macro_node(dead);
+    // Aggressively kill globally dead uses
+    // (Rather than pushing all the outs at once, we push one at a time,
+    // plus the parent to resume later, because of the indefinite number
+    // of edge deletions per loop trip.)
+    if (dead->outcnt() > 0) {
+      // Recursively remove
+      _stack.push(dead->raw_out(0), PROCESS_INPUTS);
+    } else {
+      _stack.pop();
     }
   }
-  // Aggressively kill globally dead uses
-  // (Cannot use DUIterator_Last because of the indefinite number
-  // of edge deletions per loop trip.)
-  while (dead->outcnt() > 0) {
-    remove_globally_dead_node(dead->raw_out(0));
-  }
 }
 
 //------------------------------subsume_node-----------------------------------
--- a/src/share/vm/opto/phaseX.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/phaseX.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -403,6 +403,8 @@
   // Subsume users of node 'old' into node 'nn'
   void subsume_node( Node *old, Node *nn );
 
+  Node_Stack _stack;      // Stack used to avoid recursion
+
 protected:
 
   // Idealize new Node 'n' with respect to its inputs and its value
@@ -438,8 +440,8 @@
   // It is significant only for debugging and profiling.
   Node* register_new_node_with_optimizer(Node* n, Node* orig = NULL);
 
-  // Kill a globally dead Node.   It is allowed to have uses which are
-  // assumed dead and left 'in limbo'.
+  // Kill a globally dead Node.  All uses are also globally dead and are
+  // aggressively trimmed.
   void remove_globally_dead_node( Node *dead );
 
   // Kill all inputs to a dead node, recursively making more dead nodes.
--- a/src/share/vm/opto/postaloc.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/postaloc.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -27,13 +27,15 @@
 #include "opto/chaitin.hpp"
 #include "opto/machnode.hpp"
 
-// see if this register kind does not requires two registers
-static bool is_single_register(uint x) {
-#ifdef _LP64
-  return (x != Op_RegD && x != Op_RegL && x != Op_RegP);
-#else
-  return (x != Op_RegD && x != Op_RegL);
-#endif
+// See if this register (or pairs, or vector) already contains the value.
+static bool register_contains_value(Node* val, OptoReg::Name reg, int n_regs,
+                                    Node_List& value) {
+  for (int i = 0; i < n_regs; i++) {
+    OptoReg::Name nreg = OptoReg::add(reg,-i);
+    if (value[nreg] != val)
+      return false;
+  }
+  return true;
 }
 
 //---------------------------may_be_copy_of_callee-----------------------------
@@ -167,9 +169,11 @@
   const RegMask &use_mask = n->in_RegMask(idx);
   bool can_use = ( RegMask::can_represent(def_reg) ? (use_mask.Member(def_reg) != 0)
                                                    : (use_mask.is_AllStack() != 0));
-  // Check for a copy to or from a misaligned pair.
-  can_use = can_use && !use_mask.is_misaligned_Pair() && !def_lrg.mask().is_misaligned_Pair();
-
+  if (!RegMask::is_vector(def->ideal_reg())) {
+    // Check for a copy to or from a misaligned pair.
+    // It is workaround for a sparc with misaligned pairs.
+    can_use = can_use && !use_mask.is_misaligned_pair() && !def_lrg.mask().is_misaligned_pair();
+  }
   if (!can_use)
     return 0;
 
@@ -263,18 +267,16 @@
     val = skip_copies(n->in(k));
   }
 
-  if( val == x ) return blk_adjust; // No progress?
+  if (val == x) return blk_adjust; // No progress?
 
-  bool single = is_single_register(val->ideal_reg());
+  int n_regs = RegMask::num_registers(val->ideal_reg());
   uint val_idx = n2lidx(val);
   OptoReg::Name val_reg = lrgs(val_idx).reg();
 
   // See if it happens to already be in the correct register!
   // (either Phi's direct register, or the common case of the name
   // never-clobbered original-def register)
-  if( value[val_reg] == val &&
-      // Doubles check both halves
-      ( single || value[val_reg-1] == val ) ) {
+  if (register_contains_value(val, val_reg, n_regs, value)) {
     blk_adjust += use_prior_register(n,k,regnd[val_reg],current_block,value,regnd);
     if( n->in(k) == regnd[val_reg] ) // Success!  Quit trying
       return blk_adjust;
@@ -306,9 +308,10 @@
     }
 
     Node *vv = value[reg];
-    if( !single ) {             // Doubles check for aligned-adjacent pair
-      if( (reg&1)==0 ) continue;  // Wrong half of a pair
-      if( vv != value[reg-1] ) continue; // Not a complete pair
+    if (n_regs > 1) { // Doubles and vectors check for aligned-adjacent set
+      uint last = (n_regs-1); // Looking for the last part of a set
+      if ((reg&last) != last) continue; // Wrong part of a set
+      if (!register_contains_value(vv, reg, n_regs, value)) continue; // Different value
     }
     if( vv == val ||            // Got a direct hit?
         (t && vv && vv->bottom_type() == t && vv->is_Mach() &&
@@ -526,8 +529,9 @@
       if( pidx ) {
         value.map(preg,phi);
         regnd.map(preg,phi);
-        OptoReg::Name preg_lo = OptoReg::add(preg,-1);
-        if( !is_single_register(phi->ideal_reg()) ) {
+        int n_regs = RegMask::num_registers(phi->ideal_reg());
+        for (int l = 1; l < n_regs; l++) {
+          OptoReg::Name preg_lo = OptoReg::add(preg,-l);
           value.map(preg_lo,phi);
           regnd.map(preg_lo,phi);
         }
@@ -568,13 +572,16 @@
             value.map(ureg,valdef); // record improved reaching-def info
             regnd.map(ureg,   def);
             // Record other half of doubles
-            OptoReg::Name ureg_lo = OptoReg::add(ureg,-1);
-            if( !is_single_register(def->ideal_reg()) &&
-                ( !RegMask::can_represent(ureg_lo) ||
-                  lrgs(useidx).mask().Member(ureg_lo) ) && // Nearly always adjacent
-                !value[ureg_lo] ) {
-              value.map(ureg_lo,valdef); // record improved reaching-def info
-              regnd.map(ureg_lo,   def);
+            uint def_ideal_reg = def->ideal_reg();
+            int n_regs = RegMask::num_registers(def_ideal_reg);
+            for (int l = 1; l < n_regs; l++) {
+              OptoReg::Name ureg_lo = OptoReg::add(ureg,-l);
+              if (!value[ureg_lo] &&
+                  (!RegMask::can_represent(ureg_lo) ||
+                   lrgs(useidx).mask().Member(ureg_lo))) { // Nearly always adjacent
+                value.map(ureg_lo,valdef); // record improved reaching-def info
+                regnd.map(ureg_lo,   def);
+              }
             }
           }
         }
@@ -607,7 +614,8 @@
       }
 
       uint n_ideal_reg = n->ideal_reg();
-      if( is_single_register(n_ideal_reg) ) {
+      int n_regs = RegMask::num_registers(n_ideal_reg);
+      if (n_regs == 1) {
         // If Node 'n' does not change the value mapped by the register,
         // then 'n' is a useless copy.  Do not update the register->node
         // mapping so 'n' will go dead.
@@ -625,6 +633,25 @@
           assert( n->is_Copy(), "" );
           j -= replace_and_yank_if_dead(n, nreg, b, value, regnd);
         }
+      } else if (RegMask::is_vector(n_ideal_reg)) {
+        // If Node 'n' does not change the value mapped by the register,
+        // then 'n' is a useless copy.  Do not update the register->node
+        // mapping so 'n' will go dead.
+        if (!register_contains_value(val, nreg, n_regs, value)) {
+          // Update the mapping: record new Node defined by the register
+          regnd.map(nreg,n);
+          // Update mapping for defined *value*, which is the defined
+          // Node after skipping all copies.
+          value.map(nreg,val);
+          for (int l = 1; l < n_regs; l++) {
+            OptoReg::Name nreg_lo = OptoReg::add(nreg,-l);
+            regnd.map(nreg_lo, n );
+            value.map(nreg_lo,val);
+          }
+        } else if (n->is_Copy()) {
+          // Note: vector can't be constant and can't be copy of calee.
+          j -= replace_and_yank_if_dead(n, nreg, b, value, regnd);
+        }
       } else {
         // If the value occupies a register pair, record same info
         // in both registers.
--- a/src/share/vm/opto/reg_split.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/reg_split.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -74,12 +74,13 @@
   const RegMask *w_i_mask = w_mask->overlap( *i_mask ) ? w_mask : i_mask;
   const RegMask *w_o_mask;
 
+  int num_regs = RegMask::num_registers(ireg);
+  bool is_vect = RegMask::is_vector(ireg);
   if( w_mask->overlap( *o_mask ) && // Overlap AND
-      ((ireg != Op_RegL && ireg != Op_RegD // Single use or aligned
-#ifdef _LP64
-        && ireg != Op_RegP
-#endif
-         ) || o_mask->is_aligned_Pairs()) ) {
+      ((num_regs == 1) // Single use or aligned
+        ||  is_vect    // or vector
+        || !is_vect && o_mask->is_aligned_pairs()) ) {
+    assert(!is_vect || o_mask->is_aligned_sets(num_regs), "vectors are aligned");
     // Don't come here for mis-aligned doubles
     w_o_mask = w_mask;
   } else {                      // wide ideal mask does not overlap with o_mask
@@ -400,15 +401,17 @@
   // CNC - Turned off 7/8/99, causes too much spilling
   // if( lrg->_is_bound ) return false;
 
+  // Use float pressure numbers for vectors.
+  bool is_float_or_vector = lrg->_is_float || lrg->_is_vector;
   // Not yet reached the high-pressure cutoff point, so low pressure
-  uint hrp_idx = lrg->_is_float ? b->_fhrp_index : b->_ihrp_index;
+  uint hrp_idx = is_float_or_vector ? b->_fhrp_index : b->_ihrp_index;
   if( insidx < hrp_idx ) return false;
   // Register pressure for the block as a whole depends on reg class
-  int block_pres = lrg->_is_float ? b->_freg_pressure : b->_reg_pressure;
+  int block_pres = is_float_or_vector ? b->_freg_pressure : b->_reg_pressure;
   // Bound live ranges will split at the binding points first;
   // Intermediate splits should assume the live range's register set
   // got "freed up" and that num_regs will become INT_PRESSURE.
-  int bound_pres = lrg->_is_float ? FLOATPRESSURE : INTPRESSURE;
+  int bound_pres = is_float_or_vector ? FLOATPRESSURE : INTPRESSURE;
   // Effective register pressure limit.
   int lrg_pres = (lrg->get_invalid_mask_size() > lrg->num_regs())
     ? (lrg->get_invalid_mask_size() >> (lrg->num_regs()-1)) : bound_pres;
@@ -794,12 +797,15 @@
                   if( i < n->req() ) break;
                   insert_point--;
                 }
+                uint orig_eidx = b->end_idx();
                 maxlrg = split_DEF( n1, b, insert_point, maxlrg, Reachblock, debug_defs, splits, slidx);
                 // If it wasn't split bail
                 if (!maxlrg) {
                   return 0;
                 }
-                insidx++;
+                // Spill of NULL check mem op goes into the following block.
+                if (b->end_idx() > orig_eidx)
+                  insidx++;
               }
               // This is a new DEF, so update UP
               UPblock[slidx] = false;
@@ -960,7 +966,7 @@
             // Grab register mask info
             const RegMask &dmask = def->out_RegMask();
             const RegMask &umask = n->in_RegMask(inpidx);
-
+            bool is_vect = RegMask::is_vector(def->ideal_reg());
             assert(inpidx < oopoff, "cannot use-split oop map info");
 
             bool dup = UPblock[slidx];
@@ -972,7 +978,7 @@
             if( !umask.is_AllStack() &&
                 (int)umask.Size() <= lrgs(useidx).num_regs() &&
                 (!def->rematerialize() ||
-                 umask.is_misaligned_Pair())) {
+                 !is_vect && umask.is_misaligned_pair())) {
               // These need a Split regardless of overlap or pressure
               // SPLIT - NO DEF - NO CISC SPILL
               maxlrg = split_USE(def,b,n,inpidx,maxlrg,dup,false, splits,slidx);
@@ -1123,10 +1129,12 @@
         // Grab UP info for DEF
         const RegMask &dmask = n->out_RegMask();
         bool defup = dmask.is_UP();
+        int ireg = n->ideal_reg();
+        bool is_vect = RegMask::is_vector(ireg);
         // Only split at Def if this is a HRP block or bound (and spilled once)
         if( !n->rematerialize() &&
-            (((dmask.is_bound1() || dmask.is_bound2() || dmask.is_misaligned_Pair()) &&
-             (deflrg._direct_conflict || deflrg._must_spill)) ||
+            (((dmask.is_bound(ireg) || !is_vect && dmask.is_misaligned_pair()) &&
+              (deflrg._direct_conflict || deflrg._must_spill)) ||
              // Check for LRG being up in a register and we are inside a high
              // pressure area.  Spill it down immediately.
              (defup && is_high_pressure(b,&deflrg,insidx))) ) {
--- a/src/share/vm/opto/regmask.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/regmask.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -129,11 +129,34 @@
   0
 );
 
+//=============================================================================
+bool RegMask::is_vector(uint ireg) {
+  return (ireg == Op_VecS || ireg == Op_VecD || ireg == Op_VecX || ireg == Op_VecY);
+}
+
+int RegMask::num_registers(uint ireg) {
+    switch(ireg) {
+      case Op_VecY:
+        return 8;
+      case Op_VecX:
+        return 4;
+      case Op_VecD:
+      case Op_RegD:
+      case Op_RegL:
+#ifdef _LP64
+      case Op_RegP:
+#endif
+        return 2;
+    }
+    // Op_VecS and the rest ideal registers.
+    return 1;
+}
+
 //------------------------------find_first_pair--------------------------------
 // Find the lowest-numbered register pair in the mask.  Return the
 // HIGHEST register number in the pair, or BAD if no pairs.
 OptoReg::Name RegMask::find_first_pair() const {
-  VerifyPairs();
+  verify_pairs();
   for( int i = 0; i < RM_SIZE; i++ ) {
     if( _A[i] ) {               // Found some bits
       int bit = _A[i] & -_A[i]; // Extract low bit
@@ -146,30 +169,30 @@
 
 //------------------------------ClearToPairs-----------------------------------
 // Clear out partial bits; leave only bit pairs
-void RegMask::ClearToPairs() {
+void RegMask::clear_to_pairs() {
   for( int i = 0; i < RM_SIZE; i++ ) {
     int bits = _A[i];
     bits &= ((bits & 0x55555555)<<1); // 1 hi-bit set for each pair
     bits |= (bits>>1);          // Smear 1 hi-bit into a pair
     _A[i] = bits;
   }
-  VerifyPairs();
+  verify_pairs();
 }
 
 //------------------------------SmearToPairs-----------------------------------
 // Smear out partial bits; leave only bit pairs
-void RegMask::SmearToPairs() {
+void RegMask::smear_to_pairs() {
   for( int i = 0; i < RM_SIZE; i++ ) {
     int bits = _A[i];
     bits |= ((bits & 0x55555555)<<1); // Smear lo bit hi per pair
     bits |= ((bits & 0xAAAAAAAA)>>1); // Smear hi bit lo per pair
     _A[i] = bits;
   }
-  VerifyPairs();
+  verify_pairs();
 }
 
 //------------------------------is_aligned_pairs-------------------------------
-bool RegMask::is_aligned_Pairs() const {
+bool RegMask::is_aligned_pairs() const {
   // Assert that the register mask contains only bit pairs.
   for( int i = 0; i < RM_SIZE; i++ ) {
     int bits = _A[i];
@@ -204,7 +227,7 @@
 
 //------------------------------is_bound2--------------------------------------
 // Return TRUE if the mask contains an adjacent pair of bits and no other bits.
-int RegMask::is_bound2() const {
+int RegMask::is_bound_pair() const {
   if( is_AllStack() ) return false;
 
   int bit = -1;                 // Set to hold the one bit allowed
@@ -226,6 +249,132 @@
   return true;
 }
 
+static int low_bits[3] = { 0x55555555, 0x11111111, 0x01010101 };
+//------------------------------find_first_set---------------------------------
+// Find the lowest-numbered register set in the mask.  Return the
+// HIGHEST register number in the set, or BAD if no sets.
+// Works also for size 1.
+OptoReg::Name RegMask::find_first_set(int size) const {
+  verify_sets(size);
+  for (int i = 0; i < RM_SIZE; i++) {
+    if (_A[i]) {                // Found some bits
+      int bit = _A[i] & -_A[i]; // Extract low bit
+      // Convert to bit number, return hi bit in pair
+      return OptoReg::Name((i<<_LogWordBits)+find_lowest_bit(bit)+(size-1));
+    }
+  }
+  return OptoReg::Bad;
+}
+
+//------------------------------clear_to_sets----------------------------------
+// Clear out partial bits; leave only aligned adjacent bit pairs
+void RegMask::clear_to_sets(int size) {
+  if (size == 1) return;
+  assert(2 <= size && size <= 8, "update low bits table");
+  assert(is_power_of_2(size), "sanity");
+  int low_bits_mask = low_bits[size>>2];
+  for (int i = 0; i < RM_SIZE; i++) {
+    int bits = _A[i];
+    int sets = (bits & low_bits_mask);
+    for (int j = 1; j < size; j++) {
+      sets = (bits & (sets<<1)); // filter bits which produce whole sets
+    }
+    sets |= (sets>>1);           // Smear 1 hi-bit into a set
+    if (size > 2) {
+      sets |= (sets>>2);         // Smear 2 hi-bits into a set
+      if (size > 4) {
+        sets |= (sets>>4);       // Smear 4 hi-bits into a set
+      }
+    }
+    _A[i] = sets;
+  }
+  verify_sets(size);
+}
+
+//------------------------------smear_to_sets----------------------------------
+// Smear out partial bits to aligned adjacent bit sets
+void RegMask::smear_to_sets(int size) {
+  if (size == 1) return;
+  assert(2 <= size && size <= 8, "update low bits table");
+  assert(is_power_of_2(size), "sanity");
+  int low_bits_mask = low_bits[size>>2];
+  for (int i = 0; i < RM_SIZE; i++) {
+    int bits = _A[i];
+    int sets = 0;
+    for (int j = 0; j < size; j++) {
+      sets |= (bits & low_bits_mask);  // collect partial bits
+      bits  = bits>>1;
+    }
+    sets |= (sets<<1);           // Smear 1 lo-bit  into a set
+    if (size > 2) {
+      sets |= (sets<<2);         // Smear 2 lo-bits into a set
+      if (size > 4) {
+        sets |= (sets<<4);       // Smear 4 lo-bits into a set
+      }
+    }
+    _A[i] = sets;
+  }
+  verify_sets(size);
+}
+
+//------------------------------is_aligned_set--------------------------------
+bool RegMask::is_aligned_sets(int size) const {
+  if (size == 1) return true;
+  assert(2 <= size && size <= 8, "update low bits table");
+  assert(is_power_of_2(size), "sanity");
+  int low_bits_mask = low_bits[size>>2];
+  // Assert that the register mask contains only bit sets.
+  for (int i = 0; i < RM_SIZE; i++) {
+    int bits = _A[i];
+    while (bits) {              // Check bits for pairing
+      int bit = bits & -bits;   // Extract low bit
+      // Low bit is not odd means its mis-aligned.
+      if ((bit & low_bits_mask) == 0) return false;
+      // Do extra work since (bit << size) may overflow.
+      int hi_bit = bit << (size-1); // high bit
+      int set = hi_bit + ((hi_bit-1) & ~(bit-1));
+      // Check for aligned adjacent bits in this set
+      if ((bits & set) != set) return false;
+      bits -= set;  // Remove this set
+    }
+  }
+  return true;
+}
+
+//------------------------------is_bound_set-----------------------------------
+// Return TRUE if the mask contains one adjacent set of bits and no other bits.
+// Works also for size 1.
+int RegMask::is_bound_set(int size) const {
+  if( is_AllStack() ) return false;
+  assert(1 <= size && size <= 8, "update low bits table");
+  int bit = -1;                 // Set to hold the one bit allowed
+  for (int i = 0; i < RM_SIZE; i++) {
+    if (_A[i] ) {               // Found some bits
+      if (bit != -1)
+       return false;            // Already had bits, so fail
+      bit = _A[i] & -_A[i];     // Extract 1 bit from mask
+      int hi_bit = bit << (size-1); // high bit
+      if (hi_bit != 0) {        // Bit set stays in same word?
+        int set = hi_bit + ((hi_bit-1) & ~(bit-1));
+        if (set != _A[i])
+          return false;         // Require adjacent bit set and no more bits
+      } else {                  // Else its a split-set case
+        if (((-1) & ~(bit-1)) != _A[i])
+          return false;         // Found many bits, so fail
+        i++;                    // Skip iteration forward and check high part
+        assert(size <= 8, "update next code");
+        // The lower 24 bits should be 0 since it is split case and size <= 8.
+        int set = bit>>24;
+        set = set & -set; // Remove sign extension.
+        set = (((set << size) - 1) >> 8);
+        if (_A[i] != set) return false; // Require 1 lo bit in next word
+      }
+    }
+  }
+  // True for both the empty mask and for a bit set
+  return true;
+}
+
 //------------------------------is_UP------------------------------------------
 // UP means register only, Register plus stack, or stack only is DOWN
 bool RegMask::is_UP() const {
--- a/src/share/vm/opto/regmask.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/regmask.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -113,7 +113,11 @@
   // the controlling alignment constraint.  Note that this alignment
   // requirement is internal to the allocator, and independent of any
   // particular platform.
-  enum { SlotsPerLong = 2 };
+  enum { SlotsPerLong = 2,
+         SlotsPerVecS = 1,
+         SlotsPerVecD = 2,
+         SlotsPerVecX = 4,
+         SlotsPerVecY = 8 };
 
   // A constructor only used by the ADLC output.  All mask fields are filled
   // in directly.  Calls to this look something like RM(1,2,3,4);
@@ -193,20 +197,53 @@
   OptoReg::Name find_first_pair() const;
 
   // Clear out partial bits; leave only aligned adjacent bit pairs.
-  void ClearToPairs();
+  void clear_to_pairs();
   // Smear out partial bits; leave only aligned adjacent bit pairs.
-  void SmearToPairs();
+  void smear_to_pairs();
   // Verify that the mask contains only aligned adjacent bit pairs
-  void VerifyPairs() const { assert( is_aligned_Pairs(), "mask is not aligned, adjacent pairs" ); }
+  void verify_pairs() const { assert( is_aligned_pairs(), "mask is not aligned, adjacent pairs" ); }
   // Test that the mask contains only aligned adjacent bit pairs
-  bool is_aligned_Pairs() const;
+  bool is_aligned_pairs() const;
 
   // mask is a pair of misaligned registers
-  bool is_misaligned_Pair() const { return Size()==2 && !is_aligned_Pairs();}
+  bool is_misaligned_pair() const { return Size()==2 && !is_aligned_pairs(); }
   // Test for single register
   int is_bound1() const;
   // Test for a single adjacent pair
-  int is_bound2() const;
+  int is_bound_pair() const;
+  // Test for a single adjacent set of ideal register's size.
+  int is_bound(uint ireg) const {
+    if (is_vector(ireg)) {
+      if (is_bound_set(num_registers(ireg)))
+        return true;
+    } else if (is_bound1() || is_bound_pair()) {
+      return true;
+    }
+    return false;
+  }
+
+  // Find the lowest-numbered register set in the mask.  Return the
+  // HIGHEST register number in the set, or BAD if no sets.
+  // Assert that the mask contains only bit sets.
+  OptoReg::Name find_first_set(int size) const;
+
+  // Clear out partial bits; leave only aligned adjacent bit sets of size.
+  void clear_to_sets(int size);
+  // Smear out partial bits to aligned adjacent bit sets.
+  void smear_to_sets(int size);
+  // Verify that the mask contains only aligned adjacent bit sets
+  void verify_sets(int size) const { assert(is_aligned_sets(size), "mask is not aligned, adjacent sets"); }
+  // Test that the mask contains only aligned adjacent bit sets
+  bool is_aligned_sets(int size) const;
+
+  // mask is a set of misaligned registers
+  bool is_misaligned_set(int size) const { return (int)Size()==size && !is_aligned_sets(size);}
+
+  // Test for a single adjacent set
+  int is_bound_set(int size) const;
+
+  static bool is_vector(uint ireg);
+  static int num_registers(uint ireg);
 
   // Fast overlap test.  Non-zero if any registers in common.
   int overlap( const RegMask &rm ) const {
@@ -280,9 +317,15 @@
 
   static bool can_represent(OptoReg::Name reg) {
     // NOTE: -1 in computation reflects the usage of the last
-    //       bit of the regmask as an infinite stack flag.
+    //       bit of the regmask as an infinite stack flag and
+    //       -7 is to keep mask aligned for largest value (VecY).
     return (int)reg < (int)(CHUNK_SIZE-1);
   }
+  static bool can_represent_arg(OptoReg::Name reg) {
+    // NOTE: -SlotsPerVecY in computation reflects the need
+    //       to keep mask aligned for largest value (VecY).
+    return (int)reg < (int)(CHUNK_SIZE-SlotsPerVecY);
+  }
 };
 
 // Do not use this constant directly in client code!
--- a/src/share/vm/opto/runtime.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/runtime.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -55,7 +55,7 @@
 // code in various ways.  Currently they are used by the lock coarsening code
 //
 
-class NamedCounter : public CHeapObj {
+class NamedCounter : public CHeapObj<mtCompiler> {
 public:
     enum CounterTag {
     NoTag,
--- a/src/share/vm/opto/stringopts.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/stringopts.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -112,6 +112,7 @@
     _arguments->ins_req(0, value);
     _mode.insert_before(0, mode);
   }
+
   void push_string(Node* value) {
     push(value, StringMode);
   }
@@ -125,9 +126,56 @@
     push(value, CharMode);
   }
 
+  static bool is_SB_toString(Node* call) {
+    if (call->is_CallStaticJava()) {
+      CallStaticJavaNode* csj = call->as_CallStaticJava();
+      ciMethod* m = csj->method();
+      if (m != NULL &&
+          (m->intrinsic_id() == vmIntrinsics::_StringBuilder_toString ||
+           m->intrinsic_id() == vmIntrinsics::_StringBuffer_toString)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  static Node* skip_string_null_check(Node* value) {
+    // Look for a diamond shaped Null check of toString() result
+    // (could be code from String.valueOf()):
+    // (Proj == NULL) ? "null":"CastPP(Proj)#NotNULL
+    if (value->is_Phi()) {
+      int true_path = value->as_Phi()->is_diamond_phi();
+      if (true_path != 0) {
+        // phi->region->if_proj->ifnode->bool
+        BoolNode* b = value->in(0)->in(1)->in(0)->in(1)->as_Bool();
+        Node* cmp = b->in(1);
+        Node* v1 = cmp->in(1);
+        Node* v2 = cmp->in(2);
+        // Null check of the return of toString which can simply be skipped.
+        if (b->_test._test == BoolTest::ne &&
+            v2->bottom_type() == TypePtr::NULL_PTR &&
+            value->in(true_path)->Opcode() == Op_CastPP &&
+            value->in(true_path)->in(1) == v1 &&
+            v1->is_Proj() && is_SB_toString(v1->in(0))) {
+          return v1;
+        }
+      }
+    }
+    return value;
+  }
+
   Node* argument(int i) {
     return _arguments->in(i);
   }
+  Node* argument_uncast(int i) {
+    Node* arg = argument(i);
+    int amode = mode(i);
+    if (amode == StringConcat::StringMode ||
+        amode == StringConcat::StringNullCheckMode) {
+      arg = skip_string_null_check(arg);
+    }
+    return arg;
+  }
   void set_argument(int i, Node* value) {
     _arguments->set_req(i, value);
   }
@@ -206,9 +254,11 @@
 
 
 void StringConcat::eliminate_unneeded_control() {
-  eliminate_initialize(begin()->initialization());
   for (uint i = 0; i < _control.size(); i++) {
     Node* n = _control.at(i);
+    if (n->is_Allocate()) {
+      eliminate_initialize(n->as_Allocate()->initialization());
+    }
     if (n->is_Call()) {
       if (n != _end) {
         eliminate_call(n->as_Call());
@@ -239,14 +289,15 @@
   assert(result->_control.contains(other->_end), "what?");
   assert(result->_control.contains(_begin), "what?");
   for (int x = 0; x < num_arguments(); x++) {
-    if (argument(x) == arg) {
+    Node* argx = argument_uncast(x);
+    if (argx == arg) {
       // replace the toString result with the all the arguments that
       // made up the other StringConcat
       for (int y = 0; y < other->num_arguments(); y++) {
         result->append(other->argument(y), other->mode(y));
       }
     } else {
-      result->append(argument(x), mode(x));
+      result->append(argx, mode(x));
     }
   }
   result->set_allocation(other->_begin);
@@ -327,14 +378,9 @@
 
   while (worklist.size() > 0) {
     Node* ctrl = worklist.pop();
-    if (ctrl->is_CallStaticJava()) {
+    if (StringConcat::is_SB_toString(ctrl)) {
       CallStaticJavaNode* csj = ctrl->as_CallStaticJava();
-      ciMethod* m = csj->method();
-      if (m != NULL &&
-          (m->intrinsic_id() == vmIntrinsics::_StringBuffer_toString ||
-           m->intrinsic_id() == vmIntrinsics::_StringBuilder_toString)) {
-        string_calls.push(csj);
-      }
+      string_calls.push(csj);
     }
     if (ctrl->in(0) != NULL && !_visited.test_set(ctrl->in(0)->_idx)) {
       worklist.push(ctrl->in(0));
@@ -487,7 +533,17 @@
         if (arg->is_Proj() && arg->in(0)->is_CallStaticJava()) {
           CallStaticJavaNode* csj = arg->in(0)->as_CallStaticJava();
           if (csj->method() != NULL &&
-              csj->method()->intrinsic_id() == vmIntrinsics::_Integer_toString) {
+              csj->method()->intrinsic_id() == vmIntrinsics::_Integer_toString &&
+              arg->outcnt() == 1) {
+            // _control is the list of StringBuilder calls nodes which
+            // will be replaced by new String code after this optimization.
+            // Integer::toString() call is not part of StringBuilder calls
+            // chain. It could be eliminated only if its result is used
+            // only by this SB calls chain.
+            // Another limitation: it should be used only once because
+            // it is unknown that it is used only by this SB calls chain
+            // until all related SB calls nodes are collected.
+            assert(arg->unique_out() == cnode, "sanity");
             sc->add_control(csj);
             sc->push_int(csj->in(TypeFunc::Parms));
             continue;
@@ -550,44 +606,40 @@
   for (int c = 0; c < concats.length(); c++) {
     StringConcat* sc = concats.at(c);
     for (int i = 0; i < sc->num_arguments(); i++) {
-      Node* arg = sc->argument(i);
-      if (arg->is_Proj() && arg->in(0)->is_CallStaticJava()) {
+      Node* arg = sc->argument_uncast(i);
+      if (arg->is_Proj() && StringConcat::is_SB_toString(arg->in(0))) {
         CallStaticJavaNode* csj = arg->in(0)->as_CallStaticJava();
-        if (csj->method() != NULL &&
-            (csj->method()->intrinsic_id() == vmIntrinsics::_StringBuilder_toString ||
-             csj->method()->intrinsic_id() == vmIntrinsics::_StringBuffer_toString)) {
-          for (int o = 0; o < concats.length(); o++) {
-            if (c == o) continue;
-            StringConcat* other = concats.at(o);
-            if (other->end() == csj) {
+        for (int o = 0; o < concats.length(); o++) {
+          if (c == o) continue;
+          StringConcat* other = concats.at(o);
+          if (other->end() == csj) {
 #ifndef PRODUCT
-              if (PrintOptimizeStringConcat) {
-                tty->print_cr("considering stacked concats");
-              }
+            if (PrintOptimizeStringConcat) {
+              tty->print_cr("considering stacked concats");
+            }
 #endif
 
-              StringConcat* merged = sc->merge(other, arg);
-              if (merged->validate_control_flow()) {
+            StringConcat* merged = sc->merge(other, arg);
+            if (merged->validate_control_flow()) {
 #ifndef PRODUCT
-                if (PrintOptimizeStringConcat) {
-                  tty->print_cr("stacking would succeed");
-                }
+              if (PrintOptimizeStringConcat) {
+                tty->print_cr("stacking would succeed");
+              }
 #endif
-                if (c < o) {
-                  concats.remove_at(o);
-                  concats.at_put(c, merged);
-                } else {
-                  concats.remove_at(c);
-                  concats.at_put(o, merged);
-                }
-                goto restart;
+              if (c < o) {
+                concats.remove_at(o);
+                concats.at_put(c, merged);
               } else {
+                concats.remove_at(c);
+                concats.at_put(o, merged);
+              }
+              goto restart;
+            } else {
 #ifndef PRODUCT
-                if (PrintOptimizeStringConcat) {
-                  tty->print_cr("stacking would fail");
-                }
+              if (PrintOptimizeStringConcat) {
+                tty->print_cr("stacking would fail");
+              }
 #endif
-              }
             }
           }
         }
--- a/src/share/vm/opto/subnode.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/subnode.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -554,9 +554,7 @@
       return TypeInt::CC_GE;
     } else if (hi0 <= lo1) {
       // Check for special case in Hashtable::get.  (See below.)
-      if ((jint)lo0 >= 0 && (jint)lo1 >= 0 &&
-          in(1)->Opcode() == Op_ModI &&
-          in(1)->in(2) == in(2) )
+      if ((jint)lo0 >= 0 && (jint)lo1 >= 0 && is_index_range_check())
         return TypeInt::CC_LT;
       return TypeInt::CC_LE;
     }
@@ -567,13 +565,17 @@
   // to be positive.
   // (This is a gross hack, since the sub method never
   // looks at the structure of the node in any other case.)
-  if ((jint)lo0 >= 0 && (jint)lo1 >= 0 &&
-      in(1)->Opcode() == Op_ModI &&
-      in(1)->in(2)->uncast() == in(2)->uncast())
+  if ((jint)lo0 >= 0 && (jint)lo1 >= 0 && is_index_range_check())
     return TypeInt::CC_LT;
   return TypeInt::CC;                   // else use worst case results
 }
 
+bool CmpUNode::is_index_range_check() const {
+  // Check for the "(X ModI Y) CmpU Y" shape
+  return (in(1)->Opcode() == Op_ModI &&
+          in(1)->in(2)->eqv_uncast(in(2)));
+}
+
 //------------------------------Idealize---------------------------------------
 Node *CmpINode::Ideal( PhaseGVN *phase, bool can_reshape ) {
   if (phase->type(in(2))->higher_equal(TypeInt::ZERO)) {
--- a/src/share/vm/opto/subnode.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/subnode.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -158,6 +158,7 @@
   CmpUNode( Node *in1, Node *in2 ) : CmpNode(in1,in2) {}
   virtual int Opcode() const;
   virtual const Type *sub( const Type *, const Type * ) const;
+  bool is_index_range_check() const;
 };
 
 //------------------------------CmpPNode---------------------------------------
--- a/src/share/vm/opto/superword.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/superword.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -67,6 +67,10 @@
 
 //------------------------------transform_loop---------------------------
 void SuperWord::transform_loop(IdealLoopTree* lpt) {
+  assert(UseSuperWord, "should be");
+  // Do vectors exist on this architecture?
+  if (Matcher::vector_width_in_bytes(T_BYTE) < 2) return;
+
   assert(lpt->_head->is_CountedLoop(), "must be");
   CountedLoopNode *cl = lpt->_head->as_CountedLoop();
 
@@ -89,15 +93,12 @@
   Node *pre_opaq1 = pre_end->limit();
   if (pre_opaq1->Opcode() != Op_Opaque1) return;
 
-  // Do vectors exist on this architecture?
-  if (vector_width_in_bytes() == 0) return;
-
   init(); // initialize data structures
 
   set_lpt(lpt);
   set_lp(cl);
 
- // For now, define one block which is the entire loop body
+  // For now, define one block which is the entire loop body
   set_bb(cl);
 
   assert(_packset.length() == 0, "packset must be empty");
@@ -177,7 +178,7 @@
   Node_List memops;
   for (int i = 0; i < _block.length(); i++) {
     Node* n = _block.at(i);
-    if (n->is_Mem() && in_bb(n) &&
+    if (n->is_Mem() && !n->is_LoadStore() && in_bb(n) &&
         is_java_primitive(n->as_Mem()->memory_type())) {
       int align = memory_alignment(n->as_Mem(), 0);
       if (align != bottom_align) {
@@ -185,54 +186,141 @@
       }
     }
   }
-  if (memops.size() == 0) return;
 
-  // Find a memory reference to align to.  The pre-loop trip count
-  // is modified to align this reference to a vector-aligned address
-  find_align_to_ref(memops);
-  if (align_to_ref() == NULL) return;
+  Node_List align_to_refs;
+  int best_iv_adjustment = 0;
+  MemNode* best_align_to_mem_ref = NULL;
 
-  SWPointer align_to_ref_p(align_to_ref(), this);
-  int offset = align_to_ref_p.offset_in_bytes();
-  int scale  = align_to_ref_p.scale_in_bytes();
-  int vw              = vector_width_in_bytes();
-  int stride_sign     = (scale * iv_stride()) > 0 ? 1 : -1;
-  int iv_adjustment   = (stride_sign * vw - (offset % vw)) % vw;
-
-#ifndef PRODUCT
-  if (TraceSuperWord)
-    tty->print_cr("\noffset = %d iv_adjustment = %d  elt_align = %d scale = %d iv_stride = %d",
-                  offset, iv_adjustment, align_to_ref_p.memory_size(), align_to_ref_p.scale_in_bytes(), iv_stride());
-#endif
+  while (memops.size() != 0) {
+    // Find a memory reference to align to.
+    MemNode* mem_ref = find_align_to_ref(memops);
+    if (mem_ref == NULL) break;
+    align_to_refs.push(mem_ref);
+    int iv_adjustment = get_iv_adjustment(mem_ref);
 
-  // Set alignment relative to "align_to_ref"
-  for (int i = memops.size() - 1; i >= 0; i--) {
-    MemNode* s = memops.at(i)->as_Mem();
-    SWPointer p2(s, this);
-    if (p2.comparable(align_to_ref_p)) {
-      int align = memory_alignment(s, iv_adjustment);
-      set_alignment(s, align);
-    } else {
-      memops.remove(i);
+    if (best_align_to_mem_ref == NULL) {
+      // Set memory reference which is the best from all memory operations
+      // to be used for alignment. The pre-loop trip count is modified to align
+      // this reference to a vector-aligned address.
+      best_align_to_mem_ref = mem_ref;
+      best_iv_adjustment = iv_adjustment;
     }
-  }
 
-  // Create initial pack pairs of memory operations
-  for (uint i = 0; i < memops.size(); i++) {
-    Node* s1 = memops.at(i);
-    for (uint j = 0; j < memops.size(); j++) {
-      Node* s2 = memops.at(j);
-      if (s1 != s2 && are_adjacent_refs(s1, s2)) {
-        int align = alignment(s1);
-        if (stmts_can_pack(s1, s2, align)) {
-          Node_List* pair = new Node_List();
-          pair->push(s1);
-          pair->push(s2);
-          _packset.append(pair);
+    SWPointer align_to_ref_p(mem_ref, this);
+    // Set alignment relative to "align_to_ref" for all related memory operations.
+    for (int i = memops.size() - 1; i >= 0; i--) {
+      MemNode* s = memops.at(i)->as_Mem();
+      if (isomorphic(s, mem_ref)) {
+        SWPointer p2(s, this);
+        if (p2.comparable(align_to_ref_p)) {
+          int align = memory_alignment(s, iv_adjustment);
+          set_alignment(s, align);
         }
       }
     }
-  }
+
+    // Create initial pack pairs of memory operations for which
+    // alignment is set and vectors will be aligned.
+    bool create_pack = true;
+    if (memory_alignment(mem_ref, best_iv_adjustment) == 0) {
+      if (!Matcher::misaligned_vectors_ok()) {
+        int vw = vector_width(mem_ref);
+        int vw_best = vector_width(best_align_to_mem_ref);
+        if (vw > vw_best) {
+          // Do not vectorize a memory access with more elements per vector
+          // if unaligned memory access is not allowed because number of
+          // iterations in pre-loop will be not enough to align it.
+          create_pack = false;
+        }
+      }
+    } else {
+      if (same_velt_type(mem_ref, best_align_to_mem_ref)) {
+        // Can't allow vectorization of unaligned memory accesses with the
+        // same type since it could be overlapped accesses to the same array.
+        create_pack = false;
+      } else {
+        // Allow independent (different type) unaligned memory operations
+        // if HW supports them.
+        if (!Matcher::misaligned_vectors_ok()) {
+          create_pack = false;
+        } else {
+          // Check if packs of the same memory type but
+          // with a different alignment were created before.
+          for (uint i = 0; i < align_to_refs.size(); i++) {
+            MemNode* mr = align_to_refs.at(i)->as_Mem();
+            if (same_velt_type(mr, mem_ref) &&
+                memory_alignment(mr, iv_adjustment) != 0)
+              create_pack = false;
+          }
+        }
+      }
+    }
+    if (create_pack) {
+      for (uint i = 0; i < memops.size(); i++) {
+        Node* s1 = memops.at(i);
+        int align = alignment(s1);
+        if (align == top_align) continue;
+        for (uint j = 0; j < memops.size(); j++) {
+          Node* s2 = memops.at(j);
+          if (alignment(s2) == top_align) continue;
+          if (s1 != s2 && are_adjacent_refs(s1, s2)) {
+            if (stmts_can_pack(s1, s2, align)) {
+              Node_List* pair = new Node_List();
+              pair->push(s1);
+              pair->push(s2);
+              _packset.append(pair);
+            }
+          }
+        }
+      }
+    } else { // Don't create unaligned pack
+      // First, remove remaining memory ops of the same type from the list.
+      for (int i = memops.size() - 1; i >= 0; i--) {
+        MemNode* s = memops.at(i)->as_Mem();
+        if (same_velt_type(s, mem_ref)) {
+          memops.remove(i);
+        }
+      }
+
+      // Second, remove already constructed packs of the same type.
+      for (int i = _packset.length() - 1; i >= 0; i--) {
+        Node_List* p = _packset.at(i);
+        MemNode* s = p->at(0)->as_Mem();
+        if (same_velt_type(s, mem_ref)) {
+          remove_pack_at(i);
+        }
+      }
+
+      // If needed find the best memory reference for loop alignment again.
+      if (same_velt_type(mem_ref, best_align_to_mem_ref)) {
+        // Put memory ops from remaining packs back on memops list for
+        // the best alignment search.
+        uint orig_msize = memops.size();
+        for (int i = 0; i < _packset.length(); i++) {
+          Node_List* p = _packset.at(i);
+          MemNode* s = p->at(0)->as_Mem();
+          assert(!same_velt_type(s, mem_ref), "sanity");
+          memops.push(s);
+        }
+        MemNode* best_align_to_mem_ref = find_align_to_ref(memops);
+        if (best_align_to_mem_ref == NULL) break;
+        best_iv_adjustment = get_iv_adjustment(best_align_to_mem_ref);
+        // Restore list.
+        while (memops.size() > orig_msize)
+          (void)memops.pop();
+      }
+    } // unaligned memory accesses
+
+    // Remove used mem nodes.
+    for (int i = memops.size() - 1; i >= 0; i--) {
+      MemNode* m = memops.at(i)->as_Mem();
+      if (alignment(m) != top_align) {
+        memops.remove(i);
+      }
+    }
+
+  } // while (memops.size() != 0
+  set_align_to_ref(best_align_to_mem_ref);
 
 #ifndef PRODUCT
   if (TraceSuperWord) {
@@ -246,7 +334,7 @@
 // Find a memory reference to align the loop induction variable to.
 // Looks first at stores then at loads, looking for a memory reference
 // with the largest number of references similar to it.
-void SuperWord::find_align_to_ref(Node_List &memops) {
+MemNode* SuperWord::find_align_to_ref(Node_List &memops) {
   GrowableArray<int> cmp_ct(arena(), memops.size(), memops.size(), 0);
 
   // Count number of comparable memory ops
@@ -270,20 +358,28 @@
     }
   }
 
-  // Find Store (or Load) with the greatest number of "comparable" references
+  // Find Store (or Load) with the greatest number of "comparable" references,
+  // biggest vector size, smallest data size and smallest iv offset.
   int max_ct        = 0;
+  int max_vw        = 0;
   int max_idx       = -1;
   int min_size      = max_jint;
   int min_iv_offset = max_jint;
   for (uint j = 0; j < memops.size(); j++) {
     MemNode* s = memops.at(j)->as_Mem();
     if (s->is_Store()) {
+      int vw = vector_width_in_bytes(s);
+      assert(vw > 1, "sanity");
       SWPointer p(s, this);
-      if (cmp_ct.at(j) > max_ct ||
-          cmp_ct.at(j) == max_ct && (data_size(s) < min_size ||
-                                     data_size(s) == min_size &&
-                                        p.offset_in_bytes() < min_iv_offset)) {
+      if (cmp_ct.at(j) >  max_ct ||
+          cmp_ct.at(j) == max_ct &&
+            (vw >  max_vw ||
+             vw == max_vw &&
+              (data_size(s) <  min_size ||
+               data_size(s) == min_size &&
+                 (p.offset_in_bytes() < min_iv_offset)))) {
         max_ct = cmp_ct.at(j);
+        max_vw = vw;
         max_idx = j;
         min_size = data_size(s);
         min_iv_offset = p.offset_in_bytes();
@@ -295,12 +391,18 @@
     for (uint j = 0; j < memops.size(); j++) {
       MemNode* s = memops.at(j)->as_Mem();
       if (s->is_Load()) {
+        int vw = vector_width_in_bytes(s);
+        assert(vw > 1, "sanity");
         SWPointer p(s, this);
-        if (cmp_ct.at(j) > max_ct ||
-            cmp_ct.at(j) == max_ct && (data_size(s) < min_size ||
-                                       data_size(s) == min_size &&
-                                          p.offset_in_bytes() < min_iv_offset)) {
+        if (cmp_ct.at(j) >  max_ct ||
+            cmp_ct.at(j) == max_ct &&
+              (vw >  max_vw ||
+               vw == max_vw &&
+                (data_size(s) <  min_size ||
+                 data_size(s) == min_size &&
+                   (p.offset_in_bytes() < min_iv_offset)))) {
           max_ct = cmp_ct.at(j);
+          max_vw = vw;
           max_idx = j;
           min_size = data_size(s);
           min_iv_offset = p.offset_in_bytes();
@@ -309,10 +411,7 @@
     }
   }
 
-  if (max_ct > 0)
-    set_align_to_ref(memops.at(max_idx)->as_Mem());
-
-#ifndef PRODUCT
+#ifdef ASSERT
   if (TraceSuperWord && Verbose) {
     tty->print_cr("\nVector memops after find_align_to_refs");
     for (uint i = 0; i < memops.size(); i++) {
@@ -321,6 +420,17 @@
     }
   }
 #endif
+
+  if (max_ct > 0) {
+#ifdef ASSERT
+    if (TraceSuperWord) {
+      tty->print("\nVector align to node: ");
+      memops.at(max_idx)->as_Mem()->dump();
+    }
+#endif
+    return memops.at(max_idx)->as_Mem();
+  }
+  return NULL;
 }
 
 //------------------------------ref_is_alignable---------------------------
@@ -341,7 +451,8 @@
 
   // If initial offset from start of object is computable,
   // compute alignment within the vector.
-  int vw = vector_width_in_bytes();
+  int vw = vector_width_in_bytes(p.mem());
+  assert(vw > 1, "sanity");
   if (vw % span == 0) {
     Node* init_nd = pre_end->init_trip();
     if (init_nd->is_Con() && p.invar() == NULL) {
@@ -361,6 +472,25 @@
   return false;
 }
 
+//---------------------------get_iv_adjustment---------------------------
+// Calculate loop's iv adjustment for this memory ops.
+int SuperWord::get_iv_adjustment(MemNode* mem_ref) {
+  SWPointer align_to_ref_p(mem_ref, this);
+  int offset = align_to_ref_p.offset_in_bytes();
+  int scale  = align_to_ref_p.scale_in_bytes();
+  int vw       = vector_width_in_bytes(mem_ref);
+  assert(vw > 1, "sanity");
+  int stride_sign   = (scale * iv_stride()) > 0 ? 1 : -1;
+  int iv_adjustment = (stride_sign * vw - (offset % vw)) % vw;
+
+#ifndef PRODUCT
+  if (TraceSuperWord)
+    tty->print_cr("\noffset = %d iv_adjust = %d elt_size = %d scale = %d iv_stride = %d vect_size %d",
+                  offset, iv_adjustment, align_to_ref_p.memory_size(), scale, iv_stride(), vw);
+#endif
+  return iv_adjustment;
+}
+
 //---------------------------dependence_graph---------------------------
 // Construct dependency graph.
 // Add dependence edges to load/store nodes for memory dependence
@@ -488,9 +618,13 @@
 bool SuperWord::stmts_can_pack(Node* s1, Node* s2, int align) {
 
   // Do not use superword for non-primitives
-  if((s1->is_Mem() && !is_java_primitive(s1->as_Mem()->memory_type())) ||
-     (s2->is_Mem() && !is_java_primitive(s2->as_Mem()->memory_type())))
+  BasicType bt1 = velt_basic_type(s1);
+  BasicType bt2 = velt_basic_type(s2);
+  if(!is_java_primitive(bt1) || !is_java_primitive(bt2))
     return false;
+  if (Matcher::max_vector_size(bt1) < 2) {
+    return false; // No vectors for this type
+  }
 
   if (isomorphic(s1, s2)) {
     if (independent(s1, s2)) {
@@ -552,7 +686,7 @@
   if (s1->Opcode() != s2->Opcode()) return false;
   if (s1->req() != s2->req()) return false;
   if (s1->in(0) != s2->in(0)) return false;
-  if (velt_type(s1) != velt_type(s2)) return false;
+  if (!same_velt_type(s1, s2)) return false;
   return true;
 }
 
@@ -595,14 +729,16 @@
 //------------------------------set_alignment---------------------------
 void SuperWord::set_alignment(Node* s1, Node* s2, int align) {
   set_alignment(s1, align);
-  set_alignment(s2, align + data_size(s1));
+  if (align == top_align || align == bottom_align) {
+    set_alignment(s2, align);
+  } else {
+    set_alignment(s2, align + data_size(s1));
+  }
 }
 
 //------------------------------data_size---------------------------
 int SuperWord::data_size(Node* s) {
-  const Type* t = velt_type(s);
-  BasicType  bt = t->array_element_basic_type();
-  int bsize = type2aelembytes(bt);
+  int bsize = type2aelembytes(velt_basic_type(s));
   assert(bsize != 0, "valid size");
   return bsize;
 }
@@ -631,9 +767,9 @@
 //------------------------------follow_use_defs---------------------------
 // Extend the packset by visiting operand definitions of nodes in pack p
 bool SuperWord::follow_use_defs(Node_List* p) {
+  assert(p->size() == 2, "just checking");
   Node* s1 = p->at(0);
   Node* s2 = p->at(1);
-  assert(p->size() == 2, "just checking");
   assert(s1->req() == s2->req(), "just checking");
   assert(alignment(s1) + data_size(s1) == alignment(s2), "just checking");
 
@@ -718,7 +854,12 @@
     for (i1++; i1 < ct; i1++) if (u1->in(i1) == d1) break;
     for (i2++; i2 < ct; i2++) if (u2->in(i2) == d2) break;
     if (i1 != i2) {
-      return false;
+      if ((i1 == (3-i2)) && (u2->is_Add() || u2->is_Mul())) {
+        // Further analysis relies on operands position matching.
+        u2->swap_edges(i1, i2);
+      } else {
+        return false;
+      }
     }
   } while (i1 < ct);
   return true;
@@ -727,7 +868,7 @@
 //------------------------------est_savings---------------------------
 // Estimate the savings from executing s1 and s2 as a pack
 int SuperWord::est_savings(Node* s1, Node* s2) {
-  int save = 2 - 1; // 2 operations per instruction in packed form
+  int save_in = 2 - 1; // 2 operations per instruction in packed form
 
   // inputs
   for (uint i = 1; i < s1->req(); i++) {
@@ -735,17 +876,18 @@
     Node* x2 = s2->in(i);
     if (x1 != x2) {
       if (are_adjacent_refs(x1, x2)) {
-        save += adjacent_profit(x1, x2);
+        save_in += adjacent_profit(x1, x2);
       } else if (!in_packset(x1, x2)) {
-        save -= pack_cost(2);
+        save_in -= pack_cost(2);
       } else {
-        save += unpack_cost(2);
+        save_in += unpack_cost(2);
       }
     }
   }
 
   // uses of result
   uint ct = 0;
+  int save_use = 0;
   for (DUIterator_Fast imax, i = s1->fast_outs(imax); i < imax; i++) {
     Node* s1_use = s1->fast_out(i);
     for (int j = 0; j < _packset.length(); j++) {
@@ -756,7 +898,7 @@
           if (p->at(p->size()-1) == s2_use) {
             ct++;
             if (are_adjacent_refs(s1_use, s2_use)) {
-              save += adjacent_profit(s1_use, s2_use);
+              save_use += adjacent_profit(s1_use, s2_use);
             }
           }
         }
@@ -764,10 +906,10 @@
     }
   }
 
-  if (ct < s1->outcnt()) save += unpack_cost(1);
-  if (ct < s2->outcnt()) save += unpack_cost(1);
+  if (ct < s1->outcnt()) save_use += unpack_cost(1);
+  if (ct < s2->outcnt()) save_use += unpack_cost(1);
 
-  return save;
+  return MAX2(save_in, save_use);
 }
 
 //------------------------------costs---------------------------
@@ -778,8 +920,9 @@
 //------------------------------combine_packs---------------------------
 // Combine packs A and B with A.last == B.first into A.first..,A.last,B.second,..B.last
 void SuperWord::combine_packs() {
-  bool changed;
-  do {
+  bool changed = true;
+  // Combine packs regardless max vector size.
+  while (changed) {
     changed = false;
     for (int i = 0; i < _packset.length(); i++) {
       Node_List* p1 = _packset.at(i);
@@ -787,6 +930,7 @@
       for (int j = 0; j < _packset.length(); j++) {
         Node_List* p2 = _packset.at(j);
         if (p2 == NULL) continue;
+        if (i == j) continue;
         if (p1->at(p1->size()-1) == p2->at(0)) {
           for (uint k = 1; k < p2->size(); k++) {
             p1->push(p2->at(k));
@@ -796,8 +940,39 @@
         }
       }
     }
-  } while (changed);
+  }
 
+  // Split packs which have size greater then max vector size.
+  for (int i = 0; i < _packset.length(); i++) {
+    Node_List* p1 = _packset.at(i);
+    if (p1 != NULL) {
+      BasicType bt = velt_basic_type(p1->at(0));
+      uint max_vlen = Matcher::max_vector_size(bt); // Max elements in vector
+      assert(is_power_of_2(max_vlen), "sanity");
+      uint psize = p1->size();
+      if (!is_power_of_2(psize)) {
+        // Skip pack which can't be vector.
+        // case1: for(...) { a[i] = i; }    elements values are different (i+x)
+        // case2: for(...) { a[i] = b[i+1]; }  can't align both, load and store
+        _packset.at_put(i, NULL);
+        continue;
+      }
+      if (psize > max_vlen) {
+        Node_List* pack = new Node_List();
+        for (uint j = 0; j < psize; j++) {
+          pack->push(p1->at(j));
+          if (pack->size() >= max_vlen) {
+            assert(is_power_of_2(pack->size()), "sanity");
+            _packset.append(pack);
+            pack = new Node_List();
+          }
+        }
+        _packset.at_put(i, NULL);
+      }
+    }
+  }
+
+  // Compress list.
   for (int i = _packset.length() - 1; i >= 0; i--) {
     Node_List* p1 = _packset.at(i);
     if (p1 == NULL) {
@@ -880,8 +1055,7 @@
 // Can code be generated for pack p?
 bool SuperWord::implemented(Node_List* p) {
   Node* p0 = p->at(0);
-  int vopc = VectorNode::opcode(p0->Opcode(), p->size(), velt_type(p0));
-  return vopc > 0 && Matcher::has_match_rule(vopc);
+  return VectorNode::implemented(p0->Opcode(), p->size(), velt_basic_type(p0));
 }
 
 //------------------------------profitable---------------------------
@@ -939,36 +1113,36 @@
 }
 
 //-------------------------------remove_and_insert-------------------
-//remove "current" from its current position in the memory graph and insert
-//it after the appropriate insertion point (lip or uip)
+// Remove "current" from its current position in the memory graph and insert
+// it after the appropriate insertion point (lip or uip).
 void SuperWord::remove_and_insert(MemNode *current, MemNode *prev, MemNode *lip,
                                   Node *uip, Unique_Node_List &sched_before) {
   Node* my_mem = current->in(MemNode::Memory);
-  _igvn.rehash_node_delayed(current);
-  _igvn.hash_delete(my_mem);
+  bool sched_up = sched_before.member(current);
 
-  //remove current_store from its current position in the memmory graph
+  // remove current_store from its current position in the memmory graph
   for (DUIterator i = current->outs(); current->has_out(i); i++) {
     Node* use = current->out(i);
     if (use->is_Mem()) {
       assert(use->in(MemNode::Memory) == current, "must be");
-      _igvn.rehash_node_delayed(use);
       if (use == prev) { // connect prev to my_mem
-        use->set_req(MemNode::Memory, my_mem);
+          _igvn.replace_input_of(use, MemNode::Memory, my_mem);
+          --i; //deleted this edge; rescan position
       } else if (sched_before.member(use)) {
-        _igvn.hash_delete(uip);
-        use->set_req(MemNode::Memory, uip);
+        if (!sched_up) { // Will be moved together with current
+          _igvn.replace_input_of(use, MemNode::Memory, uip);
+          --i; //deleted this edge; rescan position
+        }
       } else {
-        _igvn.hash_delete(lip);
-        use->set_req(MemNode::Memory, lip);
+        if (sched_up) { // Will be moved together with current
+          _igvn.replace_input_of(use, MemNode::Memory, lip);
+          --i; //deleted this edge; rescan position
+        }
       }
-      --i; //deleted this edge; rescan position
     }
   }
 
-  bool sched_up = sched_before.member(current);
   Node *insert_pt =  sched_up ?  uip : lip;
-  _igvn.hash_delete(insert_pt);
 
   // all uses of insert_pt's memory state should use current's instead
   for (DUIterator i = insert_pt->outs(); insert_pt->has_out(i); i++) {
@@ -988,7 +1162,7 @@
   }
 
   //connect current to insert_pt
-  current->set_req(MemNode::Memory, insert_pt);
+  _igvn.replace_input_of(current, MemNode::Memory, insert_pt);
 }
 
 //------------------------------co_locate_pack----------------------------------
@@ -1025,7 +1199,7 @@
         if (use->is_Mem() && use != previous)
           memops.push(use);
       }
-      if(current == first) break;
+      if (current == first) break;
       previous = current;
       current  = current->in(MemNode::Memory)->as_Mem();
     }
@@ -1038,27 +1212,37 @@
           Node *s2 = memops.at(j);
           if (!independent(s1, s2)) {
             if (in_pack(s2, pk) || schedule_before_pack.member(s2)) {
-              schedule_before_pack.push(s1); //s1 must be scheduled before
+              schedule_before_pack.push(s1); // s1 must be scheduled before
               Node_List* mem_pk = my_pack(s1);
               if (mem_pk != NULL) {
                 for (uint ii = 0; ii < mem_pk->size(); ii++) {
-                  Node* s = mem_pk->at(ii); // follow partner
+                  Node* s = mem_pk->at(ii);  // follow partner
                   if (memops.member(s) && !schedule_before_pack.member(s))
                     schedule_before_pack.push(s);
                 }
               }
+              break;
             }
           }
         }
       }
     }
 
+    Node*    upper_insert_pt = first->in(MemNode::Memory);
+    // Following code moves loads connected to upper_insert_pt below aliased stores.
+    // Collect such loads here and reconnect them back to upper_insert_pt later.
+    memops.clear();
+    for (DUIterator i = upper_insert_pt->outs(); upper_insert_pt->has_out(i); i++) {
+      Node* use = upper_insert_pt->out(i);
+      if (!use->is_Store())
+        memops.push(use);
+    }
+
     MemNode* lower_insert_pt = last;
-    Node*    upper_insert_pt = first->in(MemNode::Memory);
     previous                 = last; //previous store in pk
     current                  = last->in(MemNode::Memory)->as_Mem();
 
-    //start scheduling from "last" to "first"
+    // start scheduling from "last" to "first"
     while (true) {
       assert(in_bb(current), "stay in block");
       assert(in_pack(previous, pk), "previous stays in pack");
@@ -1066,16 +1250,13 @@
 
       if (in_pack(current, pk)) {
         // Forward users of my memory state (except "previous) to my input memory state
-        _igvn.hash_delete(current);
         for (DUIterator i = current->outs(); current->has_out(i); i++) {
           Node* use = current->out(i);
           if (use->is_Mem() && use != previous) {
             assert(use->in(MemNode::Memory) == current, "must be");
             if (schedule_before_pack.member(use)) {
-              _igvn.hash_delete(upper_insert_pt);
               _igvn.replace_input_of(use, MemNode::Memory, upper_insert_pt);
             } else {
-              _igvn.hash_delete(lower_insert_pt);
               _igvn.replace_input_of(use, MemNode::Memory, lower_insert_pt);
             }
             --i; // deleted this edge; rescan position
@@ -1089,6 +1270,14 @@
       if (current == first) break;
       current = my_mem->as_Mem();
     } // end while
+
+    // Reconnect loads back to upper_insert_pt.
+    for (uint i = 0; i < memops.size(); i++) {
+      Node *ld = memops.at(i);
+      if (ld->in(MemNode::Memory) != upper_insert_pt) {
+        _igvn.replace_input_of(ld, MemNode::Memory, upper_insert_pt);
+      }
+    }
   } else if (pk->at(0)->is_Load()) { //load
     // all loads in the pack should have the same memory state. By default,
     // we use the memory state of the last load. However, if any load could
@@ -1149,35 +1338,30 @@
       Node* vn = NULL;
       Node* low_adr = p->at(0);
       Node* first   = executed_first(p);
+      int   opc = n->Opcode();
       if (n->is_Load()) {
-        int   opc = n->Opcode();
         Node* ctl = n->in(MemNode::Control);
         Node* mem = first->in(MemNode::Memory);
         Node* adr = low_adr->in(MemNode::Address);
         const TypePtr* atyp = n->adr_type();
-        vn = VectorLoadNode::make(_phase->C, opc, ctl, mem, adr, atyp, vlen);
-
+        vn = LoadVectorNode::make(_phase->C, opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n));
       } else if (n->is_Store()) {
         // Promote value to be stored to vector
         Node* val = vector_opd(p, MemNode::ValueIn);
-
-        int   opc = n->Opcode();
         Node* ctl = n->in(MemNode::Control);
         Node* mem = first->in(MemNode::Memory);
         Node* adr = low_adr->in(MemNode::Address);
         const TypePtr* atyp = n->adr_type();
-        vn = VectorStoreNode::make(_phase->C, opc, ctl, mem, adr, atyp, val, vlen);
-
+        vn = StoreVectorNode::make(_phase->C, opc, ctl, mem, adr, atyp, val, vlen);
       } else if (n->req() == 3) {
         // Promote operands to vector
         Node* in1 = vector_opd(p, 1);
         Node* in2 = vector_opd(p, 2);
-        vn = VectorNode::make(_phase->C, n->Opcode(), in1, in2, vlen, velt_type(n));
-
+        vn = VectorNode::make(_phase->C, opc, in1, in2, vlen, velt_basic_type(n));
       } else {
         ShouldNotReachHere();
       }
-
+      assert(vn != NULL, "sanity");
       _phase->_igvn.register_new_node_with_optimizer(vn);
       _phase->set_ctrl(vn, _phase->get_ctrl(p->at(0)));
       for (uint j = 0; j < p->size(); j++) {
@@ -1185,6 +1369,12 @@
         _igvn.replace_node(pm, vn);
       }
       _igvn._worklist.push(vn);
+#ifdef ASSERT
+      if (TraceNewVectors) {
+        tty->print("new Vector node: ");
+        vn->dump();
+      }
+#endif
     }
   }
 }
@@ -1207,10 +1397,10 @@
   }
 
   if (same_opd) {
-    if (opd->is_Vector() || opd->is_VectorLoad()) {
+    if (opd->is_Vector() || opd->is_LoadVector()) {
       return opd; // input is matching vector
     }
-    assert(!opd->is_VectorStore(), "such vector is not expected here");
+    assert(!opd->is_StoreVector(), "such vector is not expected here");
     // Convert scalar input to vector with the same number of elements as
     // p0's vector. Use p0's type because size of operand's container in
     // vector should match p0's size regardless operand's size.
@@ -1219,12 +1409,18 @@
 
     _phase->_igvn.register_new_node_with_optimizer(vn);
     _phase->set_ctrl(vn, _phase->get_ctrl(opd));
+#ifdef ASSERT
+    if (TraceNewVectors) {
+      tty->print("new Vector node: ");
+      vn->dump();
+    }
+#endif
     return vn;
   }
 
   // Insert pack operation
-  const Type* p0_t = velt_type(p0);
-  PackNode* pk = PackNode::make(_phase->C, opd, p0_t);
+  BasicType bt = velt_basic_type(p0);
+  PackNode* pk = PackNode::make(_phase->C, opd, vlen, bt);
   DEBUG_ONLY( const BasicType opd_bt = opd->bottom_type()->basic_type(); )
 
   for (uint i = 1; i < vlen; i++) {
@@ -1232,10 +1428,16 @@
     Node* in = pi->in(opd_idx);
     assert(my_pack(in) == NULL, "Should already have been unpacked");
     assert(opd_bt == in->bottom_type()->basic_type(), "all same type");
-    pk->add_opd(in);
+    pk->add_opd(i, in);
   }
   _phase->_igvn.register_new_node_with_optimizer(pk);
   _phase->set_ctrl(pk, _phase->get_ctrl(opd));
+#ifdef ASSERT
+    if (TraceNewVectors) {
+      tty->print("new Vector node: ");
+      pk->dump();
+    }
+#endif
   return pk;
 }
 
@@ -1273,16 +1475,15 @@
     // Insert extract operation
     _igvn.hash_delete(def);
     int def_pos = alignment(def) / data_size(def);
-    const Type* def_t = velt_type(def);
 
-    Node* ex = ExtractNode::make(_phase->C, def, def_pos, def_t);
+    Node* ex = ExtractNode::make(_phase->C, def, def_pos, velt_basic_type(def));
     _phase->_igvn.register_new_node_with_optimizer(ex);
     _phase->set_ctrl(ex, _phase->get_ctrl(def));
     _igvn.replace_input_of(use, idx, ex);
     _igvn._worklist.push(def);
 
     bb_insert_after(ex, bb_idx(def));
-    set_velt_type(ex, def_t);
+    set_velt_type(ex, velt_type(def));
   }
 }
 
@@ -1509,10 +1710,7 @@
   // Initial type
   for (int i = 0; i < _block.length(); i++) {
     Node* n = _block.at(i);
-    const Type* t  = n->is_Mem() ? Type::get_const_basic_type(n->as_Mem()->memory_type())
-                                 : _igvn.type(n);
-    const Type* vt = container_type(t);
-    set_velt_type(n, vt);
+    set_velt_type(n, container_type(n));
   }
 
   // Propagate narrowed type backwards through operations
@@ -1543,7 +1741,7 @@
             bool same_type = true;
             for (DUIterator_Fast kmax, k = in->fast_outs(kmax); k < kmax; k++) {
               Node *use = in->fast_out(k);
-              if (!in_bb(use) || velt_type(use) != vt) {
+              if (!in_bb(use) || !same_velt_type(use, n)) {
                 same_type = false;
                 break;
               }
@@ -1575,20 +1773,24 @@
   if (!p.valid()) {
     return bottom_align;
   }
+  int vw = vector_width_in_bytes(s);
+  if (vw < 2) {
+    return bottom_align; // No vectors for this type
+  }
   int offset  = p.offset_in_bytes();
   offset     += iv_adjust_in_bytes;
-  int off_rem = offset % vector_width_in_bytes();
-  int off_mod = off_rem >= 0 ? off_rem : off_rem + vector_width_in_bytes();
+  int off_rem = offset % vw;
+  int off_mod = off_rem >= 0 ? off_rem : off_rem + vw;
   return off_mod;
 }
 
 //---------------------------container_type---------------------------
 // Smallest type containing range of values
-const Type* SuperWord::container_type(const Type* t) {
-  const Type* tp = t->make_ptr();
-  if (tp && tp->isa_aryptr()) {
-    t = tp->is_aryptr()->elem();
+const Type* SuperWord::container_type(Node* n) {
+  if (n->is_Mem()) {
+    return Type::get_const_basic_type(n->as_Mem()->memory_type());
   }
+  const Type* t = _igvn.type(n);
   if (t->basic_type() == T_INT) {
     if (t->higher_equal(TypeInt::BOOL))  return TypeInt::BOOL;
     if (t->higher_equal(TypeInt::BYTE))  return TypeInt::BYTE;
@@ -1599,11 +1801,22 @@
   return t;
 }
 
+bool SuperWord::same_velt_type(Node* n1, Node* n2) {
+  const Type* vt1 = velt_type(n1);
+  const Type* vt2 = velt_type(n1);
+  if (vt1->basic_type() == T_INT && vt2->basic_type() == T_INT) {
+    // Compare vectors element sizes for integer types.
+    return data_size(n1) == data_size(n2);
+  }
+  return vt1 == vt2;
+}
+
 //-------------------------vector_opd_range-----------------------
 // (Start, end] half-open range defining which operands are vector
 void SuperWord::vector_opd_range(Node* n, uint* start, uint* end) {
   switch (n->Opcode()) {
-  case Op_LoadB:   case Op_LoadUS:
+  case Op_LoadB:   case Op_LoadUB:
+  case Op_LoadS:   case Op_LoadUS:
   case Op_LoadI:   case Op_LoadL:
   case Op_LoadF:   case Op_LoadD:
   case Op_LoadP:
@@ -1721,6 +1934,7 @@
   assert(orig_limit != NULL && _igvn.type(orig_limit) != Type::TOP, "");
 
   SWPointer align_to_ref_p(align_to_ref, this);
+  assert(align_to_ref_p.valid(), "sanity");
 
   // Given:
   //     lim0 == original pre loop limit
@@ -1773,10 +1987,12 @@
   //     N = (V - (e - lim0)) % V
   //     lim = lim0 - (V - (e - lim0)) % V
 
+  int vw = vector_width_in_bytes(align_to_ref);
   int stride   = iv_stride();
   int scale    = align_to_ref_p.scale_in_bytes();
   int elt_size = align_to_ref_p.memory_size();
-  int v_align  = vector_width_in_bytes() / elt_size;
+  int v_align  = vw / elt_size;
+  assert(v_align > 1, "sanity");
   int k        = align_to_ref_p.offset_in_bytes() / elt_size;
 
   Node *kn   = _igvn.intcon(k);
@@ -1796,6 +2012,25 @@
     _phase->_igvn.register_new_node_with_optimizer(e);
     _phase->set_ctrl(e, pre_ctrl);
   }
+  if (vw > ObjectAlignmentInBytes) {
+    // incorporate base e +/- base && Mask >>> log2(elt)
+    Node* mask = _igvn.MakeConX(~(-1 << exact_log2(vw)));
+    Node* xbase = new(_phase->C, 2) CastP2XNode(NULL, align_to_ref_p.base());
+    _phase->_igvn.register_new_node_with_optimizer(xbase);
+    Node* masked_xbase  = new (_phase->C, 3) AndXNode(xbase, mask);
+    _phase->_igvn.register_new_node_with_optimizer(masked_xbase);
+#ifdef _LP64
+    masked_xbase  = new (_phase->C, 2) ConvL2INode(masked_xbase);
+    _phase->_igvn.register_new_node_with_optimizer(masked_xbase);
+#endif
+    Node* log2_elt = _igvn.intcon(exact_log2(elt_size));
+    Node* bref     = new (_phase->C, 3) URShiftINode(masked_xbase, log2_elt);
+    _phase->_igvn.register_new_node_with_optimizer(bref);
+    _phase->set_ctrl(bref, pre_ctrl);
+    e = new (_phase->C, 3) AddINode(e, bref);
+    _phase->_igvn.register_new_node_with_optimizer(e);
+    _phase->set_ctrl(e, pre_ctrl);
+  }
 
   // compute e +/- lim0
   if (scale < 0) {
--- a/src/share/vm/opto/superword.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/superword.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -264,8 +264,14 @@
                                      _iv = lp->as_CountedLoop()->phi()->as_Phi(); }
   int      iv_stride()             { return lp()->as_CountedLoop()->stride_con(); }
 
-  int vector_width_in_bytes()      { return Matcher::vector_width_in_bytes(); }
-
+  int vector_width(Node* n) {
+    BasicType bt = velt_basic_type(n);
+    return MIN2(ABS(iv_stride()), Matcher::max_vector_size(bt));
+  }
+  int vector_width_in_bytes(Node* n) {
+    BasicType bt = velt_basic_type(n);
+    return vector_width(n)*type2aelembytes(bt);
+  }
   MemNode* align_to_ref()            { return _align_to_ref; }
   void  set_align_to_ref(MemNode* m) { _align_to_ref = m; }
 
@@ -298,7 +304,9 @@
 
   // vector element type
   const Type* velt_type(Node* n)             { return _node_info.adr_at(bb_idx(n))->_velt_type; }
+  BasicType velt_basic_type(Node* n)         { return velt_type(n)->array_element_basic_type(); }
   void set_velt_type(Node* n, const Type* t) { int i = bb_idx(n); grow_node_info(i); _node_info.adr_at(i)->_velt_type = t; }
+  bool same_velt_type(Node* n1, Node* n2);
 
   // my_pack
   Node_List* my_pack(Node* n)                { return !in_bb(n) ? NULL : _node_info.adr_at(bb_idx(n))->_my_pack; }
@@ -311,7 +319,9 @@
   // Find the adjacent memory references and create pack pairs for them.
   void find_adjacent_refs();
   // Find a memory reference to align the loop induction variable to.
-  void find_align_to_ref(Node_List &memops);
+  MemNode* find_align_to_ref(Node_List &memops);
+  // Calculate loop's iv adjustment for this memory ops.
+  int get_iv_adjustment(MemNode* mem);
   // Can the preloop align the reference to position zero in the vector?
   bool ref_is_alignable(SWPointer& p);
   // Construct dependency graph.
@@ -394,7 +404,7 @@
   // (Start, end] half-open range defining which operands are vector
   void vector_opd_range(Node* n, uint* start, uint* end);
   // Smallest type containing range of values
-  static const Type* container_type(const Type* t);
+  const Type* container_type(Node* n);
   // Adjust pre-loop limit so that in main loop, a load/store reference
   // to align_to_ref will be a position zero in the vector.
   void align_initial_loop_index(MemNode* align_to_ref);
@@ -462,6 +472,7 @@
 
   Node* base()            { return _base; }
   Node* adr()             { return _adr; }
+  MemNode* mem()          { return _mem; }
   int   scale_in_bytes()  { return _scale; }
   Node* invar()           { return _invar; }
   bool  negate_invar()    { return _negate_invar; }
--- a/src/share/vm/opto/type.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/type.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -60,6 +60,10 @@
 
   T_ILLEGAL,    // Tuple
   T_ARRAY,      // Array
+  T_ILLEGAL,    // VectorS
+  T_ILLEGAL,    // VectorD
+  T_ILLEGAL,    // VectorX
+  T_ILLEGAL,    // VectorY
 
   T_ADDRESS,    // AnyPtr   // shows up in factory methods for NULL_PTR
   T_ADDRESS,    // RawPtr
@@ -208,7 +212,7 @@
   // locking.
 
   Arena* save = current->type_arena();
-  Arena* shared_type_arena = new Arena();
+  Arena* shared_type_arena = new (mtCompiler)Arena();
 
   current->set_type_arena(shared_type_arena);
   _shared_type_dict =
@@ -414,6 +418,24 @@
   // get_zero_type() should not happen for T_CONFLICT
   _zero_type[T_CONFLICT]= NULL;
 
+  // Vector predefined types, it needs initialized _const_basic_type[].
+  if (Matcher::vector_size_supported(T_BYTE,4)) {
+    TypeVect::VECTS = TypeVect::make(T_BYTE,4);
+  }
+  if (Matcher::vector_size_supported(T_FLOAT,2)) {
+    TypeVect::VECTD = TypeVect::make(T_FLOAT,2);
+  }
+  if (Matcher::vector_size_supported(T_FLOAT,4)) {
+    TypeVect::VECTX = TypeVect::make(T_FLOAT,4);
+  }
+  if (Matcher::vector_size_supported(T_FLOAT,8)) {
+    TypeVect::VECTY = TypeVect::make(T_FLOAT,8);
+  }
+  mreg2type[Op_VecS] = TypeVect::VECTS;
+  mreg2type[Op_VecD] = TypeVect::VECTD;
+  mreg2type[Op_VecX] = TypeVect::VECTX;
+  mreg2type[Op_VecY] = TypeVect::VECTY;
+
   // Restore working type arena.
   current->set_type_arena(save);
   current->set_type_dict(NULL);
@@ -668,6 +690,10 @@
 
   Bad,          // Tuple - handled in v-call
   Bad,          // Array - handled in v-call
+  Bad,          // VectorS - handled in v-call
+  Bad,          // VectorD - handled in v-call
+  Bad,          // VectorX - handled in v-call
+  Bad,          // VectorY - handled in v-call
 
   Bad,          // AnyPtr - handled in v-call
   Bad,          // RawPtr - handled in v-call
@@ -728,8 +754,8 @@
 //------------------------------data-------------------------------------------
 const char * const Type::msg[Type::lastype] = {
   "bad","control","top","int:","long:","half", "narrowoop:",
-  "tuple:", "aryptr",
-  "anyptr:", "rawptr:", "java:", "inst:", "ary:", "klass:",
+  "tuple:", "array:", "vectors:", "vectord:", "vectorx:", "vectory:",
+  "anyptr:", "rawptr:", "java:", "inst:", "aryptr:", "klass:",
   "func", "abIO", "return_address", "memory",
   "float_top", "ftcon:", "float",
   "double_top", "dblcon:", "double",
@@ -790,7 +816,7 @@
 //------------------------------isa_oop_ptr------------------------------------
 // Return true if type is an oop pointer type.  False for raw pointers.
 static char isa_oop_ptr_tbl[Type::lastype] = {
-  0,0,0,0,0,0,0/*narrowoop*/,0/*tuple*/, 0/*ary*/,
+  0,0,0,0,0,0,0/*narrowoop*/,0/*tuple*/, 0/*array*/, 0, 0, 0, 0/*vector*/,
   0/*anyptr*/,0/*rawptr*/,1/*OopPtr*/,1/*InstPtr*/,1/*AryPtr*/,1/*KlassPtr*/,
   0/*func*/,0,0/*return_address*/,0,
   /*floats*/0,0,0, /*doubles*/0,0,0,
@@ -1926,6 +1952,121 @@
   return false;
 }
 
+//==============================TypeVect=======================================
+// Convenience common pre-built types.
+const TypeVect *TypeVect::VECTS = NULL; //  32-bit vectors
+const TypeVect *TypeVect::VECTD = NULL; //  64-bit vectors
+const TypeVect *TypeVect::VECTX = NULL; // 128-bit vectors
+const TypeVect *TypeVect::VECTY = NULL; // 256-bit vectors
+
+//------------------------------make-------------------------------------------
+const TypeVect* TypeVect::make(const Type *elem, uint length) {
+  BasicType elem_bt = elem->array_element_basic_type();
+  assert(is_java_primitive(elem_bt), "only primitive types in vector");
+  assert(length > 1 && is_power_of_2(length), "vector length is power of 2");
+  assert(Matcher::vector_size_supported(elem_bt, length), "length in range");
+  int size = length * type2aelembytes(elem_bt);
+  switch (Matcher::vector_ideal_reg(size)) {
+  case Op_VecS:
+    return (TypeVect*)(new TypeVectS(elem, length))->hashcons();
+  case Op_VecD:
+  case Op_RegD:
+    return (TypeVect*)(new TypeVectD(elem, length))->hashcons();
+  case Op_VecX:
+    return (TypeVect*)(new TypeVectX(elem, length))->hashcons();
+  case Op_VecY:
+    return (TypeVect*)(new TypeVectY(elem, length))->hashcons();
+  }
+ ShouldNotReachHere();
+  return NULL;
+}
+
+//------------------------------meet-------------------------------------------
+// Compute the MEET of two types.  It returns a new Type object.
+const Type *TypeVect::xmeet( const Type *t ) const {
+  // Perform a fast test for common case; meeting the same types together.
+  if( this == t ) return this;  // Meeting same type-rep?
+
+  // Current "this->_base" is Vector
+  switch (t->base()) {          // switch on original type
+
+  case Bottom:                  // Ye Olde Default
+    return t;
+
+  default:                      // All else is a mistake
+    typerr(t);
+
+  case VectorS:
+  case VectorD:
+  case VectorX:
+  case VectorY: {                // Meeting 2 vectors?
+    const TypeVect* v = t->is_vect();
+    assert(  base() == v->base(), "");
+    assert(length() == v->length(), "");
+    assert(element_basic_type() == v->element_basic_type(), "");
+    return TypeVect::make(_elem->xmeet(v->_elem), _length);
+  }
+  case Top:
+    break;
+  }
+  return this;
+}
+
+//------------------------------xdual------------------------------------------
+// Dual: compute field-by-field dual
+const Type *TypeVect::xdual() const {
+  return new TypeVect(base(), _elem->dual(), _length);
+}
+
+//------------------------------eq---------------------------------------------
+// Structural equality check for Type representations
+bool TypeVect::eq(const Type *t) const {
+  const TypeVect *v = t->is_vect();
+  return (_elem == v->_elem) && (_length == v->_length);
+}
+
+//------------------------------hash-------------------------------------------
+// Type-specific hashing function.
+int TypeVect::hash(void) const {
+  return (intptr_t)_elem + (intptr_t)_length;
+}
+
+//------------------------------singleton--------------------------------------
+// TRUE if Type is a singleton type, FALSE otherwise.   Singletons are simple
+// constants (Ldi nodes).  Vector is singleton if all elements are the same
+// constant value (when vector is created with Replicate code).
+bool TypeVect::singleton(void) const {
+// There is no Con node for vectors yet.
+//  return _elem->singleton();
+  return false;
+}
+
+bool TypeVect::empty(void) const {
+  return _elem->empty();
+}
+
+//------------------------------dump2------------------------------------------
+#ifndef PRODUCT
+void TypeVect::dump2(Dict &d, uint depth, outputStream *st) const {
+  switch (base()) {
+  case VectorS:
+    st->print("vectors["); break;
+  case VectorD:
+    st->print("vectord["); break;
+  case VectorX:
+    st->print("vectorx["); break;
+  case VectorY:
+    st->print("vectory["); break;
+  default:
+    ShouldNotReachHere();
+  }
+  st->print("%d]:{", _length);
+  _elem->dump2(d, depth, st);
+  st->print("}");
+}
+#endif
+
+
 //=============================================================================
 // Convenience common pre-built types.
 const TypePtr *TypePtr::NULL_PTR;
@@ -2472,18 +2613,26 @@
 //------------------------------make_from_constant-----------------------------
 // Make a java pointer from an oop constant
 const TypeOopPtr* TypeOopPtr::make_from_constant(ciObject* o, bool require_constant) {
-  if (o->is_method_data() || o->is_method() || o->is_cpcache()) {
+  if (o->is_method_data() || o->is_method()) {
     // Treat much like a typeArray of bytes, like below, but fake the type...
-    const Type* etype = (Type*)get_const_basic_type(T_BYTE);
+    const BasicType bt = T_BYTE;
+    const Type* etype = get_const_basic_type(bt);
     const TypeAry* arr0 = TypeAry::make(etype, TypeInt::POS);
-    ciKlass *klass = ciTypeArrayKlass::make((BasicType) T_BYTE);
-    assert(o->can_be_constant(), "method data oops should be tenured");
-    const TypeAryPtr* arr = TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0);
-    return arr;
+    ciKlass* klass = ciArrayKlass::make(ciType::make(bt));
+    assert(o->can_be_constant(), "should be tenured");
+    return TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0);
+  } else if (o->is_cpcache()) {
+    // Treat much like a objArray, like below, but fake the type...
+    const BasicType bt = T_OBJECT;
+    const Type* etype = get_const_basic_type(bt);
+    const TypeAry* arr0 = TypeAry::make(etype, TypeInt::POS);
+    ciKlass* klass = ciArrayKlass::make(ciType::make(bt));
+    assert(o->can_be_constant(), "should be tenured");
+    return TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0);
   } else {
     assert(o->is_java_object(), "must be java language object");
     assert(!o->is_null_object(), "null object not yet handled here.");
-    ciKlass *klass = o->klass();
+    ciKlass* klass = o->klass();
     if (klass->is_instance_klass()) {
       // Element is an instance
       if (require_constant) {
@@ -2494,8 +2643,7 @@
       return TypeInstPtr::make(o);
     } else if (klass->is_obj_array_klass()) {
       // Element is an object array. Recursively call ourself.
-      const Type *etype =
-        TypeOopPtr::make_from_klass_raw(klass->as_obj_array_klass()->element_klass());
+      const Type *etype = make_from_klass_raw(klass->as_obj_array_klass()->element_klass());
       const TypeAry* arr0 = TypeAry::make(etype, TypeInt::make(o->as_array()->length()));
       // We used to pass NotNull in here, asserting that the sub-arrays
       // are all not-null.  This is not true in generally, as code can
@@ -2505,12 +2653,10 @@
       } else if (!o->should_be_constant()) {
         return TypeAryPtr::make(TypePtr::NotNull, arr0, klass, true, 0);
       }
-      const TypeAryPtr* arr = TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0);
-      return arr;
+      return TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0);
     } else if (klass->is_type_array_klass()) {
       // Element is an typeArray
-      const Type* etype =
-        (Type*)get_const_basic_type(klass->as_type_array_klass()->element_type());
+      const Type* etype = get_const_basic_type(klass->as_type_array_klass()->element_type());
       const TypeAry* arr0 = TypeAry::make(etype, TypeInt::make(o->as_array()->length()));
       // We used to pass NotNull in here, asserting that the array pointer
       // is not-null. That was not true in general.
@@ -2519,12 +2665,11 @@
       } else if (!o->should_be_constant()) {
         return TypeAryPtr::make(TypePtr::NotNull, arr0, klass, true, 0);
       }
-      const TypeAryPtr* arr = TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0);
-      return arr;
+      return TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0);
     }
   }
 
-  ShouldNotReachHere();
+  fatal("unhandled object type");
   return NULL;
 }
 
@@ -4142,7 +4287,7 @@
 // Print a 'flattened' signature
 static const char * const flat_type_msg[Type::lastype] = {
   "bad","control","top","int","long","_", "narrowoop",
-  "tuple:", "array:",
+  "tuple:", "array:", "vectors:", "vectord:", "vectorx:", "vectory:",
   "ptr", "rawptr", "ptr", "ptr", "ptr", "ptr",
   "func", "abIO", "return_address", "mem",
   "float_top", "ftcon:", "flt",
--- a/src/share/vm/opto/type.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/type.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -51,6 +51,11 @@
 class   TypeNarrowOop;
 class   TypeAry;
 class   TypeTuple;
+class   TypeVect;
+class     TypeVectS;
+class     TypeVectD;
+class     TypeVectX;
+class     TypeVectY;
 class   TypePtr;
 class     TypeRawPtr;
 class     TypeOopPtr;
@@ -78,6 +83,10 @@
 
     Tuple,                      // Method signature or object layout
     Array,                      // Array types
+    VectorS,                    //  32bit Vector types
+    VectorD,                    //  64bit Vector types
+    VectorX,                    // 128bit Vector types
+    VectorY,                    // 256bit Vector types
 
     AnyPtr,                     // Any old raw, klass, inst, or array pointer
     RawPtr,                     // Raw (non-oop) pointers
@@ -222,6 +231,8 @@
   const TypeF      *isa_float_constant() const;  // Returns NULL if not a FloatCon
   const TypeTuple  *is_tuple() const;            // Collection of fields, NOT a pointer
   const TypeAry    *is_ary() const;              // Array, NOT array pointer
+  const TypeVect   *is_vect() const;             // Vector
+  const TypeVect   *isa_vect() const;            // Returns NULL if not a Vector
   const TypePtr    *is_ptr() const;              // Asserts it is a ptr type
   const TypePtr    *isa_ptr() const;             // Returns NULL if not ptr type
   const TypeRawPtr *isa_rawptr() const;          // NOT Java oop
@@ -574,6 +585,69 @@
 #endif
 };
 
+//------------------------------TypeVect---------------------------------------
+// Class of Vector Types
+class TypeVect : public Type {
+  const Type*   _elem;  // Vector's element type
+  const uint  _length;  // Elements in vector (power of 2)
+
+protected:
+  TypeVect(TYPES t, const Type* elem, uint length) : Type(t),
+    _elem(elem), _length(length) {}
+
+public:
+  const Type* element_type() const { return _elem; }
+  BasicType element_basic_type() const { return _elem->array_element_basic_type(); }
+  uint length() const { return _length; }
+  uint length_in_bytes() const {
+   return _length * type2aelembytes(element_basic_type());
+  }
+
+  virtual bool eq(const Type *t) const;
+  virtual int  hash() const;             // Type specific hashing
+  virtual bool singleton(void) const;    // TRUE if type is a singleton
+  virtual bool empty(void) const;        // TRUE if type is vacuous
+
+  static const TypeVect *make(const BasicType elem_bt, uint length) {
+    // Use bottom primitive type.
+    return make(get_const_basic_type(elem_bt), length);
+  }
+  // Used directly by Replicate nodes to construct singleton vector.
+  static const TypeVect *make(const Type* elem, uint length);
+
+  virtual const Type *xmeet( const Type *t) const;
+  virtual const Type *xdual() const;     // Compute dual right now.
+
+  static const TypeVect *VECTS;
+  static const TypeVect *VECTD;
+  static const TypeVect *VECTX;
+  static const TypeVect *VECTY;
+
+#ifndef PRODUCT
+  virtual void dump2(Dict &d, uint, outputStream *st) const; // Specialized per-Type dumping
+#endif
+};
+
+class TypeVectS : public TypeVect {
+  friend class TypeVect;
+  TypeVectS(const Type* elem, uint length) : TypeVect(VectorS, elem, length) {}
+};
+
+class TypeVectD : public TypeVect {
+  friend class TypeVect;
+  TypeVectD(const Type* elem, uint length) : TypeVect(VectorD, elem, length) {}
+};
+
+class TypeVectX : public TypeVect {
+  friend class TypeVect;
+  TypeVectX(const Type* elem, uint length) : TypeVect(VectorX, elem, length) {}
+};
+
+class TypeVectY : public TypeVect {
+  friend class TypeVect;
+  TypeVectY(const Type* elem, uint length) : TypeVect(VectorY, elem, length) {}
+};
+
 //------------------------------TypePtr----------------------------------------
 // Class of machine Pointer Types: raw data, instances or arrays.
 // If the _base enum is AnyPtr, then this refers to all of the above.
@@ -1113,6 +1187,15 @@
   return (TypeAry*)this;
 }
 
+inline const TypeVect *Type::is_vect() const {
+  assert( _base >= VectorS && _base <= VectorY, "Not a Vector" );
+  return (TypeVect*)this;
+}
+
+inline const TypeVect *Type::isa_vect() const {
+  return (_base >= VectorS && _base <= VectorY) ? (TypeVect*)this : NULL;
+}
+
 inline const TypePtr *Type::is_ptr() const {
   // AnyPtr is the first Ptr and KlassPtr the last, with no non-ptrs between.
   assert(_base >= AnyPtr && _base <= KlassPtr, "Not a pointer");
--- a/src/share/vm/opto/vectornode.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/vectornode.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -28,147 +28,16 @@
 
 //------------------------------VectorNode--------------------------------------
 
-// Return vector type for an element type and vector length.
-const Type* VectorNode::vect_type(BasicType elt_bt, uint len) {
-  assert(len <= VectorNode::max_vlen(elt_bt), "len in range");
-  switch(elt_bt) {
-  case T_BOOLEAN:
-  case T_BYTE:
-    switch(len) {
-    case 2:  return TypeInt::CHAR;
-    case 4:  return TypeInt::INT;
-    case 8:  return TypeLong::LONG;
-    }
-    break;
-  case T_CHAR:
-  case T_SHORT:
-    switch(len) {
-    case 2:  return TypeInt::INT;
-    case 4:  return TypeLong::LONG;
-    }
-    break;
-  case T_INT:
-    switch(len) {
-    case 2:  return TypeLong::LONG;
-    }
-    break;
-  case T_LONG:
-    break;
-  case T_FLOAT:
-    switch(len) {
-    case 2:  return Type::DOUBLE;
-    }
-    break;
-  case T_DOUBLE:
-    break;
-  }
-  ShouldNotReachHere();
-  return NULL;
-}
-
-// Scalar promotion
-VectorNode* VectorNode::scalar2vector(Compile* C, Node* s, uint vlen, const Type* opd_t) {
-  BasicType bt = opd_t->array_element_basic_type();
-  assert(vlen <= VectorNode::max_vlen(bt), "vlen in range");
-  switch (bt) {
-  case T_BOOLEAN:
-  case T_BYTE:
-    if (vlen == 16) return new (C, 2) Replicate16BNode(s);
-    if (vlen ==  8) return new (C, 2) Replicate8BNode(s);
-    if (vlen ==  4) return new (C, 2) Replicate4BNode(s);
-    break;
-  case T_CHAR:
-    if (vlen == 8) return new (C, 2) Replicate8CNode(s);
-    if (vlen == 4) return new (C, 2) Replicate4CNode(s);
-    if (vlen == 2) return new (C, 2) Replicate2CNode(s);
-    break;
-  case T_SHORT:
-    if (vlen == 8) return new (C, 2) Replicate8SNode(s);
-    if (vlen == 4) return new (C, 2) Replicate4SNode(s);
-    if (vlen == 2) return new (C, 2) Replicate2SNode(s);
-    break;
-  case T_INT:
-    if (vlen == 4) return new (C, 2) Replicate4INode(s);
-    if (vlen == 2) return new (C, 2) Replicate2INode(s);
-    break;
-  case T_LONG:
-    if (vlen == 2) return new (C, 2) Replicate2LNode(s);
-    break;
-  case T_FLOAT:
-    if (vlen == 4) return new (C, 2) Replicate4FNode(s);
-    if (vlen == 2) return new (C, 2) Replicate2FNode(s);
-    break;
-  case T_DOUBLE:
-    if (vlen == 2) return new (C, 2) Replicate2DNode(s);
-    break;
-  }
-  ShouldNotReachHere();
-  return NULL;
-}
-
-// Return initial Pack node. Additional operands added with add_opd() calls.
-PackNode* PackNode::make(Compile* C, Node* s, const Type* opd_t) {
-  BasicType bt = opd_t->array_element_basic_type();
-  switch (bt) {
-  case T_BOOLEAN:
-  case T_BYTE:
-    return new (C, 2) PackBNode(s);
-  case T_CHAR:
-    return new (C, 2) PackCNode(s);
-  case T_SHORT:
-    return new (C, 2) PackSNode(s);
-  case T_INT:
-    return new (C, 2) PackINode(s);
-  case T_LONG:
-    return new (C, 2) PackLNode(s);
-  case T_FLOAT:
-    return new (C, 2) PackFNode(s);
-  case T_DOUBLE:
-    return new (C, 2) PackDNode(s);
-  }
-  ShouldNotReachHere();
-  return NULL;
-}
-
-// Create a binary tree form for Packs. [lo, hi) (half-open) range
-Node* PackNode::binaryTreePack(Compile* C, int lo, int hi) {
-  int ct = hi - lo;
-  assert(is_power_of_2(ct), "power of 2");
-  int mid = lo + ct/2;
-  Node* n1 = ct == 2 ? in(lo)   : binaryTreePack(C, lo,  mid);
-  Node* n2 = ct == 2 ? in(lo+1) : binaryTreePack(C, mid, hi );
-  int rslt_bsize = ct * type2aelembytes(elt_basic_type());
-  if (bottom_type()->is_floatingpoint()) {
-    switch (rslt_bsize) {
-    case  8: return new (C, 3) PackFNode(n1, n2);
-    case 16: return new (C, 3) PackDNode(n1, n2);
-    }
-  } else {
-    assert(bottom_type()->isa_int() || bottom_type()->isa_long(), "int or long");
-    switch (rslt_bsize) {
-    case  2: return new (C, 3) Pack2x1BNode(n1, n2);
-    case  4: return new (C, 3) Pack2x2BNode(n1, n2);
-    case  8: return new (C, 3) PackINode(n1, n2);
-    case 16: return new (C, 3) PackLNode(n1, n2);
-    }
-  }
-  ShouldNotReachHere();
-  return NULL;
-}
-
 // Return the vector operator for the specified scalar operation
-// and vector length.  One use is to check if the code generator
+// and vector length.  Also used to check if the code generator
 // supports the vector operation.
-int VectorNode::opcode(int sopc, uint vlen, const Type* opd_t) {
-  BasicType bt = opd_t->array_element_basic_type();
-  if (!(is_power_of_2(vlen) && vlen <= max_vlen(bt)))
-    return 0; // unimplemented
+int VectorNode::opcode(int sopc, uint vlen, BasicType bt) {
   switch (sopc) {
   case Op_AddI:
     switch (bt) {
     case T_BOOLEAN:
     case T_BYTE:      return Op_AddVB;
-    case T_CHAR:      return Op_AddVC;
+    case T_CHAR:
     case T_SHORT:     return Op_AddVS;
     case T_INT:       return Op_AddVI;
     }
@@ -186,7 +55,7 @@
     switch (bt) {
     case T_BOOLEAN:
     case T_BYTE:   return Op_SubVB;
-    case T_CHAR:   return Op_SubVC;
+    case T_CHAR:
     case T_SHORT:  return Op_SubVS;
     case T_INT:    return Op_SubVI;
     }
@@ -216,18 +85,18 @@
     switch (bt) {
     case T_BOOLEAN:
     case T_BYTE:   return Op_LShiftVB;
-    case T_CHAR:   return Op_LShiftVC;
+    case T_CHAR:
     case T_SHORT:  return Op_LShiftVS;
     case T_INT:    return Op_LShiftVI;
     }
     ShouldNotReachHere();
-  case Op_URShiftI:
+  case Op_RShiftI:
     switch (bt) {
     case T_BOOLEAN:
-    case T_BYTE:   return Op_URShiftVB;
-    case T_CHAR:   return Op_URShiftVC;
-    case T_SHORT:  return Op_URShiftVS;
-    case T_INT:    return Op_URShiftVI;
+    case T_BYTE:   return Op_RShiftVB;
+    case T_CHAR:
+    case T_SHORT:  return Op_RShiftVS;
+    case T_INT:    return Op_RShiftVI;
     }
     ShouldNotReachHere();
   case Op_AndI:
@@ -241,13 +110,14 @@
     return Op_XorV;
 
   case Op_LoadB:
+  case Op_LoadUB:
   case Op_LoadUS:
   case Op_LoadS:
   case Op_LoadI:
   case Op_LoadL:
   case Op_LoadF:
   case Op_LoadD:
-    return VectorLoadNode::opcode(sopc, vlen);
+    return Op_LoadVector;
 
   case Op_StoreB:
   case Op_StoreC:
@@ -255,211 +125,170 @@
   case Op_StoreL:
   case Op_StoreF:
   case Op_StoreD:
-    return VectorStoreNode::opcode(sopc, vlen);
-  }
-  return 0; // Unimplemented
-}
-
-// Helper for above.
-int VectorLoadNode::opcode(int sopc, uint vlen) {
-  switch (sopc) {
-  case Op_LoadB:
-    switch (vlen) {
-    case  2:       return 0; // Unimplemented
-    case  4:       return Op_Load4B;
-    case  8:       return Op_Load8B;
-    case 16:       return Op_Load16B;
-    }
-    break;
-  case Op_LoadUS:
-    switch (vlen) {
-    case  2:       return Op_Load2C;
-    case  4:       return Op_Load4C;
-    case  8:       return Op_Load8C;
-    }
-    break;
-  case Op_LoadS:
-    switch (vlen) {
-    case  2:       return Op_Load2S;
-    case  4:       return Op_Load4S;
-    case  8:       return Op_Load8S;
-    }
-    break;
-  case Op_LoadI:
-    switch (vlen) {
-    case  2:       return Op_Load2I;
-    case  4:       return Op_Load4I;
-    }
-    break;
-  case Op_LoadL:
-    if (vlen == 2) return Op_Load2L;
-    break;
-  case Op_LoadF:
-    switch (vlen) {
-    case  2:       return Op_Load2F;
-    case  4:       return Op_Load4F;
-    }
-    break;
-  case Op_LoadD:
-    if (vlen == 2) return Op_Load2D;
-    break;
+    return Op_StoreVector;
   }
   return 0; // Unimplemented
 }
 
-// Helper for above
-int VectorStoreNode::opcode(int sopc, uint vlen) {
-  switch (sopc) {
-  case Op_StoreB:
-    switch (vlen) {
-    case  2:       return 0; // Unimplemented
-    case  4:       return Op_Store4B;
-    case  8:       return Op_Store8B;
-    case 16:       return Op_Store16B;
-    }
-    break;
-  case Op_StoreC:
-    switch (vlen) {
-    case  2:       return Op_Store2C;
-    case  4:       return Op_Store4C;
-    case  8:       return Op_Store8C;
-    }
-    break;
-  case Op_StoreI:
-    switch (vlen) {
-    case  2:       return Op_Store2I;
-    case  4:       return Op_Store4I;
-    }
-    break;
-  case Op_StoreL:
-    if (vlen == 2) return Op_Store2L;
-    break;
-  case Op_StoreF:
-    switch (vlen) {
-    case  2:       return Op_Store2F;
-    case  4:       return Op_Store4F;
-    }
-    break;
-  case Op_StoreD:
-    if (vlen == 2) return Op_Store2D;
-    break;
+bool VectorNode::implemented(int opc, uint vlen, BasicType bt) {
+  if (is_java_primitive(bt) &&
+      (vlen > 1) && is_power_of_2(vlen) &&
+      Matcher::vector_size_supported(bt, vlen)) {
+    int vopc = VectorNode::opcode(opc, vlen, bt);
+    return vopc > 0 && Matcher::has_match_rule(vopc);
   }
-  return 0; // Unimplemented
+  return false;
 }
 
 // Return the vector version of a scalar operation node.
-VectorNode* VectorNode::make(Compile* C, int sopc, Node* n1, Node* n2, uint vlen, const Type* opd_t) {
-  int vopc = opcode(sopc, vlen, opd_t);
+VectorNode* VectorNode::make(Compile* C, int opc, Node* n1, Node* n2, uint vlen, BasicType bt) {
+  const TypeVect* vt = TypeVect::make(bt, vlen);
+  int vopc = VectorNode::opcode(opc, vlen, bt);
 
   switch (vopc) {
-  case Op_AddVB: return new (C, 3) AddVBNode(n1, n2, vlen);
-  case Op_AddVC: return new (C, 3) AddVCNode(n1, n2, vlen);
-  case Op_AddVS: return new (C, 3) AddVSNode(n1, n2, vlen);
-  case Op_AddVI: return new (C, 3) AddVINode(n1, n2, vlen);
-  case Op_AddVL: return new (C, 3) AddVLNode(n1, n2, vlen);
-  case Op_AddVF: return new (C, 3) AddVFNode(n1, n2, vlen);
-  case Op_AddVD: return new (C, 3) AddVDNode(n1, n2, vlen);
+  case Op_AddVB: return new (C, 3) AddVBNode(n1, n2, vt);
+  case Op_AddVS: return new (C, 3) AddVSNode(n1, n2, vt);
+  case Op_AddVI: return new (C, 3) AddVINode(n1, n2, vt);
+  case Op_AddVL: return new (C, 3) AddVLNode(n1, n2, vt);
+  case Op_AddVF: return new (C, 3) AddVFNode(n1, n2, vt);
+  case Op_AddVD: return new (C, 3) AddVDNode(n1, n2, vt);
+
+  case Op_SubVB: return new (C, 3) SubVBNode(n1, n2, vt);
+  case Op_SubVS: return new (C, 3) SubVSNode(n1, n2, vt);
+  case Op_SubVI: return new (C, 3) SubVINode(n1, n2, vt);
+  case Op_SubVL: return new (C, 3) SubVLNode(n1, n2, vt);
+  case Op_SubVF: return new (C, 3) SubVFNode(n1, n2, vt);
+  case Op_SubVD: return new (C, 3) SubVDNode(n1, n2, vt);
 
-  case Op_SubVB: return new (C, 3) SubVBNode(n1, n2, vlen);
-  case Op_SubVC: return new (C, 3) SubVCNode(n1, n2, vlen);
-  case Op_SubVS: return new (C, 3) SubVSNode(n1, n2, vlen);
-  case Op_SubVI: return new (C, 3) SubVINode(n1, n2, vlen);
-  case Op_SubVL: return new (C, 3) SubVLNode(n1, n2, vlen);
-  case Op_SubVF: return new (C, 3) SubVFNode(n1, n2, vlen);
-  case Op_SubVD: return new (C, 3) SubVDNode(n1, n2, vlen);
+  case Op_MulVF: return new (C, 3) MulVFNode(n1, n2, vt);
+  case Op_MulVD: return new (C, 3) MulVDNode(n1, n2, vt);
+
+  case Op_DivVF: return new (C, 3) DivVFNode(n1, n2, vt);
+  case Op_DivVD: return new (C, 3) DivVDNode(n1, n2, vt);
+
+  case Op_LShiftVB: return new (C, 3) LShiftVBNode(n1, n2, vt);
+  case Op_LShiftVS: return new (C, 3) LShiftVSNode(n1, n2, vt);
+  case Op_LShiftVI: return new (C, 3) LShiftVINode(n1, n2, vt);
+
+  case Op_RShiftVB: return new (C, 3) RShiftVBNode(n1, n2, vt);
+  case Op_RShiftVS: return new (C, 3) RShiftVSNode(n1, n2, vt);
+  case Op_RShiftVI: return new (C, 3) RShiftVINode(n1, n2, vt);
 
-  case Op_MulVF: return new (C, 3) MulVFNode(n1, n2, vlen);
-  case Op_MulVD: return new (C, 3) MulVDNode(n1, n2, vlen);
+  case Op_AndV: return new (C, 3) AndVNode(n1, n2, vt);
+  case Op_OrV:  return new (C, 3) OrVNode (n1, n2, vt);
+  case Op_XorV: return new (C, 3) XorVNode(n1, n2, vt);
+  }
+  ShouldNotReachHere();
+  return NULL;
 
-  case Op_DivVF: return new (C, 3) DivVFNode(n1, n2, vlen);
-  case Op_DivVD: return new (C, 3) DivVDNode(n1, n2, vlen);
+}
 
-  case Op_LShiftVB: return new (C, 3) LShiftVBNode(n1, n2, vlen);
-  case Op_LShiftVC: return new (C, 3) LShiftVCNode(n1, n2, vlen);
-  case Op_LShiftVS: return new (C, 3) LShiftVSNode(n1, n2, vlen);
-  case Op_LShiftVI: return new (C, 3) LShiftVINode(n1, n2, vlen);
-
-  case Op_URShiftVB: return new (C, 3) URShiftVBNode(n1, n2, vlen);
-  case Op_URShiftVC: return new (C, 3) URShiftVCNode(n1, n2, vlen);
-  case Op_URShiftVS: return new (C, 3) URShiftVSNode(n1, n2, vlen);
-  case Op_URShiftVI: return new (C, 3) URShiftVINode(n1, n2, vlen);
-
-  case Op_AndV: return new (C, 3) AndVNode(n1, n2, vlen, opd_t->array_element_basic_type());
-  case Op_OrV:  return new (C, 3) OrVNode (n1, n2, vlen, opd_t->array_element_basic_type());
-  case Op_XorV: return new (C, 3) XorVNode(n1, n2, vlen, opd_t->array_element_basic_type());
+// Scalar promotion
+VectorNode* VectorNode::scalar2vector(Compile* C, Node* s, uint vlen, const Type* opd_t) {
+  BasicType bt = opd_t->array_element_basic_type();
+  const TypeVect* vt = opd_t->singleton() ? TypeVect::make(opd_t, vlen)
+                                          : TypeVect::make(bt, vlen);
+  switch (bt) {
+  case T_BOOLEAN:
+  case T_BYTE:
+    return new (C, 2) ReplicateBNode(s, vt);
+  case T_CHAR:
+  case T_SHORT:
+    return new (C, 2) ReplicateSNode(s, vt);
+  case T_INT:
+    return new (C, 2) ReplicateINode(s, vt);
+  case T_LONG:
+    return new (C, 2) ReplicateLNode(s, vt);
+  case T_FLOAT:
+    return new (C, 2) ReplicateFNode(s, vt);
+  case T_DOUBLE:
+    return new (C, 2) ReplicateDNode(s, vt);
   }
   ShouldNotReachHere();
   return NULL;
 }
 
-// Return the vector version of a scalar load node.
-VectorLoadNode* VectorLoadNode::make(Compile* C, int opc, Node* ctl, Node* mem,
-                                     Node* adr, const TypePtr* atyp, uint vlen) {
-  int vopc = opcode(opc, vlen);
-
-  switch(vopc) {
-  case Op_Load16B: return new (C, 3) Load16BNode(ctl, mem, adr, atyp);
-  case Op_Load8B:  return new (C, 3) Load8BNode(ctl, mem, adr, atyp);
-  case Op_Load4B:  return new (C, 3) Load4BNode(ctl, mem, adr, atyp);
-
-  case Op_Load8C:  return new (C, 3) Load8CNode(ctl, mem, adr, atyp);
-  case Op_Load4C:  return new (C, 3) Load4CNode(ctl, mem, adr, atyp);
-  case Op_Load2C:  return new (C, 3) Load2CNode(ctl, mem, adr, atyp);
-
-  case Op_Load8S:  return new (C, 3) Load8SNode(ctl, mem, adr, atyp);
-  case Op_Load4S:  return new (C, 3) Load4SNode(ctl, mem, adr, atyp);
-  case Op_Load2S:  return new (C, 3) Load2SNode(ctl, mem, adr, atyp);
-
-  case Op_Load4I:  return new (C, 3) Load4INode(ctl, mem, adr, atyp);
-  case Op_Load2I:  return new (C, 3) Load2INode(ctl, mem, adr, atyp);
-
-  case Op_Load2L:  return new (C, 3) Load2LNode(ctl, mem, adr, atyp);
-
-  case Op_Load4F:  return new (C, 3) Load4FNode(ctl, mem, adr, atyp);
-  case Op_Load2F:  return new (C, 3) Load2FNode(ctl, mem, adr, atyp);
-
-  case Op_Load2D:  return new (C, 3) Load2DNode(ctl, mem, adr, atyp);
+// Return initial Pack node. Additional operands added with add_opd() calls.
+PackNode* PackNode::make(Compile* C, Node* s, uint vlen, BasicType bt) {
+  const TypeVect* vt = TypeVect::make(bt, vlen);
+  switch (bt) {
+  case T_BOOLEAN:
+  case T_BYTE:
+    return new (C, vlen+1) PackBNode(s, vt);
+  case T_CHAR:
+  case T_SHORT:
+    return new (C, vlen+1) PackSNode(s, vt);
+  case T_INT:
+    return new (C, vlen+1) PackINode(s, vt);
+  case T_LONG:
+    return new (C, vlen+1) PackLNode(s, vt);
+  case T_FLOAT:
+    return new (C, vlen+1) PackFNode(s, vt);
+  case T_DOUBLE:
+    return new (C, vlen+1) PackDNode(s, vt);
   }
   ShouldNotReachHere();
   return NULL;
 }
 
-// Return the vector version of a scalar store node.
-VectorStoreNode* VectorStoreNode::make(Compile* C, int opc, Node* ctl, Node* mem,
-                                       Node* adr, const TypePtr* atyp, Node* val,
-                                       uint vlen) {
-  int vopc = opcode(opc, vlen);
+// Create a binary tree form for Packs. [lo, hi) (half-open) range
+Node* PackNode::binaryTreePack(Compile* C, int lo, int hi) {
+  int ct = hi - lo;
+  assert(is_power_of_2(ct), "power of 2");
+  if (ct == 2) {
+    PackNode* pk = PackNode::make(C, in(lo), 2, vect_type()->element_basic_type());
+    pk->add_opd(1, in(lo+1));
+    return pk;
 
-  switch(vopc) {
-  case Op_Store16B: return new (C, 4) Store16BNode(ctl, mem, adr, atyp, val);
-  case Op_Store8B: return new (C, 4) Store8BNode(ctl, mem, adr, atyp, val);
-  case Op_Store4B: return new (C, 4) Store4BNode(ctl, mem, adr, atyp, val);
+  } else {
+    int mid = lo + ct/2;
+    Node* n1 = binaryTreePack(C, lo,  mid);
+    Node* n2 = binaryTreePack(C, mid, hi );
 
-  case Op_Store8C: return new (C, 4) Store8CNode(ctl, mem, adr, atyp, val);
-  case Op_Store4C: return new (C, 4) Store4CNode(ctl, mem, adr, atyp, val);
-  case Op_Store2C: return new (C, 4) Store2CNode(ctl, mem, adr, atyp, val);
-
-  case Op_Store4I: return new (C, 4) Store4INode(ctl, mem, adr, atyp, val);
-  case Op_Store2I: return new (C, 4) Store2INode(ctl, mem, adr, atyp, val);
-
-  case Op_Store2L: return new (C, 4) Store2LNode(ctl, mem, adr, atyp, val);
-
-  case Op_Store4F: return new (C, 4) Store4FNode(ctl, mem, adr, atyp, val);
-  case Op_Store2F: return new (C, 4) Store2FNode(ctl, mem, adr, atyp, val);
-
-  case Op_Store2D: return new (C, 4) Store2DNode(ctl, mem, adr, atyp, val);
+    BasicType bt = vect_type()->element_basic_type();
+    switch (bt) {
+    case T_BOOLEAN:
+    case T_BYTE:
+      return new (C, 3) PackSNode(n1, n2, TypeVect::make(T_SHORT, 2));
+    case T_CHAR:
+    case T_SHORT:
+      return new (C, 3) PackINode(n1, n2, TypeVect::make(T_INT, 2));
+    case T_INT:
+      return new (C, 3) PackLNode(n1, n2, TypeVect::make(T_LONG, 2));
+    case T_LONG:
+      return new (C, 3) Pack2LNode(n1, n2, TypeVect::make(T_LONG, 2));
+    case T_FLOAT:
+      return new (C, 3) PackDNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
+    case T_DOUBLE:
+      return new (C, 3) Pack2DNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
+    }
+    ShouldNotReachHere();
   }
-  ShouldNotReachHere();
   return NULL;
 }
 
+// Return the vector version of a scalar load node.
+LoadVectorNode* LoadVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem,
+                                     Node* adr, const TypePtr* atyp, uint vlen, BasicType bt) {
+  const TypeVect* vt = TypeVect::make(bt, vlen);
+  return new (C, 3) LoadVectorNode(ctl, mem, adr, atyp, vt);
+  return NULL;
+}
+
+// Return the vector version of a scalar store node.
+StoreVectorNode* StoreVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem,
+                                       Node* adr, const TypePtr* atyp, Node* val,
+                                       uint vlen) {
+  return new (C, 4) StoreVectorNode(ctl, mem, adr, atyp, val);
+}
+
 // Extract a scalar element of vector.
-Node* ExtractNode::make(Compile* C, Node* v, uint position, const Type* opd_t) {
-  BasicType bt = opd_t->array_element_basic_type();
-  assert(position < VectorNode::max_vlen(bt), "pos in range");
+Node* ExtractNode::make(Compile* C, Node* v, uint position, BasicType bt) {
+  assert((int)position < Matcher::max_vector_size(bt), "pos in range");
   ConINode* pos = ConINode::make(C, (int)position);
   switch (bt) {
   case T_BOOLEAN:
+    return new (C, 3) ExtractUBNode(v, pos);
   case T_BYTE:
     return new (C, 3) ExtractBNode(v, pos);
   case T_CHAR:
@@ -478,3 +307,4 @@
   ShouldNotReachHere();
   return NULL;
 }
+
--- a/src/share/vm/opto/vectornode.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/opto/vectornode.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -31,48 +31,32 @@
 
 //------------------------------VectorNode--------------------------------------
 // Vector Operation
-class VectorNode : public Node {
-  virtual uint size_of() const { return sizeof(*this); }
- protected:
-  uint _length; // vector length
-  virtual BasicType elt_basic_type() const = 0; // Vector element basic type
+class VectorNode : public TypeNode {
+ public:
 
-  static const Type* vect_type(BasicType elt_bt, uint len);
-  static const Type* vect_type(const Type* elt_type, uint len) {
-    return vect_type(elt_type->array_element_basic_type(), len);
+  VectorNode(Node* n1, const TypeVect* vt) : TypeNode(vt, 2) {
+    init_class_id(Class_Vector);
+    init_req(1, n1);
+  }
+  VectorNode(Node* n1, Node* n2, const TypeVect* vt) : TypeNode(vt, 3) {
+    init_class_id(Class_Vector);
+    init_req(1, n1);
+    init_req(2, n2);
   }
 
- public:
-  friend class VectorLoadNode;  // For vect_type
-  friend class VectorStoreNode; // ditto.
+  const TypeVect* vect_type() const { return type()->is_vect(); }
+  uint length() const { return vect_type()->length(); } // Vector length
 
-  VectorNode(Node* n1, uint vlen) : Node(NULL, n1), _length(vlen) {
-    init_class_id(Class_Vector);
-  }
-  VectorNode(Node* n1, Node* n2, uint vlen) : Node(NULL, n1, n2), _length(vlen) {
-    init_class_id(Class_Vector);
-  }
   virtual int Opcode() const;
 
-  uint length() const { return _length; } // Vector length
-
-  static uint max_vlen(BasicType bt) { // max vector length
-    return (uint)(Matcher::vector_width_in_bytes() / type2aelembytes(bt));
-  }
-
-  // Element and vector type
-  const Type* elt_type()  const { return Type::get_const_basic_type(elt_basic_type()); }
-  const Type* vect_type() const { return vect_type(elt_basic_type(), length()); }
-
-  virtual const Type *bottom_type() const { return vect_type(); }
-  virtual uint        ideal_reg()   const { return Matcher::vector_ideal_reg(); }
-
-  // Vector opcode from scalar opcode
-  static int opcode(int sopc, uint vlen, const Type* opd_t);
+  virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(vect_type()->length_in_bytes()); }
 
   static VectorNode* scalar2vector(Compile* C, Node* s, uint vlen, const Type* opd_t);
 
-  static VectorNode* make(Compile* C, int sopc, Node* n1, Node* n2, uint vlen, const Type* elt_t);
+  static VectorNode* make(Compile* C, int opc, Node* n1, Node* n2, uint vlen, BasicType bt);
+
+  static int  opcode(int opc, uint vlen, BasicType bt);
+  static bool implemented(int opc, uint vlen, BasicType bt);
 
 };
 
@@ -81,981 +65,393 @@
 //------------------------------AddVBNode---------------------------------------
 // Vector add byte
 class AddVBNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_BYTE; }
  public:
-  AddVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
-  virtual int Opcode() const;
-};
-
-//------------------------------AddVCNode---------------------------------------
-// Vector add char
-class AddVCNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
-  AddVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  AddVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------AddVSNode---------------------------------------
-// Vector add short
+// Vector add char/short
 class AddVSNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_SHORT; }
  public:
-  AddVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  AddVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------AddVINode---------------------------------------
 // Vector add int
 class AddVINode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_INT; }
  public:
-  AddVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  AddVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------AddVLNode---------------------------------------
 // Vector add long
 class AddVLNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_LONG; }
  public:
-  AddVLNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  AddVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------AddVFNode---------------------------------------
 // Vector add float
 class AddVFNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_FLOAT; }
  public:
-  AddVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  AddVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------AddVDNode---------------------------------------
 // Vector add double
 class AddVDNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_DOUBLE; }
  public:
-  AddVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  AddVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------SubVBNode---------------------------------------
 // Vector subtract byte
 class SubVBNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_BYTE; }
  public:
-  SubVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
-  virtual int Opcode() const;
-};
-
-//------------------------------SubVCNode---------------------------------------
-// Vector subtract char
-class SubVCNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
-  SubVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  SubVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------SubVSNode---------------------------------------
 // Vector subtract short
 class SubVSNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_SHORT; }
  public:
-  SubVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  SubVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------SubVINode---------------------------------------
 // Vector subtract int
 class SubVINode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_INT; }
  public:
-  SubVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  SubVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------SubVLNode---------------------------------------
 // Vector subtract long
 class SubVLNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_LONG; }
  public:
-  SubVLNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  SubVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------SubVFNode---------------------------------------
 // Vector subtract float
 class SubVFNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_FLOAT; }
  public:
-  SubVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  SubVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------SubVDNode---------------------------------------
 // Vector subtract double
 class SubVDNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_DOUBLE; }
  public:
-  SubVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  SubVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------MulVFNode---------------------------------------
 // Vector multiply float
 class MulVFNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_FLOAT; }
  public:
-  MulVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  MulVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------MulVDNode---------------------------------------
 // Vector multiply double
 class MulVDNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_DOUBLE; }
  public:
-  MulVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  MulVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------DivVFNode---------------------------------------
 // Vector divide float
 class DivVFNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_FLOAT; }
  public:
-  DivVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  DivVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------DivVDNode---------------------------------------
 // Vector Divide double
 class DivVDNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_DOUBLE; }
  public:
-  DivVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  DivVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------LShiftVBNode---------------------------------------
 // Vector lshift byte
 class LShiftVBNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_BYTE; }
  public:
-  LShiftVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
-  virtual int Opcode() const;
-};
-
-//------------------------------LShiftVCNode---------------------------------------
-// Vector lshift chars
-class LShiftVCNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
-  LShiftVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  LShiftVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------LShiftVSNode---------------------------------------
 // Vector lshift shorts
 class LShiftVSNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_SHORT; }
  public:
-  LShiftVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  LShiftVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------LShiftVINode---------------------------------------
 // Vector lshift ints
 class LShiftVINode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_INT; }
  public:
-  LShiftVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  LShiftVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------URShiftVBNode---------------------------------------
 // Vector urshift bytes
-class URShiftVBNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_BYTE; }
+class RShiftVBNode : public VectorNode {
  public:
-  URShiftVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
-  virtual int Opcode() const;
-};
-
-//------------------------------URShiftVCNode---------------------------------------
-// Vector urshift char
-class URShiftVCNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_SHORT; }
- public:
-  URShiftVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  RShiftVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------URShiftVSNode---------------------------------------
 // Vector urshift shorts
-class URShiftVSNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_SHORT; }
+class RShiftVSNode : public VectorNode {
  public:
-  URShiftVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  RShiftVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------URShiftVINode---------------------------------------
 // Vector urshift ints
-class URShiftVINode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_INT; }
+class RShiftVINode : public VectorNode {
  public:
-  URShiftVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+  RShiftVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------AndVNode---------------------------------------
 // Vector and
 class AndVNode : public VectorNode {
- protected:
-  BasicType _bt;
-  virtual BasicType elt_basic_type() const { return _bt; }
  public:
-  AndVNode(Node* in1, Node* in2, uint vlen, BasicType bt) : VectorNode(in1,in2,vlen), _bt(bt) {}
+  AndVNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------OrVNode---------------------------------------
 // Vector or
 class OrVNode : public VectorNode {
- protected:
-  BasicType _bt;
-  virtual BasicType elt_basic_type() const { return _bt; }
  public:
-  OrVNode(Node* in1, Node* in2, uint vlen, BasicType bt) : VectorNode(in1,in2,vlen), _bt(bt) {}
+  OrVNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------XorVNode---------------------------------------
 // Vector xor
 class XorVNode : public VectorNode {
- protected:
-  BasicType _bt;
-  virtual BasicType elt_basic_type() const { return _bt; }
  public:
-  XorVNode(Node* in1, Node* in2, uint vlen, BasicType bt) : VectorNode(in1,in2,vlen), _bt(bt) {}
+  XorVNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
   virtual int Opcode() const;
 };
 
-//================================= M E M O R Y ==================================
-
+//================================= M E M O R Y ===============================
 
-//------------------------------VectorLoadNode--------------------------------------
-// Vector Load from memory
-class VectorLoadNode : public LoadNode {
-  virtual uint size_of() const { return sizeof(*this); }
-
- protected:
-  virtual BasicType elt_basic_type()  const = 0; // Vector element basic type
-  // For use in constructor
-  static const Type* vect_type(const Type* elt_type, uint len) {
-    return VectorNode::vect_type(elt_type, len);
+//------------------------------LoadVectorNode---------------------------------
+// Load Vector from memory
+class LoadVectorNode : public LoadNode {
+ public:
+  LoadVectorNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeVect* vt)
+    : LoadNode(c, mem, adr, at, vt) {
+    init_class_id(Class_LoadVector);
   }
 
- public:
-  VectorLoadNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *rt)
-    : LoadNode(c,mem,adr,at,rt) {
-    init_class_id(Class_VectorLoad);
-  }
+  const TypeVect* vect_type() const { return type()->is_vect(); }
+  uint length() const { return vect_type()->length(); } // Vector length
+
   virtual int Opcode() const;
 
-  virtual uint  length() const = 0; // Vector length
-
-  // Element and vector type
-  const Type* elt_type()  const { return Type::get_const_basic_type(elt_basic_type()); }
-  const Type* vect_type() const { return VectorNode::vect_type(elt_basic_type(), length()); }
-
-  virtual uint ideal_reg() const  { return Matcher::vector_ideal_reg(); }
+  virtual uint ideal_reg() const  { return Matcher::vector_ideal_reg(memory_size()); }
   virtual BasicType memory_type() const { return T_VOID; }
-  virtual int memory_size() const { return length()*type2aelembytes(elt_basic_type()); }
-
-  // Vector opcode from scalar opcode
-  static int opcode(int sopc, uint vlen);
-
-  static VectorLoadNode* make(Compile* C, int opc, Node* ctl, Node* mem,
-                              Node* adr, const TypePtr* atyp, uint vlen);
-};
-
-//------------------------------Load16BNode--------------------------------------
-// Vector load of 16 bytes (8bits signed) from memory
-class Load16BNode : public VectorLoadNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_BYTE; }
- public:
-  Load16BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::BYTE)
-    : VectorLoadNode(c,mem,adr,at,vect_type(ti,16)) {}
-  virtual int Opcode() const;
-  virtual int store_Opcode() const { return Op_Store16B; }
-  virtual uint length() const { return 16; }
-};
-
-//------------------------------Load8BNode--------------------------------------
-// Vector load of 8 bytes (8bits signed) from memory
-class Load8BNode : public VectorLoadNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_BYTE; }
- public:
-  Load8BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::BYTE)
-    : VectorLoadNode(c,mem,adr,at,vect_type(ti,8)) {}
-  virtual int Opcode() const;
-  virtual int store_Opcode() const { return Op_Store8B; }
-  virtual uint length() const { return 8; }
-};
+  virtual int memory_size() const { return vect_type()->length_in_bytes(); }
 
-//------------------------------Load4BNode--------------------------------------
-// Vector load of 4 bytes (8bits signed) from memory
-class Load4BNode : public VectorLoadNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_BYTE; }
- public:
-  Load4BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::BYTE)
-    : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {}
-  virtual int Opcode() const;
-  virtual int store_Opcode() const { return Op_Store4B; }
-  virtual uint length() const { return 4; }
-};
-
-//------------------------------Load8CNode--------------------------------------
-// Vector load of 8 chars (16bits unsigned) from memory
-class Load8CNode : public VectorLoadNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
-  Load8CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::CHAR)
-    : VectorLoadNode(c,mem,adr,at,vect_type(ti,8)) {}
-  virtual int Opcode() const;
-  virtual int store_Opcode() const { return Op_Store8C; }
-  virtual uint length() const { return 8; }
-};
+  virtual int store_Opcode() const { return Op_StoreVector; }
 
-//------------------------------Load4CNode--------------------------------------
-// Vector load of 4 chars (16bits unsigned) from memory
-class Load4CNode : public VectorLoadNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
-  Load4CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::CHAR)
-    : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {}
-  virtual int Opcode() const;
-  virtual int store_Opcode() const { return Op_Store4C; }
-  virtual uint length() const { return 4; }
-};
-
-//------------------------------Load2CNode--------------------------------------
-// Vector load of 2 chars (16bits unsigned) from memory
-class Load2CNode : public VectorLoadNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
-  Load2CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::CHAR)
-    : VectorLoadNode(c,mem,adr,at,vect_type(ti,2)) {}
-  virtual int Opcode() const;
-  virtual int store_Opcode() const { return Op_Store2C; }
-  virtual uint length() const { return 2; }
-};
-
-//------------------------------Load8SNode--------------------------------------
-// Vector load of 8 shorts (16bits signed) from memory
-class Load8SNode : public VectorLoadNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_SHORT; }
- public:
-  Load8SNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::SHORT)
-    : VectorLoadNode(c,mem,adr,at,vect_type(ti,8)) {}
-  virtual int Opcode() const;
-  virtual int store_Opcode() const { return Op_Store8C; }
-  virtual uint length() const { return 8; }
+  static LoadVectorNode* make(Compile* C, int opc, Node* ctl, Node* mem,
+                              Node* adr, const TypePtr* atyp, uint vlen, BasicType bt);
 };
 
-//------------------------------Load4SNode--------------------------------------
-// Vector load of 4 shorts (16bits signed) from memory
-class Load4SNode : public VectorLoadNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_SHORT; }
- public:
-  Load4SNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::SHORT)
-    : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {}
-  virtual int Opcode() const;
-  virtual int store_Opcode() const { return Op_Store4C; }
-  virtual uint length() const { return 4; }
-};
-
-//------------------------------Load2SNode--------------------------------------
-// Vector load of 2 shorts (16bits signed) from memory
-class Load2SNode : public VectorLoadNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_SHORT; }
- public:
-  Load2SNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::SHORT)
-    : VectorLoadNode(c,mem,adr,at,vect_type(ti,2)) {}
-  virtual int Opcode() const;
-  virtual int store_Opcode() const { return Op_Store2C; }
-  virtual uint length() const { return 2; }
-};
-
-//------------------------------Load4INode--------------------------------------
-// Vector load of 4 integers (32bits signed) from memory
-class Load4INode : public VectorLoadNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_INT; }
- public:
-  Load4INode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::INT)
-    : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {}
-  virtual int Opcode() const;
-  virtual int store_Opcode() const { return Op_Store4I; }
-  virtual uint length() const { return 4; }
-};
-
-//------------------------------Load2INode--------------------------------------
-// Vector load of 2 integers (32bits signed) from memory
-class Load2INode : public VectorLoadNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_INT; }
- public:
-  Load2INode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::INT)
-    : VectorLoadNode(c,mem,adr,at,vect_type(ti,2)) {}
-  virtual int Opcode() const;
-  virtual int store_Opcode() const { return Op_Store2I; }
-  virtual uint length() const { return 2; }
-};
-
-//------------------------------Load2LNode--------------------------------------
-// Vector load of 2 longs (64bits signed) from memory
-class Load2LNode : public VectorLoadNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_LONG; }
+//------------------------------StoreVectorNode--------------------------------
+// Store Vector to memory
+class StoreVectorNode : public StoreNode {
  public:
-  Load2LNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeLong *tl = TypeLong::LONG)
-    : VectorLoadNode(c,mem,adr,at,vect_type(tl,2)) {}
-  virtual int Opcode() const;
-  virtual int store_Opcode() const { return Op_Store2L; }
-  virtual uint length() const { return 2; }
-};
-
-//------------------------------Load4FNode--------------------------------------
-// Vector load of 4 floats (32bits) from memory
-class Load4FNode : public VectorLoadNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_FLOAT; }
- public:
-  Load4FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *t = Type::FLOAT)
-    : VectorLoadNode(c,mem,adr,at,vect_type(t,4)) {}
-  virtual int Opcode() const;
-  virtual int store_Opcode() const { return Op_Store4F; }
-  virtual uint length() const { return 4; }
-};
+  StoreVectorNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
+    : StoreNode(c, mem, adr, at, val) {
+    assert(val->is_Vector() || val->is_LoadVector(), "sanity");
+    init_class_id(Class_StoreVector);
+  }
 
-//------------------------------Load2FNode--------------------------------------
-// Vector load of 2 floats (32bits) from memory
-class Load2FNode : public VectorLoadNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_FLOAT; }
- public:
-  Load2FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *t = Type::FLOAT)
-    : VectorLoadNode(c,mem,adr,at,vect_type(t,2)) {}
-  virtual int Opcode() const;
-  virtual int store_Opcode() const { return Op_Store2F; }
-  virtual uint length() const { return 2; }
-};
+  const TypeVect* vect_type() const { return in(MemNode::ValueIn)->bottom_type()->is_vect(); }
+  uint length() const { return vect_type()->length(); } // Vector length
 
-//------------------------------Load2DNode--------------------------------------
-// Vector load of 2 doubles (64bits) from memory
-class Load2DNode : public VectorLoadNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_DOUBLE; }
- public:
-  Load2DNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *t = Type::DOUBLE)
-    : VectorLoadNode(c,mem,adr,at,vect_type(t,2)) {}
-  virtual int Opcode() const;
-  virtual int store_Opcode() const { return Op_Store2D; }
-  virtual uint length() const { return 2; }
-};
-
-
-//------------------------------VectorStoreNode--------------------------------------
-// Vector Store to memory
-class VectorStoreNode : public StoreNode {
-  virtual uint size_of() const { return sizeof(*this); }
-
- protected:
-  virtual BasicType elt_basic_type()  const = 0; // Vector element basic type
-
- public:
-  VectorStoreNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
-    : StoreNode(c,mem,adr,at,val) {
-    init_class_id(Class_VectorStore);
-  }
   virtual int Opcode() const;
 
-  virtual uint  length() const = 0; // Vector length
-
-  // Element and vector type
-  const Type* elt_type()  const { return Type::get_const_basic_type(elt_basic_type()); }
-  const Type* vect_type() const { return VectorNode::vect_type(elt_basic_type(), length()); }
+  virtual uint ideal_reg() const  { return Matcher::vector_ideal_reg(memory_size()); }
+  virtual BasicType memory_type() const { return T_VOID; }
+  virtual int memory_size() const { return vect_type()->length_in_bytes(); }
 
-  virtual uint ideal_reg() const  { return Matcher::vector_ideal_reg(); }
-  virtual BasicType memory_type() const { return T_VOID; }
-  virtual int memory_size() const { return length()*type2aelembytes(elt_basic_type()); }
-
-  // Vector opcode from scalar opcode
-  static int opcode(int sopc, uint vlen);
-
-  static VectorStoreNode* make(Compile* C, int opc, Node* ctl, Node* mem,
+  static StoreVectorNode* make(Compile* C, int opc, Node* ctl, Node* mem,
                                Node* adr, const TypePtr* atyp, Node* val,
                                uint vlen);
 };
 
-//------------------------------Store16BNode--------------------------------------
-// Vector store of 16 bytes (8bits signed) to memory
-class Store16BNode : public VectorStoreNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_BYTE; }
- public:
-  Store16BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
-    : VectorStoreNode(c,mem,adr,at,val) {}
-  virtual int Opcode() const;
-  virtual uint length() const { return 16; }
-};
+
+//=========================Promote_Scalar_to_Vector============================
 
-//------------------------------Store8BNode--------------------------------------
-// Vector store of 8 bytes (8bits signed) to memory
-class Store8BNode : public VectorStoreNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_BYTE; }
+//------------------------------ReplicateBNode---------------------------------
+// Replicate byte scalar to be vector
+class ReplicateBNode : public VectorNode {
  public:
-  Store8BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
-    : VectorStoreNode(c,mem,adr,at,val) {}
-  virtual int Opcode() const;
-  virtual uint length() const { return 8; }
-};
-
-//------------------------------Store4BNode--------------------------------------
-// Vector store of 4 bytes (8bits signed) to memory
-class Store4BNode : public VectorStoreNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_BYTE; }
- public:
-  Store4BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
-    : VectorStoreNode(c,mem,adr,at,val) {}
+  ReplicateBNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
   virtual int Opcode() const;
-  virtual uint length() const { return 4; }
-};
-
-//------------------------------Store8CNode--------------------------------------
-// Vector store of 8 chars (16bits signed/unsigned) to memory
-class Store8CNode : public VectorStoreNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
-  Store8CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
-    : VectorStoreNode(c,mem,adr,at,val) {}
-  virtual int Opcode() const;
-  virtual uint length() const { return 8; }
-};
-
-//------------------------------Store4CNode--------------------------------------
-// Vector store of 4 chars (16bits signed/unsigned) to memory
-class Store4CNode : public VectorStoreNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
-  Store4CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
-    : VectorStoreNode(c,mem,adr,at,val) {}
-  virtual int Opcode() const;
-  virtual uint length() const { return 4; }
-};
-
-//------------------------------Store2CNode--------------------------------------
-// Vector store of 2 chars (16bits signed/unsigned) to memory
-class Store2CNode : public VectorStoreNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
-  Store2CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
-    : VectorStoreNode(c,mem,adr,at,val) {}
-  virtual int Opcode() const;
-  virtual uint length() const { return 2; }
 };
 
-//------------------------------Store4INode--------------------------------------
-// Vector store of 4 integers (32bits signed) to memory
-class Store4INode : public VectorStoreNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_INT; }
- public:
-  Store4INode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
-    : VectorStoreNode(c,mem,adr,at,val) {}
-  virtual int Opcode() const;
-  virtual uint length() const { return 4; }
-};
-
-//------------------------------Store2INode--------------------------------------
-// Vector store of 2 integers (32bits signed) to memory
-class Store2INode : public VectorStoreNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_INT; }
- public:
-  Store2INode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
-    : VectorStoreNode(c,mem,adr,at,val) {}
-  virtual int Opcode() const;
-  virtual uint length() const { return 2; }
-};
-
-//------------------------------Store2LNode--------------------------------------
-// Vector store of 2 longs (64bits signed) to memory
-class Store2LNode : public VectorStoreNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_LONG; }
+//------------------------------ReplicateSNode---------------------------------
+// Replicate short scalar to be vector
+class ReplicateSNode : public VectorNode {
  public:
-  Store2LNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
-    : VectorStoreNode(c,mem,adr,at,val) {}
-  virtual int Opcode() const;
-  virtual uint length() const { return 2; }
-};
-
-//------------------------------Store4FNode--------------------------------------
-// Vector store of 4 floats (32bits) to memory
-class Store4FNode : public VectorStoreNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_FLOAT; }
- public:
-  Store4FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
-    : VectorStoreNode(c,mem,adr,at,val) {}
-  virtual int Opcode() const;
-  virtual uint length() const { return 4; }
-};
-
-//------------------------------Store2FNode--------------------------------------
-// Vector store of 2 floats (32bits) to memory
-class Store2FNode : public VectorStoreNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_FLOAT; }
- public:
-  Store2FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
-    : VectorStoreNode(c,mem,adr,at,val) {}
-  virtual int Opcode() const;
-  virtual uint length() const { return 2; }
-};
-
-//------------------------------Store2DNode--------------------------------------
-// Vector store of 2 doubles (64bits) to memory
-class Store2DNode : public VectorStoreNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_DOUBLE; }
- public:
-  Store2DNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
-    : VectorStoreNode(c,mem,adr,at,val) {}
-  virtual int Opcode() const;
-  virtual uint length() const { return 2; }
-};
-
-//=========================Promote_Scalar_to_Vector====================================
-
-//------------------------------Replicate16BNode---------------------------------------
-// Replicate byte scalar to be vector of 16 bytes
-class Replicate16BNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_BYTE; }
- public:
-  Replicate16BNode(Node* in1) : VectorNode(in1, 16) {}
+  ReplicateSNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
   virtual int Opcode() const;
 };
 
-//------------------------------Replicate8BNode---------------------------------------
-// Replicate byte scalar to be vector of 8 bytes
-class Replicate8BNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_BYTE; }
+//------------------------------ReplicateINode---------------------------------
+// Replicate int scalar to be vector
+class ReplicateINode : public VectorNode {
  public:
-  Replicate8BNode(Node* in1) : VectorNode(in1, 8) {}
-  virtual int Opcode() const;
-};
-
-//------------------------------Replicate4BNode---------------------------------------
-// Replicate byte scalar to be vector of 4 bytes
-class Replicate4BNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_BYTE; }
- public:
-  Replicate4BNode(Node* in1) : VectorNode(in1, 4) {}
-  virtual int Opcode() const;
-};
-
-//------------------------------Replicate8CNode---------------------------------------
-// Replicate char scalar to be vector of 8 chars
-class Replicate8CNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
-  Replicate8CNode(Node* in1) : VectorNode(in1, 8) {}
+  ReplicateINode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
   virtual int Opcode() const;
 };
 
-//------------------------------Replicate4CNode---------------------------------------
-// Replicate char scalar to be vector of 4 chars
-class Replicate4CNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
-  Replicate4CNode(Node* in1) : VectorNode(in1, 4) {}
-  virtual int Opcode() const;
-};
-
-//------------------------------Replicate2CNode---------------------------------------
-// Replicate char scalar to be vector of 2 chars
-class Replicate2CNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_CHAR; }
+//------------------------------ReplicateLNode---------------------------------
+// Replicate long scalar to be vector
+class ReplicateLNode : public VectorNode {
  public:
-  Replicate2CNode(Node* in1) : VectorNode(in1, 2) {}
-  virtual int Opcode() const;
-};
-
-//------------------------------Replicate8SNode---------------------------------------
-// Replicate short scalar to be vector of 8 shorts
-class Replicate8SNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_SHORT; }
- public:
-  Replicate8SNode(Node* in1) : VectorNode(in1, 8) {}
-  virtual int Opcode() const;
-};
-
-//------------------------------Replicate4SNode---------------------------------------
-// Replicate short scalar to be vector of 4 shorts
-class Replicate4SNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_SHORT; }
- public:
-  Replicate4SNode(Node* in1) : VectorNode(in1, 4) {}
+  ReplicateLNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
   virtual int Opcode() const;
 };
 
-//------------------------------Replicate2SNode---------------------------------------
-// Replicate short scalar to be vector of 2 shorts
-class Replicate2SNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_SHORT; }
+//------------------------------ReplicateFNode---------------------------------
+// Replicate float scalar to be vector
+class ReplicateFNode : public VectorNode {
  public:
-  Replicate2SNode(Node* in1) : VectorNode(in1, 2) {}
-  virtual int Opcode() const;
-};
-
-//------------------------------Replicate4INode---------------------------------------
-// Replicate int scalar to be vector of 4 ints
-class Replicate4INode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_INT; }
- public:
-  Replicate4INode(Node* in1) : VectorNode(in1, 4) {}
-  virtual int Opcode() const;
-};
-
-//------------------------------Replicate2INode---------------------------------------
-// Replicate int scalar to be vector of 2 ints
-class Replicate2INode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_INT; }
- public:
-  Replicate2INode(Node* in1) : VectorNode(in1, 2) {}
+  ReplicateFNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
   virtual int Opcode() const;
 };
 
-//------------------------------Replicate2LNode---------------------------------------
-// Replicate long scalar to be vector of 2 longs
-class Replicate2LNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_LONG; }
+//------------------------------ReplicateDNode---------------------------------
+// Replicate double scalar to be vector
+class ReplicateDNode : public VectorNode {
  public:
-  Replicate2LNode(Node* in1) : VectorNode(in1, 2) {}
-  virtual int Opcode() const;
-};
-
-//------------------------------Replicate4FNode---------------------------------------
-// Replicate float scalar to be vector of 4 floats
-class Replicate4FNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_FLOAT; }
- public:
-  Replicate4FNode(Node* in1) : VectorNode(in1, 4) {}
+  ReplicateDNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
   virtual int Opcode() const;
 };
 
-//------------------------------Replicate2FNode---------------------------------------
-// Replicate float scalar to be vector of 2 floats
-class Replicate2FNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_FLOAT; }
- public:
-  Replicate2FNode(Node* in1) : VectorNode(in1, 2) {}
-  virtual int Opcode() const;
-};
-
-//------------------------------Replicate2DNode---------------------------------------
-// Replicate double scalar to be vector of 2 doubles
-class Replicate2DNode : public VectorNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_DOUBLE; }
- public:
-  Replicate2DNode(Node* in1) : VectorNode(in1, 2) {}
-  virtual int Opcode() const;
-};
-
-//========================Pack_Scalars_into_a_Vector==============================
+//========================Pack_Scalars_into_a_Vector===========================
 
 //------------------------------PackNode---------------------------------------
 // Pack parent class (not for code generation).
 class PackNode : public VectorNode {
  public:
-  PackNode(Node* in1)  : VectorNode(in1, 1) {}
-  PackNode(Node* in1, Node* n2)  : VectorNode(in1, n2, 2) {}
+  PackNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
+  PackNode(Node* in1, Node* n2, const TypeVect* vt) : VectorNode(in1, n2, vt) {}
   virtual int Opcode() const;
 
-  void add_opd(Node* n) {
-    add_req(n);
-    _length++;
-    assert(_length == req() - 1, "vector length matches edge count");
+  void add_opd(uint i, Node* n) {
+    init_req(i+1, n);
   }
 
   // Create a binary tree form for Packs. [lo, hi) (half-open) range
   Node* binaryTreePack(Compile* C, int lo, int hi);
 
-  static PackNode* make(Compile* C, Node* s, const Type* elt_t);
+  static PackNode* make(Compile* C, Node* s, uint vlen, BasicType bt);
 };
 
 //------------------------------PackBNode---------------------------------------
 // Pack byte scalars into vector
 class PackBNode : public PackNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_BYTE; }
  public:
-  PackBNode(Node* in1)  : PackNode(in1) {}
-  virtual int Opcode() const;
-};
-
-//------------------------------PackCNode---------------------------------------
-// Pack char scalars into vector
-class PackCNode : public PackNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
-  PackCNode(Node* in1)  : PackNode(in1) {}
+  PackBNode(Node* in1, const TypeVect* vt)  : PackNode(in1, vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------PackSNode---------------------------------------
 // Pack short scalars into a vector
 class PackSNode : public PackNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_SHORT; }
  public:
-  PackSNode(Node* in1)  : PackNode(in1) {}
+  PackSNode(Node* in1, const TypeVect* vt)  : PackNode(in1, vt) {}
+  PackSNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------PackINode---------------------------------------
 // Pack integer scalars into a vector
 class PackINode : public PackNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_INT; }
  public:
-  PackINode(Node* in1)  : PackNode(in1) {}
-  PackINode(Node* in1, Node* in2) : PackNode(in1, in2) {}
+  PackINode(Node* in1, const TypeVect* vt)  : PackNode(in1, vt) {}
+  PackINode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------PackLNode---------------------------------------
 // Pack long scalars into a vector
 class PackLNode : public PackNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_LONG; }
  public:
-  PackLNode(Node* in1)  : PackNode(in1) {}
-  PackLNode(Node* in1, Node* in2) : PackNode(in1, in2) {}
+  PackLNode(Node* in1, const TypeVect* vt)  : PackNode(in1, vt) {}
+  PackLNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
+  virtual int Opcode() const;
+};
+
+//------------------------------Pack2LNode--------------------------------------
+// Pack 2 long scalars into a vector
+class Pack2LNode : public PackNode {
+ public:
+  Pack2LNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------PackFNode---------------------------------------
 // Pack float scalars into vector
 class PackFNode : public PackNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_FLOAT; }
  public:
-  PackFNode(Node* in1)  : PackNode(in1) {}
-  PackFNode(Node* in1, Node* in2) : PackNode(in1, in2) {}
+  PackFNode(Node* in1, const TypeVect* vt)  : PackNode(in1, vt) {}
+  PackFNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
   virtual int Opcode() const;
 };
 
 //------------------------------PackDNode---------------------------------------
 // Pack double scalars into a vector
 class PackDNode : public PackNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_DOUBLE; }
  public:
-  PackDNode(Node* in1)  : PackNode(in1) {}
-  PackDNode(Node* in1, Node* in2) : PackNode(in1, in2) {}
+  PackDNode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {}
+  PackDNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
   virtual int Opcode() const;
 };
 
-// The Pack2xN nodes assist code generation.  They are created from
-// Pack4C, etc. nodes in final_graph_reshape in the form of a
-// balanced, binary tree.
-
-//------------------------------Pack2x1BNode-----------------------------------------
-// Pack 2 1-byte integers into vector of 2 bytes
-class Pack2x1BNode : public PackNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_BYTE; }
+//------------------------------Pack2DNode--------------------------------------
+// Pack 2 double scalars into a vector
+class Pack2DNode : public PackNode {
  public:
-  Pack2x1BNode(Node *in1, Node* in2) : PackNode(in1, in2) {}
+  Pack2DNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
   virtual int Opcode() const;
-  virtual uint ideal_reg() const { return Op_RegI; }
 };
 
-//------------------------------Pack2x2BNode---------------------------------------
-// Pack 2 2-byte integers into vector of 4 bytes
-class Pack2x2BNode : public PackNode {
- protected:
-  virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
-  Pack2x2BNode(Node *in1, Node* in2) : PackNode(in1, in2) {}
-  virtual int Opcode() const;
-  virtual uint ideal_reg() const { return Op_RegI; }
-};
 
 //========================Extract_Scalar_from_Vector===============================
 
@@ -1069,7 +465,7 @@
   virtual int Opcode() const;
   uint  pos() const { return in(2)->get_int(); }
 
-  static Node* make(Compile* C, Node* v, uint position, const Type* opd_t);
+  static Node* make(Compile* C, Node* v, uint position, BasicType bt);
 };
 
 //------------------------------ExtractBNode---------------------------------------
@@ -1082,6 +478,16 @@
   virtual uint ideal_reg() const { return Op_RegI; }
 };
 
+//------------------------------ExtractUBNode--------------------------------------
+// Extract a boolean from a vector at position "pos"
+class ExtractUBNode : public ExtractNode {
+ public:
+  ExtractUBNode(Node* src, ConINode* pos) : ExtractNode(src, pos) {}
+  virtual int Opcode() const;
+  virtual const Type *bottom_type() const { return TypeInt::INT; }
+  virtual uint ideal_reg() const { return Op_RegI; }
+};
+
 //------------------------------ExtractCNode---------------------------------------
 // Extract a char from a vector at position "pos"
 class ExtractCNode : public ExtractNode {
--- a/src/share/vm/prims/jni.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jni.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -23,6 +23,7 @@
  */
 
 #include "precompiled.hpp"
+#include "classfile/altHashing.hpp"
 #include "classfile/classLoader.hpp"
 #include "classfile/javaClasses.hpp"
 #include "classfile/symbolTable.hpp"
@@ -32,6 +33,7 @@
 #ifndef SERIALGC
 #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
 #endif // SERIALGC
+#include "memory/allocation.hpp"
 #include "memory/allocation.inline.hpp"
 #include "memory/gcLocker.inline.hpp"
 #include "memory/oopFactory.hpp"
@@ -3269,7 +3271,7 @@
   int s_len = java_lang_String::length(s);
   typeArrayOop s_value = java_lang_String::value(s);
   int s_offset = java_lang_String::offset(s);
-  jchar* buf = NEW_C_HEAP_ARRAY(jchar, s_len + 1);  // add one for zero termination
+  jchar* buf = NEW_C_HEAP_ARRAY(jchar, s_len + 1, mtInternal);  // add one for zero termination
   if (s_len > 0) {
     memcpy(buf, s_value->char_at_addr(s_offset), sizeof(jchar)*s_len);
   }
@@ -3362,7 +3364,7 @@
 #endif /* USDT2 */
   oop java_string = JNIHandles::resolve_non_null(string);
   size_t length = java_lang_String::utf8_length(java_string);
-  char* result = AllocateHeap(length + 1, "GetStringUTFChars");
+  char* result = AllocateHeap(length + 1, mtInternal);
   java_lang_String::as_utf8_string(java_string, result, (int) length + 1);
   if (isCopy != NULL) *isCopy = JNI_TRUE;
 #ifndef USDT2
@@ -3618,7 +3620,7 @@
      * Avoid asserts in typeArrayOop. */ \
     result = (ElementType*)get_bad_address(); \
   } else { \
-    result = NEW_C_HEAP_ARRAY(ElementType, len); \
+    result = NEW_C_HEAP_ARRAY(ElementType, len, mtInternal); \
     /* copy the array to the c chunk */ \
     memcpy(result, a->Tag##_at_addr(0), sizeof(ElementType)*len); \
   } \
@@ -3655,7 +3657,7 @@
      * Avoid asserts in typeArrayOop. */ \
     result = (ElementType*)get_bad_address(); \
   } else { \
-    result = NEW_C_HEAP_ARRAY(ElementType, len); \
+    result = NEW_C_HEAP_ARRAY(ElementType, len, mtInternal); \
     /* copy the array to the c chunk */ \
     memcpy(result, a->Tag##_at_addr(0), sizeof(ElementType)*len); \
   } \
@@ -5053,6 +5055,7 @@
     run_unit_test(arrayOopDesc::test_max_array_length());
     run_unit_test(CollectedHeap::test_is_in());
     run_unit_test(QuickSort::test_quick_sort());
+    run_unit_test(AltHashing::test_alt_hash());
     tty->print_cr("All internal VM tests passed");
   }
 }
--- a/src/share/vm/prims/jniCheck.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jniCheck.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1308,7 +1308,7 @@
     assert (isCopy == NULL || *isCopy == JNI_TRUE, "GetStringChars didn't return a copy as expected");
 
     size_t len = UNCHECKED()->GetStringLength(env,str) + 1; // + 1 for NULL termination
-    jint* tagLocation = (jint*) AllocateHeap(len * sizeof(jchar) + sizeof(jint), "checked_jni_GetStringChars");
+    jint* tagLocation = (jint*) AllocateHeap(len * sizeof(jchar) + sizeof(jint), mtInternal);
     *tagLocation = STRING_TAG;
     jchar* newResult = (jchar*) (tagLocation + 1);
     memcpy(newResult, result, len * sizeof(jchar));
@@ -1378,13 +1378,13 @@
     assert (isCopy == NULL || *isCopy == JNI_TRUE, "GetStringUTFChars didn't return a copy as expected");
 
     size_t len = strlen(result) + 1; // + 1 for NULL termination
-    jint* tagLocation = (jint*) AllocateHeap(len + sizeof(jint), "checked_jni_GetStringUTFChars");
+    jint* tagLocation = (jint*) AllocateHeap(len + sizeof(jint), mtInternal);
     *tagLocation = STRING_UTF_TAG;
     char* newResult = (char*) (tagLocation + 1);
     strcpy(newResult, result);
     // Avoiding call to UNCHECKED()->ReleaseStringUTFChars() since that will fire unexpected dtrace probes
     // Note that the dtrace arguments for the allocated memory will not match up with this solution.
-    FreeHeap((char*)result);
+    FreeHeap((char*)result, mtInternal);
 
     functionExit(env);
     return newResult;
--- a/src/share/vm/prims/jvm.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvm.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -35,6 +35,7 @@
 #include "oops/fieldStreams.hpp"
 #include "oops/instanceKlass.hpp"
 #include "oops/objArrayKlass.hpp"
+#include "oops/methodOop.hpp"
 #include "prims/jvm.h"
 #include "prims/jvm_misc.hpp"
 #include "prims/jvmtiExport.hpp"
@@ -345,9 +346,13 @@
   // Do this after setting user properties to prevent people
   // from setting the value with a -D option, as requested.
   {
-    char as_chars[256];
-    jio_snprintf(as_chars, sizeof(as_chars), INTX_FORMAT, MaxDirectMemorySize);
-    PUTPROP(props, "sun.nio.MaxDirectMemorySize", as_chars);
+    if (FLAG_IS_DEFAULT(MaxDirectMemorySize)) {
+      PUTPROP(props, "sun.nio.MaxDirectMemorySize", "-1");
+    } else {
+      char as_chars[256];
+      jio_snprintf(as_chars, sizeof(as_chars), UINTX_FORMAT, MaxDirectMemorySize);
+      PUTPROP(props, "sun.nio.MaxDirectMemorySize", as_chars);
+    }
   }
 
   // JVM monitoring and management support
@@ -2179,11 +2184,11 @@
   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
   oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
-  typeArrayOop extable = methodOop(method)->exception_table();
-  entry->start_pc   = extable->int_at(entry_index * 4);
-  entry->end_pc     = extable->int_at(entry_index * 4 + 1);
-  entry->handler_pc = extable->int_at(entry_index * 4 + 2);
-  entry->catchType  = extable->int_at(entry_index * 4 + 3);
+  ExceptionTable extable((methodOop(method)));
+  entry->start_pc   = extable.start_pc(entry_index);
+  entry->end_pc     = extable.end_pc(entry_index);
+  entry->handler_pc = extable.handler_pc(entry_index);
+  entry->catchType  = extable.catch_type_index(entry_index);
 JVM_END
 
 
@@ -2192,7 +2197,7 @@
   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
   oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
-  return methodOop(method)->exception_table()->length() / 4;
+  return methodOop(method)->exception_table_length();
 JVM_END
 
 
--- a/src/share/vm/prims/jvmtiClassFileReconstituter.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiClassFileReconstituter.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -191,15 +191,14 @@
     }
   }
 
-  typeArrayHandle exception_table(thread(), const_method->exception_table());
-  int exception_table_length = exception_table->length();
-  int exception_table_entries = exception_table_length / 4;
+  ExceptionTable exception_table(method());
+  int exception_table_length = exception_table.length();
   int code_size = const_method->code_size();
   int size =
     2+2+4 +                                // max_stack, max_locals, code_length
     code_size +                            // code
     2 +                                    // exception_table_length
-    (2+2+2+2) * exception_table_entries +  // exception_table
+    (2+2+2+2) * exception_table_length +   // exception_table
     2 +                                    // attributes_count
     attr_size;                             // attributes
 
@@ -209,12 +208,12 @@
   write_u2(method->max_locals());
   write_u4(code_size);
   copy_bytecodes(method, (unsigned char*)writeable_address(code_size));
-  write_u2(exception_table_entries);
-  for (int index = 0; index < exception_table_length; ) {
-    write_u2(exception_table->int_at(index++));
-    write_u2(exception_table->int_at(index++));
-    write_u2(exception_table->int_at(index++));
-    write_u2(exception_table->int_at(index++));
+  write_u2(exception_table_length);
+  for (int index = 0; index < exception_table_length; index++) {
+    write_u2(exception_table.start_pc(index));
+    write_u2(exception_table.end_pc(index));
+    write_u2(exception_table.handler_pc(index));
+    write_u2(exception_table.catch_type_index(index));
   }
   write_u2(attr_count);
   if (line_num_cnt != 0) {
@@ -268,14 +267,18 @@
 // JSR45|   SourceDebugExtension_attribute {
 // JSR45|       u2 attribute_name_index;
 // JSR45|       u4 attribute_length;
-// JSR45|       u2 sourcefile_index;
+// JSR45|       u1 debug_extension[attribute_length];
 // JSR45|   }
 void JvmtiClassFileReconstituter::write_source_debug_extension_attribute() {
   assert(ikh()->source_debug_extension() != NULL, "caller must check");
 
   write_attribute_name_index("SourceDebugExtension");
-  write_u4(2);  // always length 2
-  write_u2(symbol_to_cpool_index(ikh()->source_debug_extension()));
+  int len = (int)strlen(ikh()->source_debug_extension());
+  write_u4(len);
+  u1* ext = (u1*)ikh()->source_debug_extension();
+  for (int i=0; i<len; i++) {
+    write_u1(ext[i]);
+  }
 }
 
 // Write (generic) Signature attribute
--- a/src/share/vm/prims/jvmtiClassFileReconstituter.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiClassFileReconstituter.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -68,11 +68,11 @@
 
   ~JvmtiConstantPoolReconstituter() {
     if (_symmap != NULL) {
-      os::free(_symmap);
+      os::free(_symmap, mtClass);
       _symmap = NULL;
     }
     if (_classmap != NULL) {
-      os::free(_classmap);
+      os::free(_classmap, mtClass);
       _classmap = NULL;
     }
   }
--- a/src/share/vm/prims/jvmtiCodeBlobEvents.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiCodeBlobEvents.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -157,7 +157,7 @@
   assert(_global_code_blobs == NULL, "checking");
 
   // create the global list
-  _global_code_blobs = new (ResourceObj::C_HEAP) GrowableArray<JvmtiCodeBlobDesc*>(50,true);
+  _global_code_blobs = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<JvmtiCodeBlobDesc*>(50,true);
 
   // iterate over the stub code descriptors and put them in the list first.
   int index = 0;
@@ -247,7 +247,7 @@
     int pcds_in_method;
 
     pcds_in_method = (nm->scopes_pcs_end() - nm->scopes_pcs_begin());
-    map = NEW_C_HEAP_ARRAY(jvmtiAddrLocationMap, pcds_in_method);
+    map = NEW_C_HEAP_ARRAY(jvmtiAddrLocationMap, pcds_in_method, mtInternal);
 
     address scopes_data = nm->scopes_data_begin();
     for( pcd = nm->scopes_pcs_begin(); pcd < nm->scopes_pcs_end(); ++pcd ) {
--- a/src/share/vm/prims/jvmtiEnv.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiEnv.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1012,7 +1012,7 @@
 
   // growable array of jvmti monitors info on the C-heap
   GrowableArray<jvmtiMonitorStackDepthInfo*> *owned_monitors_list =
-      new (ResourceObj::C_HEAP) GrowableArray<jvmtiMonitorStackDepthInfo*>(1, true);
+      new (ResourceObj::C_HEAP, mtInternal) GrowableArray<jvmtiMonitorStackDepthInfo*>(1, true);
 
   uint32_t debug_bits = 0;
   if (is_thread_fully_suspended(java_thread, true, &debug_bits)) {
@@ -1057,7 +1057,7 @@
 
   // growable array of jvmti monitors info on the C-heap
   GrowableArray<jvmtiMonitorStackDepthInfo*> *owned_monitors_list =
-         new (ResourceObj::C_HEAP) GrowableArray<jvmtiMonitorStackDepthInfo*>(1, true);
+         new (ResourceObj::C_HEAP, mtInternal) GrowableArray<jvmtiMonitorStackDepthInfo*>(1, true);
 
   uint32_t debug_bits = 0;
   if (is_thread_fully_suspended(java_thread, true, &debug_bits)) {
@@ -2541,15 +2541,12 @@
     if (!Klass::cast(k)->oop_is_instance()) {
       return JVMTI_ERROR_ABSENT_INFORMATION;
     }
-    Symbol* sdeOop = instanceKlass::cast(k)->source_debug_extension();
-    NULL_CHECK(sdeOop, JVMTI_ERROR_ABSENT_INFORMATION);
+    char* sde = instanceKlass::cast(k)->source_debug_extension();
+    NULL_CHECK(sde, JVMTI_ERROR_ABSENT_INFORMATION);
 
     {
-      JavaThread* current_thread  = JavaThread::current();
-      ResourceMark rm(current_thread);
-      const char* sdecp = (const char*) sdeOop->as_C_string();
-      *source_debug_extension_ptr = (char *) jvmtiMalloc(strlen(sdecp)+1);
-      strcpy(*source_debug_extension_ptr, sdecp);
+      *source_debug_extension_ptr = (char *) jvmtiMalloc(strlen(sde)+1);
+      strcpy(*source_debug_extension_ptr, sde);
     }
   }
 
--- a/src/share/vm/prims/jvmtiEnvBase.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiEnvBase.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -381,7 +381,7 @@
     _native_method_prefixes = NULL;
   } else {
     // there are prefixes, allocate an array to hold them, and fill it
-    char** new_prefixes = (char**)os::malloc((prefix_count) * sizeof(char*));
+    char** new_prefixes = (char**)os::malloc((prefix_count) * sizeof(char*), mtInternal);
     if (new_prefixes == NULL) {
       return JVMTI_ERROR_OUT_OF_MEMORY;
     }
@@ -1150,7 +1150,7 @@
 
 ResourceTracker::ResourceTracker(JvmtiEnv* env) {
   _env = env;
-  _allocations = new (ResourceObj::C_HEAP) GrowableArray<unsigned char*>(20, true);
+  _allocations = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<unsigned char*>(20, true);
   _failed = false;
 }
 ResourceTracker::~ResourceTracker() {
--- a/src/share/vm/prims/jvmtiEnvBase.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiEnvBase.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -52,7 +52,7 @@
 // done via JNI GetEnv() call. Multiple attachments are
 // allowed in jvmti.
 
-class JvmtiEnvBase : public CHeapObj {
+class JvmtiEnvBase : public CHeapObj<mtInternal> {
 
  private:
 
@@ -175,7 +175,7 @@
     if (size == 0) {
       *mem_ptr = NULL;
     } else {
-      *mem_ptr = (unsigned char *)os::malloc((size_t)size);
+      *mem_ptr = (unsigned char *)os::malloc((size_t)size, mtInternal);
       if (*mem_ptr == NULL) {
         return JVMTI_ERROR_OUT_OF_MEMORY;
       }
@@ -185,7 +185,7 @@
 
   jvmtiError deallocate(unsigned char* mem) {
     if (mem != NULL) {
-      os::free(mem);
+      os::free(mem, mtInternal);
     }
     return JVMTI_ERROR_NONE;
   }
--- a/src/share/vm/prims/jvmtiEnvThreadState.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiEnvThreadState.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -95,7 +95,7 @@
 //
 
 JvmtiFramePops::JvmtiFramePops() {
-  _pops = new (ResourceObj::C_HEAP) GrowableArray<int> (2, true);
+  _pops = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<int> (2, true);
 }
 
 JvmtiFramePops::~JvmtiFramePops() {
--- a/src/share/vm/prims/jvmtiEnvThreadState.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiEnvThreadState.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -76,7 +76,7 @@
 // It records what frames on a threads stack should post frame_pop events when they're exited.
 //
 
-class JvmtiFramePops : public CHeapObj {
+class JvmtiFramePops : public CHeapObj<mtInternal> {
  private:
   GrowableArray<int>* _pops;
 
@@ -107,7 +107,7 @@
 // 3: Location of last executed instruction, used to filter out duplicate
 //    events due to instruction rewriting.
 
-class JvmtiEnvThreadState : public CHeapObj {
+class JvmtiEnvThreadState : public CHeapObj<mtInternal> {
 private:
   friend class JvmtiEnv;
   JavaThread        *_thread;
--- a/src/share/vm/prims/jvmtiExport.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiExport.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -617,7 +617,7 @@
       if (caching_needed && *_cached_data_ptr == NULL) {
         // data has been changed by the new retransformable agent
         // and it hasn't already been cached, cache it
-        *_cached_data_ptr = (unsigned char *)os::malloc(_curr_len);
+        *_cached_data_ptr = (unsigned char *)os::malloc(_curr_len, mtInternal);
         memcpy(*_cached_data_ptr, _curr_data, _curr_len);
         *_cached_length_ptr = _curr_len;
       }
@@ -720,7 +720,7 @@
     JvmtiCodeBlobEvents::build_jvmti_addr_location_map(nm, &_map, &_map_length);
   }
   ~JvmtiCompiledMethodLoadEventMark() {
-     FREE_C_HEAP_ARRAY(jvmtiAddrLocationMap, _map);
+     FREE_C_HEAP_ARRAY(jvmtiAddrLocationMap, _map, mtInternal);
   }
 
   jint code_size() { return _code_size; }
@@ -2323,7 +2323,7 @@
 // register a stub
 void JvmtiDynamicCodeEventCollector::register_stub(const char* name, address start, address end) {
  if (_code_blobs == NULL) {
-   _code_blobs = new (ResourceObj::C_HEAP) GrowableArray<JvmtiCodeBlobDesc*>(1,true);
+   _code_blobs = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<JvmtiCodeBlobDesc*>(1,true);
  }
  _code_blobs->append(new JvmtiCodeBlobDesc(name, start, end));
 }
@@ -2357,7 +2357,7 @@
 void JvmtiVMObjectAllocEventCollector::record_allocation(oop obj) {
   assert(is_enabled(), "VM object alloc event collector is not enabled");
   if (_allocated == NULL) {
-    _allocated = new (ResourceObj::C_HEAP) GrowableArray<oop>(1, true);
+    _allocated = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<oop>(1, true);
   }
   _allocated->push(obj);
 }
--- a/src/share/vm/prims/jvmtiExport.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiExport.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -350,7 +350,7 @@
 
 // Support class used by JvmtiDynamicCodeEventCollector and others. It
 // describes a single code blob by name and address range.
-class JvmtiCodeBlobDesc : public CHeapObj {
+class JvmtiCodeBlobDesc : public CHeapObj<mtInternal> {
  private:
   char _name[64];
   address _code_begin;
--- a/src/share/vm/prims/jvmtiExtensions.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiExtensions.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -49,8 +49,8 @@
 // event. The function and the event are registered here.
 //
 void JvmtiExtensions::register_extensions() {
-  _ext_functions = new (ResourceObj::C_HEAP) GrowableArray<jvmtiExtensionFunctionInfo*>(1,true);
-  _ext_events = new (ResourceObj::C_HEAP) GrowableArray<jvmtiExtensionEventInfo*>(1,true);
+  _ext_functions = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<jvmtiExtensionFunctionInfo*>(1,true);
+  _ext_events = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<jvmtiExtensionEventInfo*>(1,true);
 
   // register our extension function
   static jvmtiParamInfo func_params[] = {
--- a/src/share/vm/prims/jvmtiGetLoadedClasses.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiGetLoadedClasses.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -152,7 +152,7 @@
 
   // Public methods that get called within the scope of the closure
   void allocate() {
-    _list = NEW_C_HEAP_ARRAY(Handle, _count);
+    _list = NEW_C_HEAP_ARRAY(Handle, _count, mtInternal);
     assert(_list != NULL, "Out of memory");
     if (_list == NULL) {
       _count = 0;
--- a/src/share/vm/prims/jvmtiImpl.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiImpl.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -98,8 +98,8 @@
 void GrowableCache::recache() {
   int len = _elements->length();
 
-  FREE_C_HEAP_ARRAY(address, _cache);
-  _cache = NEW_C_HEAP_ARRAY(address,len+1);
+  FREE_C_HEAP_ARRAY(address, _cache, mtInternal);
+  _cache = NEW_C_HEAP_ARRAY(address,len+1, mtInternal);
 
   for (int i=0; i<len; i++) {
     _cache[i] = _elements->at(i)->getCacheValue();
@@ -142,13 +142,13 @@
 GrowableCache::~GrowableCache() {
   clear();
   delete _elements;
-  FREE_C_HEAP_ARRAY(address, _cache);
+  FREE_C_HEAP_ARRAY(address, _cache, mtInternal);
 }
 
 void GrowableCache::initialize(void *this_obj, void listener_fun(void *, address*) ) {
   _this_obj       = this_obj;
   _listener_fun   = listener_fun;
-  _elements       = new (ResourceObj::C_HEAP) GrowableArray<GrowableElement*>(5,true);
+  _elements       = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<GrowableElement*>(5,true);
   recache();
 }
 
--- a/src/share/vm/prims/jvmtiImpl.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiImpl.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -64,7 +64,7 @@
 // to update its pointer to the address cache.
 //
 
-class GrowableElement : public CHeapObj {
+class GrowableElement : public CHeapObj<mtInternal> {
 public:
   virtual address getCacheValue()          =0;
   virtual bool equals(GrowableElement* e)  =0;
@@ -130,7 +130,7 @@
 // Note   : typesafe wrapper for GrowableCache of JvmtiBreakpoint
 //
 
-class JvmtiBreakpointCache : public CHeapObj {
+class JvmtiBreakpointCache : public CHeapObj<mtInternal> {
 
 private:
   GrowableCache _cache;
@@ -258,7 +258,7 @@
 // CHeap allocated to emphasize its similarity to JvmtiFramePops.
 //
 
-class JvmtiBreakpoints : public CHeapObj {
+class JvmtiBreakpoints : public CHeapObj<mtInternal> {
 private:
 
   JvmtiBreakpointCache _bps;
@@ -496,7 +496,7 @@
 class JvmtiDeferredEventQueue : AllStatic {
   friend class JvmtiDeferredEvent;
  private:
-  class QueueNode : public CHeapObj {
+  class QueueNode : public CHeapObj<mtInternal> {
    private:
     JvmtiDeferredEvent _event;
     QueueNode* _next;
--- a/src/share/vm/prims/jvmtiRawMonitor.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiRawMonitor.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -27,7 +27,7 @@
 #include "runtime/interfaceSupport.hpp"
 #include "runtime/thread.hpp"
 
-GrowableArray<JvmtiRawMonitor*> *JvmtiPendingMonitors::_monitors = new (ResourceObj::C_HEAP) GrowableArray<JvmtiRawMonitor*>(1,true);
+GrowableArray<JvmtiRawMonitor*> *JvmtiPendingMonitors::_monitors = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<JvmtiRawMonitor*>(1,true);
 
 void JvmtiPendingMonitors::transition_raw_monitors() {
   assert((Threads::number_of_threads()==1),
@@ -53,7 +53,7 @@
 
 JvmtiRawMonitor::JvmtiRawMonitor(const char *name) {
 #ifdef ASSERT
-  _name = strcpy(NEW_C_HEAP_ARRAY(char, strlen(name) + 1), name);
+  _name = strcpy(NEW_C_HEAP_ARRAY(char, strlen(name) + 1, mtInternal), name);
 #else
   _name = NULL;
 #endif
--- a/src/share/vm/prims/jvmtiRedefineClasses.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiRedefineClasses.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -831,7 +831,7 @@
 jvmtiError VM_RedefineClasses::load_new_class_versions(TRAPS) {
   // For consistency allocate memory using os::malloc wrapper.
   _scratch_classes = (instanceKlassHandle *)
-    os::malloc(sizeof(instanceKlassHandle) * _class_count);
+    os::malloc(sizeof(instanceKlassHandle) * _class_count, mtInternal);
   if (_scratch_classes == NULL) {
     return JVMTI_ERROR_OUT_OF_MEMORY;
   }
@@ -2478,23 +2478,17 @@
     // to use new constant pool indices as needed. The exception table
     // holds quadruple entries of the form:
     //   (beg_bci, end_bci, handler_bci, klass_index)
-    const int beg_bci_offset     = 0;
-    const int end_bci_offset     = 1;
-    const int handler_bci_offset = 2;
-    const int klass_index_offset = 3;
-    const int entry_size         = 4;
-
-    typeArrayHandle ex_table (THREAD, method->exception_table());
-    int ext_length = ex_table->length();
-    assert(ext_length % entry_size == 0, "exception table format has changed");
-
-    for (int j = 0; j < ext_length; j += entry_size) {
-      int cur_index = ex_table->int_at(j + klass_index_offset);
+
+    ExceptionTable ex_table(method());
+    int ext_length = ex_table.length();
+
+    for (int j = 0; j < ext_length; j ++) {
+      int cur_index = ex_table.catch_type_index(j);
       int new_index = find_new_index(cur_index);
       if (new_index != 0) {
         RC_TRACE_WITH_THREAD(0x00080000, THREAD,
           ("ext-klass_index change: %d to %d", cur_index, new_index));
-        ex_table->int_at_put(j + klass_index_offset, new_index);
+        ex_table.set_catch_type_index(j, new_index);
       }
     } // end for each exception table entry
 
@@ -3236,7 +3230,9 @@
 
   // Copy the "source debug extension" attribute from new class version
   the_class->set_source_debug_extension(
-    scratch_class->source_debug_extension());
+    scratch_class->source_debug_extension(),
+    scratch_class->source_debug_extension() == NULL ? 0 :
+    (int)strlen(scratch_class->source_debug_extension()));
 
   // Use of javac -g could be different in the old and the new
   if (scratch_class->access_flags().has_localvariable_table() !=
--- a/src/share/vm/prims/jvmtiTagMap.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiTagMap.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -55,7 +55,7 @@
 // and the tag value. In addition an entry includes a next pointer which
 // is used to chain entries together.
 
-class JvmtiTagHashmapEntry : public CHeapObj {
+class JvmtiTagHashmapEntry : public CHeapObj<mtInternal> {
  private:
   friend class JvmtiTagMap;
 
@@ -106,7 +106,7 @@
 // entries. It also provides a function to iterate over all entries
 // in the hashmap.
 
-class JvmtiTagHashmap : public CHeapObj {
+class JvmtiTagHashmap : public CHeapObj<mtInternal> {
  private:
   friend class JvmtiTagMap;
 
@@ -150,7 +150,7 @@
     _resize_threshold = (int)(_load_factor * _size);
     _resizing_enabled = true;
     size_t s = initial_size * sizeof(JvmtiTagHashmapEntry*);
-    _table = (JvmtiTagHashmapEntry**)os::malloc(s);
+    _table = (JvmtiTagHashmapEntry**)os::malloc(s, mtInternal);
     if (_table == NULL) {
       vm_exit_out_of_memory(s, "unable to allocate initial hashtable for jvmti object tags");
     }
@@ -188,7 +188,7 @@
 
     // allocate new table
     size_t s = new_size * sizeof(JvmtiTagHashmapEntry*);
-    JvmtiTagHashmapEntry** new_table = (JvmtiTagHashmapEntry**)os::malloc(s);
+    JvmtiTagHashmapEntry** new_table = (JvmtiTagHashmapEntry**)os::malloc(s, mtInternal);
     if (new_table == NULL) {
       warning("unable to allocate larger hashtable for jvmti object tags");
       set_resizing_enabled(false);
@@ -585,7 +585,7 @@
     _o = klassOop_if_java_lang_Class(o);
 
     // object size
-    _obj_size = _o->size() * wordSize;
+    _obj_size = (jlong)_o->size() * wordSize;
 
     // record the context
     _tag_map = tag_map;
@@ -776,7 +776,7 @@
 // For each field it holds the field index (as defined by the JVMTI specification),
 // the field type, and the offset.
 
-class ClassFieldDescriptor: public CHeapObj {
+class ClassFieldDescriptor: public CHeapObj<mtInternal> {
  private:
   int _field_index;
   int _field_offset;
@@ -790,7 +790,7 @@
   int field_offset() const  { return _field_offset; }
 };
 
-class ClassFieldMap: public CHeapObj {
+class ClassFieldMap: public CHeapObj<mtInternal> {
  private:
   enum {
     initial_field_count = 5
@@ -821,7 +821,8 @@
 };
 
 ClassFieldMap::ClassFieldMap() {
-  _fields = new (ResourceObj::C_HEAP) GrowableArray<ClassFieldDescriptor*>(initial_field_count, true);
+  _fields = new (ResourceObj::C_HEAP, mtInternal)
+    GrowableArray<ClassFieldDescriptor*>(initial_field_count, true);
 }
 
 ClassFieldMap::~ClassFieldMap() {
@@ -892,7 +893,7 @@
 // heap iteration and avoid creating a field map for each object in the heap
 // (only need to create the map when the first instance of a class is encountered).
 //
-class JvmtiCachedClassFieldMap : public CHeapObj {
+class JvmtiCachedClassFieldMap : public CHeapObj<mtInternal> {
  private:
    enum {
      initial_class_count = 200
@@ -957,7 +958,8 @@
 // record that the given instanceKlass is caching a field map
 void JvmtiCachedClassFieldMap::add_to_class_list(instanceKlass* ik) {
   if (_class_list == NULL) {
-    _class_list = new (ResourceObj::C_HEAP) GrowableArray<instanceKlass*>(initial_class_count, true);
+    _class_list = new (ResourceObj::C_HEAP, mtInternal)
+      GrowableArray<instanceKlass*>(initial_class_count, true);
   }
   _class_list->push(ik);
 }
@@ -1526,8 +1528,8 @@
     _env = env;
     _tags = (jlong*)tags;
     _tag_count = tag_count;
-    _object_results = new (ResourceObj::C_HEAP) GrowableArray<jobject>(1,true);
-    _tag_results = new (ResourceObj::C_HEAP) GrowableArray<uint64_t>(1,true);
+    _object_results = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<jobject>(1,true);
+    _tag_results = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<uint64_t>(1,true);
   }
 
   ~TagObjectCollector() {
@@ -1672,8 +1674,8 @@
   Universe::heap()->ensure_parsability(false);  // no need to retire TLABs
 
   // create stacks for interesting headers
-  _saved_mark_stack = new (ResourceObj::C_HEAP) GrowableArray<markOop>(4000, true);
-  _saved_oop_stack = new (ResourceObj::C_HEAP) GrowableArray<oop>(4000, true);
+  _saved_mark_stack = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<markOop>(4000, true);
+  _saved_oop_stack = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<oop>(4000, true);
 
   if (UseBiasedLocking) {
     BiasedLocking::preserve_marks();
@@ -2712,7 +2714,7 @@
   bool _reporting_string_values;
 
   GrowableArray<oop>* create_visit_stack() {
-    return new (ResourceObj::C_HEAP) GrowableArray<oop>(initial_visit_stack_size, true);
+    return new (ResourceObj::C_HEAP, mtInternal) GrowableArray<oop>(initial_visit_stack_size, true);
   }
 
   // accessors
--- a/src/share/vm/prims/jvmtiTagMap.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiTagMap.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -41,7 +41,7 @@
 class JvmtiTagHashmapEntry;
 class JvmtiTagHashmapEntryClosure;
 
-class JvmtiTagMap :  public CHeapObj {
+class JvmtiTagMap :  public CHeapObj<mtInternal> {
  private:
 
   enum{
--- a/src/share/vm/prims/jvmtiThreadState.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiThreadState.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -72,7 +72,7 @@
 //
 // The Jvmti state for each thread (across all JvmtiEnv):
 // 1. Local table of enabled events.
-class JvmtiThreadState : public CHeapObj {
+class JvmtiThreadState : public CHeapObj<mtInternal> {
  private:
   friend class JvmtiEnv;
   JavaThread        *_thread;
--- a/src/share/vm/prims/jvmtiUtil.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/jvmtiUtil.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -40,7 +40,7 @@
   if (_single_threaded_resource_area == NULL) {
     // lazily create the single threaded resource area
     // pick a size which is not a standard since the pools don't exist yet
-    _single_threaded_resource_area = new ResourceArea(Chunk::non_pool_size);
+    _single_threaded_resource_area = new (mtInternal) ResourceArea(Chunk::non_pool_size);
   }
   return _single_threaded_resource_area;
 }
--- a/src/share/vm/prims/methodHandleWalk.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/methodHandleWalk.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 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
@@ -1796,7 +1796,7 @@
   {
     methodOop m_oop = oopFactory::new_method(bytecode_length(),
                                              accessFlags_from(flags_bits),
-                                             0, 0, 0, oopDesc::IsSafeConc, CHECK_(empty));
+                                             0, 0, 0, 0, oopDesc::IsSafeConc, CHECK_(empty));
     m = methodHandle(THREAD, m_oop);
   }
 
@@ -1812,9 +1812,6 @@
   m->set_max_locals(max_locals());
   m->set_size_of_parameters(_num_params);
 
-  typeArrayHandle exception_handlers(THREAD, Universe::the_empty_int_array());
-  m->set_exception_table(exception_handlers());
-
   // Rewrite the method and set up the constant pool cache.
   objArrayOop m_array = oopFactory::new_system_objArray(1, CHECK_(empty));
   objArrayHandle methods(THREAD, m_array);
--- a/src/share/vm/prims/methodHandles.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/methodHandles.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -3180,17 +3180,15 @@
       jclass MH_class = env->FindClass(MH_name);
       status = env->RegisterNatives(MH_class, invoke_methods, sizeof(invoke_methods)/sizeof(JNINativeMethod));
     }
+    if (!env->ExceptionOccurred()) {
+      status = env->RegisterNatives(MHN_class, call_site_methods, sizeof(call_site_methods)/sizeof(JNINativeMethod));
+    }
     if (env->ExceptionOccurred()) {
       warning("JSR 292 method handle code is mismatched to this JVM.  Disabling support.");
       enable_MH = false;
       env->ExceptionClear();
     }
 
-    status = env->RegisterNatives(MHN_class, call_site_methods, sizeof(call_site_methods)/sizeof(JNINativeMethod));
-    if (env->ExceptionOccurred()) {
-      // Exception is okay until 7087357
-      env->ExceptionClear();
-    }
   }
 
   if (enable_MH) {
--- a/src/share/vm/prims/unsafe.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/unsafe.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -178,17 +178,6 @@
     v = *(oop*)index_oop_from_field_offset_long(p, offset);                 \
   }
 
-#define GET_OOP_FIELD_VOLATILE(obj, offset, v) \
-  oop p = JNIHandles::resolve(obj);   \
-  volatile oop v;                     \
-  if (UseCompressedOops) {            \
-    volatile narrowOop n = *(volatile narrowOop*)index_oop_from_field_offset_long(p, offset); \
-    v = oopDesc::decode_heap_oop(n);                               \
-  } else {                            \
-    v = *(volatile oop*)index_oop_from_field_offset_long(p, offset);       \
-  } \
-  OrderAccess::acquire();
-
 
 // Get/SetObject must be special-cased, since it works with handles.
 
@@ -296,28 +285,21 @@
 
 UNSAFE_ENTRY(jobject, Unsafe_GetObjectVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset))
   UnsafeWrapper("Unsafe_GetObjectVolatile");
-  GET_OOP_FIELD_VOLATILE(obj, offset, v)
+  oop p = JNIHandles::resolve(obj);
+  void* addr = index_oop_from_field_offset_long(p, offset);
+  volatile oop v;
+  if (UseCompressedOops) {
+    volatile narrowOop n = *(volatile narrowOop*) addr;
+    v = oopDesc::decode_heap_oop(n);
+  } else {
+    v = *(volatile oop*) addr;
+  }
+  OrderAccess::acquire();
   return JNIHandles::make_local(env, v);
 UNSAFE_END
 
 UNSAFE_ENTRY(void, Unsafe_SetObjectVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h))
   UnsafeWrapper("Unsafe_SetObjectVolatile");
-  {
-    // Catch VolatileCallSite.target stores (via
-    // CallSite.setTargetVolatile) and check call site dependencies.
-    oop p = JNIHandles::resolve(obj);
-    if ((offset == java_lang_invoke_CallSite::target_offset_in_bytes()) && p->is_a(SystemDictionary::CallSite_klass())) {
-      Handle call_site    (THREAD, p);
-      Handle method_handle(THREAD, JNIHandles::resolve(x_h));
-      assert(call_site    ->is_a(SystemDictionary::CallSite_klass()),     "must be");
-      assert(method_handle->is_a(SystemDictionary::MethodHandle_klass()), "must be");
-      {
-        // Walk all nmethods depending on this call site.
-        MutexLocker mu(Compile_lock, thread);
-        Universe::flush_dependents_on(call_site(), method_handle());
-      }
-    }
-  }
   oop x = JNIHandles::resolve(x_h);
   oop p = JNIHandles::resolve(obj);
   void* addr = index_oop_from_field_offset_long(p, offset);
@@ -596,7 +578,7 @@
     return 0;
   }
   sz = round_to(sz, HeapWordSize);
-  void* x = os::malloc(sz);
+  void* x = os::malloc(sz, mtInternal);
   if (x == NULL) {
     THROW_0(vmSymbols::java_lang_OutOfMemoryError());
   }
@@ -616,7 +598,7 @@
     return 0;
   }
   sz = round_to(sz, HeapWordSize);
-  void* x = (p == NULL) ? os::malloc(sz) : os::realloc(p, sz);
+  void* x = (p == NULL) ? os::malloc(sz, mtInternal) : os::realloc(p, sz, mtInternal);
   if (x == NULL) {
     THROW_0(vmSymbols::java_lang_OutOfMemoryError());
   }
@@ -877,7 +859,7 @@
         return 0;
     }
 
-    body = NEW_C_HEAP_ARRAY(jbyte, length);
+    body = NEW_C_HEAP_ARRAY(jbyte, length, mtInternal);
 
     if (body == 0) {
         throw_new(env, "OutOfMemoryError");
@@ -893,7 +875,7 @@
         uint len = env->GetStringUTFLength(name);
         int unicode_len = env->GetStringLength(name);
         if (len >= sizeof(buf)) {
-            utfName = NEW_C_HEAP_ARRAY(char, len + 1);
+            utfName = NEW_C_HEAP_ARRAY(char, len + 1, mtInternal);
             if (utfName == NULL) {
                 throw_new(env, "OutOfMemoryError");
                 goto free_body;
@@ -913,10 +895,10 @@
     result = JVM_DefineClass(env, utfName, loader, body, length, pd);
 
     if (utfName && utfName != buf)
-        FREE_C_HEAP_ARRAY(char, utfName);
+        FREE_C_HEAP_ARRAY(char, utfName, mtInternal);
 
  free_body:
-    FREE_C_HEAP_ARRAY(jbyte, body);
+    FREE_C_HEAP_ARRAY(jbyte, body, mtInternal);
     return result;
   }
 }
@@ -1011,7 +993,7 @@
 
   jint length = typeArrayOop(JNIHandles::resolve_non_null(data))->length();
   jint word_length = (length + sizeof(HeapWord)-1) / sizeof(HeapWord);
-  HeapWord* body = NEW_C_HEAP_ARRAY(HeapWord, word_length);
+  HeapWord* body = NEW_C_HEAP_ARRAY(HeapWord, word_length, mtInternal);
   if (body == NULL) {
     THROW_0(vmSymbols::java_lang_OutOfMemoryError());
   }
@@ -1095,7 +1077,7 @@
 
   // try/finally clause:
   if (temp_alloc != NULL) {
-    FREE_C_HEAP_ARRAY(HeapWord, temp_alloc);
+    FREE_C_HEAP_ARRAY(HeapWord, temp_alloc, mtInternal);
   }
 
   return (jclass) res_jh;
--- a/src/share/vm/prims/whitebox.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/prims/whitebox.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -113,6 +113,9 @@
   int offset = offset_for_field(field_name, object,
       vmSymbols::string_signature());
   oop string = object->obj_field(offset);
+  if (string == NULL) {
+    return NULL;
+  }
   const char* ret = java_lang_String::as_utf8_string(string);
   return ret;
 }
--- a/src/share/vm/runtime/arguments.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/arguments.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -35,6 +35,7 @@
 #include "runtime/globals_extension.hpp"
 #include "runtime/java.hpp"
 #include "services/management.hpp"
+#include "services/memTracker.hpp"
 #include "utilities/defaultStream.hpp"
 #include "utilities/taskqueue.hpp"
 #ifdef TARGET_OS_FAMILY_linux
@@ -367,7 +368,7 @@
 inline void SysClassPath::reset_item_at(int index) {
   assert(index < _scp_nitems && index != _scp_base, "just checking");
   if (_items[index] != NULL) {
-    FREE_C_HEAP_ARRAY(char, _items[index]);
+    FREE_C_HEAP_ARRAY(char, _items[index], mtInternal);
     _items[index] = NULL;
   }
 }
@@ -399,11 +400,11 @@
       expanded_path = add_jars_to_path(expanded_path, path);
       path = end;
     } else {
-      char* dirpath = NEW_C_HEAP_ARRAY(char, tmp_end - path + 1);
+      char* dirpath = NEW_C_HEAP_ARRAY(char, tmp_end - path + 1, mtInternal);
       memcpy(dirpath, path, tmp_end - path);
       dirpath[tmp_end - path] = '\0';
       expanded_path = add_jars_to_path(expanded_path, dirpath);
-      FREE_C_HEAP_ARRAY(char, dirpath);
+      FREE_C_HEAP_ARRAY(char, dirpath, mtInternal);
       path = tmp_end + 1;
     }
   }
@@ -434,7 +435,7 @@
   assert(total_len > 0, "empty sysclasspath not allowed");
 
   // Copy the _items to a single string.
-  char* cp = NEW_C_HEAP_ARRAY(char, total_len);
+  char* cp = NEW_C_HEAP_ARRAY(char, total_len, mtInternal);
   char* cp_tmp = cp;
   for (i = 0; i < _scp_nitems; ++i) {
     if (_items[i] != NULL) {
@@ -455,7 +456,7 @@
   assert(str != NULL, "just checking");
   if (path == NULL) {
     size_t len = strlen(str) + 1;
-    cp = NEW_C_HEAP_ARRAY(char, len);
+    cp = NEW_C_HEAP_ARRAY(char, len, mtInternal);
     memcpy(cp, str, len);                       // copy the trailing null
   } else {
     const char separator = *os::path_separator();
@@ -464,15 +465,15 @@
     size_t len = old_len + str_len + 2;
 
     if (prepend) {
-      cp = NEW_C_HEAP_ARRAY(char, len);
+      cp = NEW_C_HEAP_ARRAY(char, len, mtInternal);
       char* cp_tmp = cp;
       memcpy(cp_tmp, str, str_len);
       cp_tmp += str_len;
       *cp_tmp = separator;
       memcpy(++cp_tmp, path, old_len + 1);      // copy the trailing null
-      FREE_C_HEAP_ARRAY(char, path);
+      FREE_C_HEAP_ARRAY(char, path, mtInternal);
     } else {
-      cp = REALLOC_C_HEAP_ARRAY(char, path, len);
+      cp = REALLOC_C_HEAP_ARRAY(char, path, len, mtInternal);
       char* cp_tmp = cp + old_len;
       *cp_tmp = separator;
       memcpy(++cp_tmp, str, str_len + 1);       // copy the trailing null
@@ -494,7 +495,7 @@
 
   /* Scan the directory for jars/zips, appending them to path. */
   struct dirent *entry;
-  char *dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(directory));
+  char *dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(directory), mtInternal);
   while ((entry = os::readdir(dir, (dirent *) dbuf)) != NULL) {
     const char* name = entry->d_name;
     const char* ext = name + strlen(name) - 4;
@@ -502,13 +503,13 @@
       (os::file_name_strcmp(ext, ".jar") == 0 ||
        os::file_name_strcmp(ext, ".zip") == 0);
     if (isJarOrZip) {
-      char* jarpath = NEW_C_HEAP_ARRAY(char, directory_len + 2 + strlen(name));
+      char* jarpath = NEW_C_HEAP_ARRAY(char, directory_len + 2 + strlen(name), mtInternal);
       sprintf(jarpath, "%s%s%s", directory, dir_sep, name);
       path = add_to_path(path, jarpath, false);
-      FREE_C_HEAP_ARRAY(char, jarpath);
+      FREE_C_HEAP_ARRAY(char, jarpath, mtInternal);
     }
   }
-  FREE_C_HEAP_ARRAY(char, dbuf);
+  FREE_C_HEAP_ARRAY(char, dbuf, mtInternal);
   os::closedir(dir);
   return path;
 }
@@ -630,7 +631,7 @@
 static bool set_string_flag(char* name, const char* value, FlagValueOrigin origin) {
   if (!CommandLineFlags::ccstrAtPut(name, &value, origin))  return false;
   // Contract:  CommandLineFlags always returns a pointer that needs freeing.
-  FREE_C_HEAP_ARRAY(char, value);
+  FREE_C_HEAP_ARRAY(char, value, mtInternal);
   return true;
 }
 
@@ -646,7 +647,7 @@
   } else if (new_len == 0) {
     value = old_value;
   } else {
-    char* buf = NEW_C_HEAP_ARRAY(char, old_len + 1 + new_len + 1);
+    char* buf = NEW_C_HEAP_ARRAY(char, old_len + 1 + new_len + 1, mtInternal);
     // each new setting adds another LINE to the switch:
     sprintf(buf, "%s\n%s", old_value, new_value);
     value = buf;
@@ -654,10 +655,10 @@
   }
   (void) CommandLineFlags::ccstrAtPut(name, &value, origin);
   // CommandLineFlags always returns a pointer that needs freeing.
-  FREE_C_HEAP_ARRAY(char, value);
+  FREE_C_HEAP_ARRAY(char, value, mtInternal);
   if (free_this_too != NULL) {
     // CommandLineFlags made its own copy, so I must delete my own temp. buffer.
-    FREE_C_HEAP_ARRAY(char, free_this_too);
+    FREE_C_HEAP_ARRAY(char, free_this_too, mtInternal);
   }
   return true;
 }
@@ -734,9 +735,9 @@
   // expand the array and add arg to the last element
   (*count)++;
   if (*bldarray == NULL) {
-    *bldarray = NEW_C_HEAP_ARRAY(char*, *count);
+    *bldarray = NEW_C_HEAP_ARRAY(char*, *count, mtInternal);
   } else {
-    *bldarray = REALLOC_C_HEAP_ARRAY(char*, *bldarray, *count);
+    *bldarray = REALLOC_C_HEAP_ARRAY(char*, *bldarray, *count, mtInternal);
   }
   (*bldarray)[index] = strdup(arg);
 }
@@ -916,13 +917,13 @@
   char* value = (char *)ns;
 
   size_t key_len = (eq == NULL) ? strlen(prop) : (eq - prop);
-  key = AllocateHeap(key_len + 1, "add_property");
+  key = AllocateHeap(key_len + 1, mtInternal);
   strncpy(key, prop, key_len);
   key[key_len] = '\0';
 
   if (eq != NULL) {
     size_t value_len = strlen(prop) - key_len - 1;
-    value = AllocateHeap(value_len + 1, "add_property");
+    value = AllocateHeap(value_len + 1, mtInternal);
     strncpy(value, &prop[key_len + 1], value_len + 1);
   }
 
@@ -2057,12 +2058,12 @@
     const char* altclasses_jar = "alt-rt.jar";
     size_t altclasses_path_len = strlen(get_meta_index_dir()) + 1 +
                                  strlen(altclasses_jar);
-    char* altclasses_path = NEW_C_HEAP_ARRAY(char, altclasses_path_len);
+    char* altclasses_path = NEW_C_HEAP_ARRAY(char, altclasses_path_len, mtInternal);
     strcpy(altclasses_path, get_meta_index_dir());
     strcat(altclasses_path, altclasses_jar);
     scp.add_suffix_to_prefix(altclasses_path);
     scp_assembly_required = true;
-    FREE_C_HEAP_ARRAY(char, altclasses_path);
+    FREE_C_HEAP_ARRAY(char, altclasses_path, mtInternal);
   }
 
   if (WhiteBoxAPI) {
@@ -2070,12 +2071,12 @@
     const char* wb_jar = "wb.jar";
     size_t wb_path_len = strlen(get_meta_index_dir()) + 1 +
                          strlen(wb_jar);
-    char* wb_path = NEW_C_HEAP_ARRAY(char, wb_path_len);
+    char* wb_path = NEW_C_HEAP_ARRAY(char, wb_path_len, mtInternal);
     strcpy(wb_path, get_meta_index_dir());
     strcat(wb_path, wb_jar);
     scp.add_suffix(wb_path);
     scp_assembly_required = true;
-    FREE_C_HEAP_ARRAY(char, wb_path);
+    FREE_C_HEAP_ARRAY(char, wb_path, mtInternal);
   }
 
   // Parse _JAVA_OPTIONS environment variable (if present) (mimics classic VM)
@@ -2160,13 +2161,13 @@
       if (tail != NULL) {
         const char* pos = strchr(tail, ':');
         size_t len = (pos == NULL) ? strlen(tail) : pos - tail;
-        char* name = (char*)memcpy(NEW_C_HEAP_ARRAY(char, len + 1), tail, len);
+        char* name = (char*)memcpy(NEW_C_HEAP_ARRAY(char, len + 1, mtInternal), tail, len);
         name[len] = '\0';
 
         char *options = NULL;
         if(pos != NULL) {
           size_t len2 = strlen(pos+1) + 1; // options start after ':'.  Final zero must be copied.
-          options = (char*)memcpy(NEW_C_HEAP_ARRAY(char, len2), pos+1, len2);
+          options = (char*)memcpy(NEW_C_HEAP_ARRAY(char, len2, mtInternal), pos+1, len2);
         }
 #ifdef JVMTI_KERNEL
         if ((strcmp(name, "hprof") == 0) || (strcmp(name, "jdwp") == 0)) {
@@ -2181,12 +2182,12 @@
       if(tail != NULL) {
         const char* pos = strchr(tail, '=');
         size_t len = (pos == NULL) ? strlen(tail) : pos - tail;
-        char* name = strncpy(NEW_C_HEAP_ARRAY(char, len + 1), tail, len);
+        char* name = strncpy(NEW_C_HEAP_ARRAY(char, len + 1, mtInternal), tail, len);
         name[len] = '\0';
 
         char *options = NULL;
         if(pos != NULL) {
-          options = strcpy(NEW_C_HEAP_ARRAY(char, strlen(pos + 1) + 1), pos + 1);
+          options = strcpy(NEW_C_HEAP_ARRAY(char, strlen(pos + 1) + 1, mtInternal), pos + 1);
         }
 #ifdef JVMTI_KERNEL
         if ((strcmp(name, "hprof") == 0) || (strcmp(name, "jdwp") == 0)) {
@@ -2199,7 +2200,7 @@
     // -javaagent
     } else if (match_option(option, "-javaagent:", &tail)) {
       if(tail != NULL) {
-        char *options = strcpy(NEW_C_HEAP_ARRAY(char, strlen(tail) + 1), tail);
+        char *options = strcpy(NEW_C_HEAP_ARRAY(char, strlen(tail) + 1, mtInternal), tail);
         add_init_agent("instrument", options, false);
       }
     // -Xnoclassgc
@@ -2707,6 +2708,17 @@
         return JNI_EINVAL;
       }
       FLAG_SET_CMDLINE(uintx, ConcGCThreads, conc_threads);
+    } else if (match_option(option, "-XX:MaxDirectMemorySize=", &tail)) {
+      julong max_direct_memory_size = 0;
+      ArgsRange errcode = parse_memory_size(tail, &max_direct_memory_size, 0);
+      if (errcode != arg_in_range) {
+        jio_fprintf(defaultStream::error_stream(),
+                    "Invalid maximum direct memory size: %s\n",
+                    option->optionString);
+        describe_range_error(errcode);
+        return JNI_EINVAL;
+      }
+      FLAG_SET_CMDLINE(uintx, MaxDirectMemorySize, max_direct_memory_size);
     } else if (match_option(option, "-XX:", &tail)) { // -XX:xxxx
       // Skip -XX:Flags= since that case has already been handled
       if (strncmp(tail, "Flags=", strlen("Flags=")) != 0) {
@@ -2957,7 +2969,7 @@
   char *end = strrchr(jvm_path, *os::file_separator());
   if (end != NULL) *end = '\0';
   char *shared_archive_path = NEW_C_HEAP_ARRAY(char, strlen(jvm_path) +
-                                        strlen(os::file_separator()) + 20);
+      strlen(os::file_separator()) + 20, mtInternal);
   if (shared_archive_path == NULL) return JNI_ENOMEM;
   strcpy(shared_archive_path, jvm_path);
   strcat(shared_archive_path, os::file_separator());
@@ -2970,7 +2982,10 @@
   const char* tail;
 
   // If flag "-XX:Flags=flags-file" is used it will be the first option to be processed.
+  const char* hotspotrc = ".hotspotrc";
   bool settings_file_specified = false;
+  bool needs_hotspotrc_warning = false;
+
   const char* flags_file;
   int index;
   for (index = 0; index < args->nOptions; index++) {
@@ -2995,6 +3010,10 @@
       CommandLineFlags::printFlags(tty, false);
       vm_exit(0);
     }
+    if (match_option(option, "-XX:NativeMemoryTracking", &tail)) {
+      MemTracker::init_tracking_options(tail);
+    }
+
 
 #ifndef PRODUCT
     if (match_option(option, "-XX:+PrintFlagsWithComments", &tail)) {
@@ -3014,16 +3033,19 @@
     if (!process_settings_file(flags_file, true, args->ignoreUnrecognized)) {
       return JNI_EINVAL;
     }
-  }
-
+  } else {
 #ifdef ASSERT
-  // Parse default .hotspotrc settings file
-  if (!settings_file_specified) {
+    // Parse default .hotspotrc settings file
     if (!process_settings_file(".hotspotrc", false, args->ignoreUnrecognized)) {
       return JNI_EINVAL;
     }
+#else
+    struct stat buf;
+    if (os::stat(hotspotrc, &buf) == 0) {
+      needs_hotspotrc_warning = true;
+    }
+#endif
   }
-#endif
 
   if (PrintVMOptions) {
     for (index = 0; index < args->nOptions; index++) {
@@ -3040,6 +3062,14 @@
     return result;
   }
 
+  // Delay warning until here so that we've had a chance to process
+  // the -XX:-PrintWarnings flag
+  if (needs_hotspotrc_warning) {
+    warning("%s file is present but has been ignored.  "
+            "Run with -XX:Flags=%s to load the file.",
+            hotspotrc, hotspotrc);
+  }
+
 #if (defined JAVASE_EMBEDDED || defined ARM)
   UNSUPPORTED_OPTION(UseG1GC, "G1 GC");
 #endif
@@ -3332,7 +3362,7 @@
     }
   }
   // Add one for null terminator.
-  char *props = AllocateHeap(length + 1, "get_kernel_properties");
+  char *props = AllocateHeap(length + 1, mtInternal);
   if (length != 0) {
     int pos = 0;
     for (prop = _system_properties; prop != NULL; prop = prop->next()) {
--- a/src/share/vm/runtime/arguments.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/arguments.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -44,7 +44,7 @@
 
 // Element describing System and User (-Dkey=value flags) defined property.
 
-class SystemProperty: public CHeapObj {
+class SystemProperty: public CHeapObj<mtInternal> {
  private:
   char*           _key;
   char*           _value;
@@ -63,7 +63,7 @@
       if (_value != NULL) {
         FreeHeap(_value);
       }
-      _value = AllocateHeap(strlen(value)+1);
+      _value = AllocateHeap(strlen(value)+1, mtInternal);
       if (_value != NULL) {
         strcpy(_value, value);
       }
@@ -80,7 +80,7 @@
       if (_value != NULL) {
         len += strlen(_value);
       }
-      sp = AllocateHeap(len+2);
+      sp = AllocateHeap(len+2, mtInternal);
       if (sp != NULL) {
         if (_value != NULL) {
           strcpy(sp, _value);
@@ -100,13 +100,13 @@
     if (key == NULL) {
       _key = NULL;
     } else {
-      _key = AllocateHeap(strlen(key)+1);
+      _key = AllocateHeap(strlen(key)+1, mtInternal);
       strcpy(_key, key);
     }
     if (value == NULL) {
       _value = NULL;
     } else {
-      _value = AllocateHeap(strlen(value)+1);
+      _value = AllocateHeap(strlen(value)+1, mtInternal);
       strcpy(_value, value);
     }
     _next = NULL;
@@ -116,7 +116,7 @@
 
 
 // For use by -agentlib, -agentpath and -Xrun
-class AgentLibrary : public CHeapObj {
+class AgentLibrary : public CHeapObj<mtInternal> {
   friend class AgentLibraryList;
  private:
   char*           _name;
@@ -136,12 +136,12 @@
 
   // Constructor
   AgentLibrary(const char* name, const char* options, bool is_absolute_path, void* os_lib) {
-    _name = AllocateHeap(strlen(name)+1);
+    _name = AllocateHeap(strlen(name)+1, mtInternal);
     strcpy(_name, name);
     if (options == NULL) {
       _options = NULL;
     } else {
-      _options = AllocateHeap(strlen(options)+1);
+      _options = AllocateHeap(strlen(options)+1, mtInternal);
       strcpy(_options, options);
     }
     _is_absolute_path = is_absolute_path;
--- a/src/share/vm/runtime/biasedLocking.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/biasedLocking.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -687,8 +687,8 @@
   // monitors in a prepass and, if they are biased, preserve their
   // mark words here. This should be a relatively small set of objects
   // especially compared to the number of objects in the heap.
-  _preserved_mark_stack = new (ResourceObj::C_HEAP) GrowableArray<markOop>(10, true);
-  _preserved_oop_stack = new (ResourceObj::C_HEAP) GrowableArray<Handle>(10, true);
+  _preserved_mark_stack = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<markOop>(10, true);
+  _preserved_oop_stack = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<Handle>(10, true);
 
   ResourceMark rm;
   Thread* cur = Thread::current();
--- a/src/share/vm/runtime/compilationPolicy.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/compilationPolicy.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -37,7 +37,7 @@
 class CompileTask;
 class CompileQueue;
 
-class CompilationPolicy : public CHeapObj {
+class CompilationPolicy : public CHeapObj<mtCompiler> {
   static CompilationPolicy* _policy;
   // Accumulated time
   static elapsedTimer       _accumulated_time;
--- a/src/share/vm/runtime/deoptimization.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/deoptimization.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -101,7 +101,7 @@
   _number_of_frames          = number_of_frames;
   _frame_sizes               = frame_sizes;
   _frame_pcs                 = frame_pcs;
-  _register_block            = NEW_C_HEAP_ARRAY(intptr_t, RegisterMap::reg_count * 2);
+  _register_block            = NEW_C_HEAP_ARRAY(intptr_t, RegisterMap::reg_count * 2, mtCompiler);
   _return_type               = return_type;
   _initial_info              = 0;
   // PD (x86 only)
@@ -114,9 +114,9 @@
 
 
 Deoptimization::UnrollBlock::~UnrollBlock() {
-  FREE_C_HEAP_ARRAY(intptr_t, _frame_sizes);
-  FREE_C_HEAP_ARRAY(intptr_t, _frame_pcs);
-  FREE_C_HEAP_ARRAY(intptr_t, _register_block);
+  FREE_C_HEAP_ARRAY(intptr_t, _frame_sizes, mtCompiler);
+  FREE_C_HEAP_ARRAY(intptr_t, _frame_pcs, mtCompiler);
+  FREE_C_HEAP_ARRAY(intptr_t, _register_block, mtCompiler);
 }
 
 
@@ -358,9 +358,9 @@
 
   // Compute the vframes' sizes.  Note that frame_sizes[] entries are ordered from outermost to innermost
   // virtual activation, which is the reverse of the elements in the vframes array.
-  intptr_t* frame_sizes = NEW_C_HEAP_ARRAY(intptr_t, number_of_frames);
+  intptr_t* frame_sizes = NEW_C_HEAP_ARRAY(intptr_t, number_of_frames, mtCompiler);
   // +1 because we always have an interpreter return address for the final slot.
-  address* frame_pcs = NEW_C_HEAP_ARRAY(address, number_of_frames + 1);
+  address* frame_pcs = NEW_C_HEAP_ARRAY(address, number_of_frames + 1, mtCompiler);
   int popframe_extra_args = 0;
   // Create an interpreter return address for the stub to use as its return
   // address so the skeletal frames are perfectly walkable
--- a/src/share/vm/runtime/deoptimization.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/deoptimization.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -129,7 +129,7 @@
 
   // UnrollBlock is returned by fetch_unroll_info() to the deoptimization handler (blob).
   // This is only a CheapObj to ease debugging after a deopt failure
-  class UnrollBlock : public CHeapObj {
+  class UnrollBlock : public CHeapObj<mtCompiler> {
    private:
     int       _size_of_deoptimized_frame; // Size, in bytes, of current deoptimized frame
     int       _caller_adjustment;         // Adjustment, in bytes, to caller's SP by initial interpreted frame
--- a/src/share/vm/runtime/dtraceJSDT.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/dtraceJSDT.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -63,7 +63,7 @@
   static jboolean is_supported();
 };
 
-class RegisteredProbes : public CHeapObj {
+class RegisteredProbes : public CHeapObj<mtInternal> {
  private:
   nmethod** _nmethods;      // all the probe methods
   size_t    _count;         // number of probe methods
@@ -72,7 +72,7 @@
  public:
   RegisteredProbes(size_t count) {
     _count = count;
-    _nmethods = NEW_C_HEAP_ARRAY(nmethod*, count);
+    _nmethods = NEW_C_HEAP_ARRAY(nmethod*, count, mtInternal);
   }
 
   ~RegisteredProbes() {
@@ -81,7 +81,7 @@
       _nmethods[i]->make_not_entrant();
       _nmethods[i]->method()->clear_code();
     }
-    FREE_C_HEAP_ARRAY(nmethod*, _nmethods);
+    FREE_C_HEAP_ARRAY(nmethod*, _nmethods, mtInternal);
     _nmethods = NULL;
     _count = 0;
   }
--- a/src/share/vm/runtime/fieldDescriptor.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/fieldDescriptor.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -39,6 +39,10 @@
 }
 
 Symbol* fieldDescriptor::generic_signature() const {
+  if (!has_generic_signature()) {
+    return NULL;
+  }
+
   int idx = 0;
   instanceKlass* ik = instanceKlass::cast(field_holder());
   for (AllFieldStream fs(ik); !fs.done(); fs.next()) {
--- a/src/share/vm/runtime/fieldDescriptor.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/fieldDescriptor.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -100,6 +100,7 @@
   bool is_field_access_watched() const    { return access_flags().is_field_access_watched(); }
   bool is_field_modification_watched() const
                                           { return access_flags().is_field_modification_watched(); }
+  bool has_generic_signature() const      { return access_flags().field_has_generic_signature(); }
 
   void set_is_field_access_watched(const bool value) {
     _access_flags.set_is_field_access_watched(value);
--- a/src/share/vm/runtime/fprofiler.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/fprofiler.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -70,12 +70,12 @@
 ThreadProfiler::ThreadProfiler() {
   // Space for the ProfilerNodes
   const int area_size = 1 * ProfilerNodeSize * 1024;
-  area_bottom = AllocateHeap(area_size, "fprofiler");
+  area_bottom = AllocateHeap(area_size, mtInternal);
   area_top    = area_bottom;
   area_limit  = area_bottom + area_size;
 
   // ProfilerNode pointer table
-  table = NEW_C_HEAP_ARRAY(ProfilerNode*, table_size);
+  table = NEW_C_HEAP_ARRAY(ProfilerNode*, table_size, mtInternal);
   initialize();
   engaged = false;
 }
@@ -157,7 +157,7 @@
 void PCRecorder::init() {
   MutexLockerEx lm(CodeCache_lock, Mutex::_no_safepoint_check_flag);
   int s = size();
-  counters = NEW_C_HEAP_ARRAY(int, s);
+  counters = NEW_C_HEAP_ARRAY(int, s, mtInternal);
   for (int index = 0; index < s; index++) {
     counters[index] = 0;
   }
@@ -850,7 +850,7 @@
   if (Threads_lock->try_lock()) {
     {  // Threads_lock scope
       maxthreads = Threads::number_of_threads();
-      threadsList = NEW_C_HEAP_ARRAY(JavaThread *, maxthreads);
+      threadsList = NEW_C_HEAP_ARRAY(JavaThread *, maxthreads, mtInternal);
       suspendedthreadcount = 0;
       for (JavaThread* tp = Threads::first(); tp != NULL; tp = tp->next()) {
         if (tp->is_Compiler_thread()) {
@@ -1195,8 +1195,8 @@
 
 void FlatProfiler::allocate_table() {
   { // Bytecode table
-    bytecode_ticks      = NEW_C_HEAP_ARRAY(int, Bytecodes::number_of_codes);
-    bytecode_ticks_stub = NEW_C_HEAP_ARRAY(int, Bytecodes::number_of_codes);
+    bytecode_ticks      = NEW_C_HEAP_ARRAY(int, Bytecodes::number_of_codes, mtInternal);
+    bytecode_ticks_stub = NEW_C_HEAP_ARRAY(int, Bytecodes::number_of_codes, mtInternal);
     for(int index = 0; index < Bytecodes::number_of_codes; index++) {
       bytecode_ticks[index]      = 0;
       bytecode_ticks_stub[index] = 0;
@@ -1205,7 +1205,7 @@
 
   if (ProfilerRecordPC) PCRecorder::init();
 
-  interval_data         = NEW_C_HEAP_ARRAY(IntervalData, interval_print_size);
+  interval_data         = NEW_C_HEAP_ARRAY(IntervalData, interval_print_size, mtInternal);
   FlatProfiler::interval_reset();
 }
 
--- a/src/share/vm/runtime/fprofiler.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/fprofiler.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -121,7 +121,7 @@
 };
 #endif // FPROF_KERNEL
 
-class ThreadProfiler: public CHeapObj {
+class ThreadProfiler: public CHeapObj<mtInternal> {
 public:
   ThreadProfiler()    KERNEL_RETURN;
   ~ThreadProfiler()   KERNEL_RETURN;
--- a/src/share/vm/runtime/globals.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/globals.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -465,13 +465,13 @@
   ccstr old_value = result->get_ccstr();
   char* new_value = NULL;
   if (*value != NULL) {
-    new_value = NEW_C_HEAP_ARRAY(char, strlen(*value)+1);
+    new_value = NEW_C_HEAP_ARRAY(char, strlen(*value)+1, mtInternal);
     strcpy(new_value, *value);
   }
   result->set_ccstr(new_value);
   if (result->origin == DEFAULT && old_value != NULL) {
     // Prior value is NOT heap allocated, but was a literal constant.
-    char* old_value_to_free = NEW_C_HEAP_ARRAY(char, strlen(old_value)+1);
+    char* old_value_to_free = NEW_C_HEAP_ARRAY(char, strlen(old_value)+1, mtInternal);
     strcpy(old_value_to_free, old_value);
     old_value = old_value_to_free;
   }
@@ -485,12 +485,12 @@
   Flag* faddr = address_of_flag(flag);
   guarantee(faddr != NULL && faddr->is_ccstr(), "wrong flag type");
   ccstr old_value = faddr->get_ccstr();
-  char* new_value = NEW_C_HEAP_ARRAY(char, strlen(value)+1);
+  char* new_value = NEW_C_HEAP_ARRAY(char, strlen(value)+1, mtInternal);
   strcpy(new_value, value);
   faddr->set_ccstr(new_value);
   if (faddr->origin != DEFAULT && old_value != NULL) {
     // Prior value is heap allocated so free it.
-    FREE_C_HEAP_ARRAY(char, old_value);
+    FREE_C_HEAP_ARRAY(char, old_value, mtInternal);
   }
   faddr->origin = origin;
 }
@@ -511,7 +511,7 @@
   while (flagTable[length].name != NULL) length++;
 
   // Sort
-  Flag** array = NEW_C_HEAP_ARRAY(Flag*, length);
+  Flag** array = NEW_C_HEAP_ARRAY(Flag*, length, mtInternal);
   for (int index = 0; index < length; index++) {
     array[index] = &flagTable[index];
   }
@@ -525,7 +525,7 @@
     }
   }
   out->cr();
-  FREE_C_HEAP_ARRAY(Flag*, array);
+  FREE_C_HEAP_ARRAY(Flag*, array, mtInternal);
 }
 
 #ifndef PRODUCT
@@ -547,7 +547,7 @@
   while (flagTable[length].name != NULL) length++;
 
   // Sort
-  Flag** array = NEW_C_HEAP_ARRAY(Flag*, length);
+  Flag** array = NEW_C_HEAP_ARRAY(Flag*, length, mtInternal);
   for (int index = 0; index < length; index++) {
     array[index] = &flagTable[index];
   }
@@ -560,5 +560,5 @@
       array[i]->print_on(out, withComments);
     }
   }
-  FREE_C_HEAP_ARRAY(Flag*, array);
+  FREE_C_HEAP_ARRAY(Flag*, array, mtInternal);
 }
--- a/src/share/vm/runtime/globals.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/globals.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -190,7 +190,6 @@
 
 #endif // no compilers
 
-
 // string type aliases used only in this file
 typedef const char* ccstr;
 typedef const char* ccstrlist;   // represents string arguments which accumulate
@@ -896,6 +895,9 @@
   develop(bool, UseFakeTimers, false,                                       \
           "Tells whether the VM should use system time or a fake timer")    \
                                                                             \
+  product(ccstr, NativeMemoryTracking, "off",                               \
+          "Native memory tracking options")                                 \
+                                                                            \
   diagnostic(bool, LogCompilation, false,                                   \
           "Log compilation activity in detail to hotspot.log or LogFile")   \
                                                                             \
@@ -2659,6 +2661,9 @@
   product(bool, UseHeavyMonitors, false,                                    \
           "use heavyweight instead of lightweight Java monitors")           \
                                                                             \
+  product(bool, PrintStringTableStatistics, false,                          \
+          "print statistics about the StringTable and SymbolTable")         \
+                                                                            \
   notproduct(bool, PrintSymbolTableSizeHistogram, false,                    \
           "print histogram of the symbol table")                            \
                                                                             \
@@ -3700,7 +3705,7 @@
                                                                             \
   /* Properties for Java libraries  */                                      \
                                                                             \
-  product(intx, MaxDirectMemorySize, -1,                                    \
+  product(uintx, MaxDirectMemorySize, 0,                                    \
           "Maximum total size of NIO direct-buffer allocations")            \
                                                                             \
   /* temporary developer defined flags  */                                  \
--- a/src/share/vm/runtime/handles.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/handles.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -111,7 +111,7 @@
   _chunk = _area->_chunk;
   _hwm   = _area->_hwm;
   _max   = _area->_max;
-  NOT_PRODUCT(_size_in_bytes = _area->_size_in_bytes;)
+  _size_in_bytes = _area->_size_in_bytes;
   debug_only(_area->_handle_mark_nesting++);
   assert(_area->_handle_mark_nesting > 0, "must stack allocate HandleMarks");
   debug_only(Atomic::inc(&_nof_handlemarks);)
@@ -159,7 +159,7 @@
   area->_chunk = _chunk;
   area->_hwm = _hwm;
   area->_max = _max;
-  NOT_PRODUCT(area->set_size_in_bytes(_size_in_bytes);)
+  area->set_size_in_bytes(_size_in_bytes);
 #ifdef ASSERT
   // clear out first chunk (to detect allocation bugs)
   if (ZapVMHandleArea) {
--- a/src/share/vm/runtime/handles.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/handles.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -238,7 +238,6 @@
 
 //------------------------------------------------------------------------------------------------------------------------
 // Thread local handle area
-
 class HandleArea: public Arena {
   friend class HandleMark;
   friend class NoHandleMark;
@@ -312,7 +311,7 @@
   HandleArea *_area;            // saved handle area
   Chunk *_chunk;                // saved arena chunk
   char *_hwm, *_max;            // saved arena info
-  NOT_PRODUCT(size_t _size_in_bytes;) // size of handle area
+  size_t _size_in_bytes;        // size of handle area
   // Link to previous active HandleMark in thread
   HandleMark* _previous_handle_mark;
 
--- a/src/share/vm/runtime/handles.inline.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/handles.inline.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -85,7 +85,7 @@
   area->_chunk = _chunk;
   area->_hwm = _hwm;
   area->_max = _max;
-  NOT_PRODUCT(area->set_size_in_bytes(_size_in_bytes);)
+  area->set_size_in_bytes(_size_in_bytes);
   debug_only(area->_handle_mark_nesting--);
 }
 
--- a/src/share/vm/runtime/init.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/init.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -23,6 +23,7 @@
  */
 
 #include "precompiled.hpp"
+#include "classfile/symbolTable.hpp"
 #include "code/icBuffer.hpp"
 #include "gc_interface/collectedHeap.hpp"
 #include "interpreter/bytecodes.hpp"
@@ -157,6 +158,10 @@
       // Print the collected safepoint statistics.
       SafepointSynchronize::print_stat_on_exit();
     }
+    if (PrintStringTableStatistics) {
+      SymbolTable::dump(tty);
+      StringTable::dump(tty);
+    }
     ostream_exit();
   }
 }
--- a/src/share/vm/runtime/java.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/java.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -384,7 +384,7 @@
     typedef void (*__exit_proc)(void);
 }
 
-class ExitProc : public CHeapObj {
+class ExitProc : public CHeapObj<mtInternal> {
  private:
   __exit_proc _proc;
   // void (*_proc)(void);
@@ -660,6 +660,7 @@
 }
 
 JDK_Version JDK_Version::_current;
+const char* JDK_Version::_runtime_name;
 
 void JDK_Version::initialize() {
   jdk_version_info info;
--- a/src/share/vm/runtime/java.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/java.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -74,6 +74,7 @@
  private:
 
   static JDK_Version _current;
+  static const char* _runtime_name;
 
   // In this class, we promote the minor version of release to be the
   // major version for releases >= 5 in anticipation of the JDK doing the
@@ -181,6 +182,13 @@
 
   void to_string(char* buffer, size_t buflen) const;
 
+  static const char* runtime_name() {
+    return _runtime_name;
+  }
+  static void set_runtime_name(const char* name) {
+    _runtime_name = name;
+  }
+
   // Convenience methods for queries on the current major/minor version
   static bool is_jdk12x_version() {
     return current().compare_major(2) == 0;
--- a/src/share/vm/runtime/jniHandles.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/jniHandles.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -109,7 +109,7 @@
 
 // JNI handle blocks holding local/global JNI handles
 
-class JNIHandleBlock : public CHeapObj {
+class JNIHandleBlock : public CHeapObj<mtInternal> {
   friend class VMStructs;
   friend class CppInterpreter;
 
--- a/src/share/vm/runtime/monitorChunk.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/monitorChunk.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -29,7 +29,7 @@
 
 MonitorChunk::MonitorChunk(int number_on_monitors) {
   _number_of_monitors = number_on_monitors;
-  _monitors           = NEW_C_HEAP_ARRAY(BasicObjectLock, number_on_monitors);
+  _monitors           = NEW_C_HEAP_ARRAY(BasicObjectLock, number_on_monitors, mtInternal);
   _next               = NULL;
 }
 
--- a/src/share/vm/runtime/monitorChunk.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/monitorChunk.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -30,7 +30,7 @@
 // Data structure for holding monitors for one activation during
 // deoptimization.
 
-class MonitorChunk: public CHeapObj {
+class MonitorChunk: public CHeapObj<mtInternal> {
  private:
   int              _number_of_monitors;
   BasicObjectLock* _monitors;
--- a/src/share/vm/runtime/mutex.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/mutex.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -84,7 +84,7 @@
 // The default length of monitor name is chosen to be 64 to avoid false sharing.
 static const int MONITOR_NAME_LEN = 64;
 
-class Monitor : public CHeapObj {
+class Monitor : public CHeapObj<mtInternal> {
 
  public:
   // A special lock: Is a lock where you are guaranteed not to block while you are
--- a/src/share/vm/runtime/os.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/os.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -45,6 +45,7 @@
 #include "runtime/os.hpp"
 #include "runtime/stubRoutines.hpp"
 #include "services/attachListener.hpp"
+#include "services/memTracker.hpp"
 #include "services/threadService.hpp"
 #include "utilities/defaultStream.hpp"
 #include "utilities/events.hpp"
@@ -433,9 +434,9 @@
 
 // --------------------- heap allocation utilities ---------------------
 
-char *os::strdup(const char *str) {
+char *os::strdup(const char *str, MEMFLAGS flags) {
   size_t size = strlen(str);
-  char *dup_str = (char *)malloc(size + 1);
+  char *dup_str = (char *)malloc(size + 1, flags);
   if (dup_str == NULL) return NULL;
   strcpy(dup_str, str);
   return dup_str;
@@ -559,7 +560,7 @@
 }
 #endif
 
-void* os::malloc(size_t size) {
+void* os::malloc(size_t size, MEMFLAGS memflags, address caller) {
   NOT_PRODUCT(inc_stat_counter(&num_mallocs, 1));
   NOT_PRODUCT(inc_stat_counter(&alloc_bytes, size));
 
@@ -571,6 +572,7 @@
 
   NOT_PRODUCT(if (MallocVerifyInterval > 0) check_heap());
   u_char* ptr = (u_char*)::malloc(size + space_before + space_after);
+
 #ifdef ASSERT
   if (ptr == NULL) return NULL;
   if (MallocCushion) {
@@ -589,18 +591,29 @@
   }
   debug_only(if (paranoid) verify_block(memblock));
   if (PrintMalloc && tty != NULL) tty->print_cr("os::malloc " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, memblock);
+
+  // we do not track MallocCushion memory
+  if (MemTracker::is_on()) {
+    MemTracker::record_malloc((address)memblock, size, memflags, caller == 0 ? CALLER_PC : caller);
+  }
+
   return memblock;
 }
 
 
-void* os::realloc(void *memblock, size_t size) {
+void* os::realloc(void *memblock, size_t size, MEMFLAGS memflags, address caller) {
 #ifndef ASSERT
   NOT_PRODUCT(inc_stat_counter(&num_mallocs, 1));
   NOT_PRODUCT(inc_stat_counter(&alloc_bytes, size));
-  return ::realloc(memblock, size);
+  void* ptr = ::realloc(memblock, size);
+  if (ptr != NULL && MemTracker::is_on()) {
+    MemTracker::record_realloc((address)memblock, (address)ptr, size, memflags,
+     caller == 0 ? CALLER_PC : caller);
+  }
+  return ptr;
 #else
   if (memblock == NULL) {
-    return malloc(size);
+    return malloc(size, memflags, (caller == 0 ? CALLER_PC : caller));
   }
   if ((intptr_t)memblock == (intptr_t)MallocCatchPtr) {
     tty->print_cr("os::realloc caught " PTR_FORMAT, memblock);
@@ -610,7 +623,7 @@
   NOT_PRODUCT(if (MallocVerifyInterval > 0) check_heap());
   if (size == 0) return NULL;
   // always move the block
-  void* ptr = malloc(size);
+  void* ptr = malloc(size, memflags, caller == 0 ? CALLER_PC : caller);
   if (PrintMalloc) tty->print_cr("os::remalloc " SIZE_FORMAT " bytes, " PTR_FORMAT " --> " PTR_FORMAT, size, memblock, ptr);
   // Copy to new memory if malloc didn't fail
   if ( ptr != NULL ) {
@@ -627,7 +640,7 @@
 }
 
 
-void  os::free(void *memblock) {
+void  os::free(void *memblock, MEMFLAGS memflags) {
   NOT_PRODUCT(inc_stat_counter(&num_frees, 1));
 #ifdef ASSERT
   if (memblock == NULL) return;
@@ -660,6 +673,8 @@
     fprintf(stderr, "os::free " PTR_FORMAT "\n", (uintptr_t)memblock);
   }
 #endif
+  MemTracker::record_free((address)memblock, memflags);
+
   ::free((char*)memblock - space_before);
 }
 
@@ -1048,7 +1063,7 @@
         ++formatted_path_len;
     }
 
-    char* formatted_path = NEW_C_HEAP_ARRAY(char, formatted_path_len + 1);
+    char* formatted_path = NEW_C_HEAP_ARRAY(char, formatted_path_len + 1, mtInternal);
     if (formatted_path == NULL) {
         return NULL;
     }
@@ -1127,7 +1142,7 @@
     return NULL;
   }
   const char psepchar = *os::path_separator();
-  char* inpath = (char*)NEW_C_HEAP_ARRAY(char, strlen(path) + 1);
+  char* inpath = (char*)NEW_C_HEAP_ARRAY(char, strlen(path) + 1, mtInternal);
   if (inpath == NULL) {
     return NULL;
   }
@@ -1140,7 +1155,7 @@
     p++;
     p = strchr(p, psepchar);
   }
-  char** opath = (char**) NEW_C_HEAP_ARRAY(char*, count);
+  char** opath = (char**) NEW_C_HEAP_ARRAY(char*, count, mtInternal);
   if (opath == NULL) {
     return NULL;
   }
@@ -1153,7 +1168,7 @@
       return NULL;
     }
     // allocate the string and add terminator storage
-    char* s  = (char*)NEW_C_HEAP_ARRAY(char, len + 1);
+    char* s  = (char*)NEW_C_HEAP_ARRAY(char, len + 1, mtInternal);
     if (s == NULL) {
       return NULL;
     }
@@ -1162,7 +1177,7 @@
     opath[i] = s;
     p += len + 1;
   }
-  FREE_C_HEAP_ARRAY(char, inpath);
+  FREE_C_HEAP_ARRAY(char, inpath, mtInternal);
   *n = count;
   return opath;
 }
@@ -1366,3 +1381,97 @@
 
   return (int) i;
 }
+
+bool os::create_stack_guard_pages(char* addr, size_t bytes) {
+  return os::pd_create_stack_guard_pages(addr, bytes);
+}
+
+
+char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint) {
+  char* result = pd_reserve_memory(bytes, addr, alignment_hint);
+  if (result != NULL && MemTracker::is_on()) {
+    MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC);
+  }
+
+  return result;
+}
+char* os::attempt_reserve_memory_at(size_t bytes, char* addr) {
+  char* result = pd_attempt_reserve_memory_at(bytes, addr);
+  if (result != NULL && MemTracker::is_on()) {
+    MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC);
+  }
+  return result;
+}
+
+void os::split_reserved_memory(char *base, size_t size,
+                                 size_t split, bool realloc) {
+  pd_split_reserved_memory(base, size, split, realloc);
+}
+
+bool os::commit_memory(char* addr, size_t bytes, bool executable) {
+  bool res = pd_commit_memory(addr, bytes, executable);
+  if (res && MemTracker::is_on()) {
+    MemTracker::record_virtual_memory_commit((address)addr, bytes, CALLER_PC);
+  }
+  return res;
+}
+
+bool os::commit_memory(char* addr, size_t size, size_t alignment_hint,
+                              bool executable) {
+  bool res = os::pd_commit_memory(addr, size, alignment_hint, executable);
+  if (res && MemTracker::is_on()) {
+    MemTracker::record_virtual_memory_commit((address)addr, size, CALLER_PC);
+  }
+  return res;
+}
+
+bool os::uncommit_memory(char* addr, size_t bytes) {
+  bool res = pd_uncommit_memory(addr, bytes);
+  if (res) {
+    MemTracker::record_virtual_memory_uncommit((address)addr, bytes);
+  }
+  return res;
+}
+
+bool os::release_memory(char* addr, size_t bytes) {
+  bool res = pd_release_memory(addr, bytes);
+  if (res) {
+    MemTracker::record_virtual_memory_release((address)addr, bytes);
+  }
+  return res;
+}
+
+
+char* os::map_memory(int fd, const char* file_name, size_t file_offset,
+                           char *addr, size_t bytes, bool read_only,
+                           bool allow_exec) {
+  char* result = pd_map_memory(fd, file_name, file_offset, addr, bytes, read_only, allow_exec);
+  if (result != NULL && MemTracker::is_on()) {
+    MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC);
+  }
+  return result;
+}
+
+char* os::remap_memory(int fd, const char* file_name, size_t file_offset,
+                             char *addr, size_t bytes, bool read_only,
+                             bool allow_exec) {
+  return pd_remap_memory(fd, file_name, file_offset, addr, bytes,
+                    read_only, allow_exec);
+}
+
+bool os::unmap_memory(char *addr, size_t bytes) {
+  bool result = pd_unmap_memory(addr, bytes);
+  if (result) {
+    MemTracker::record_virtual_memory_release((address)addr, bytes);
+  }
+  return result;
+}
+
+void os::free_memory(char *addr, size_t bytes, size_t alignment_hint) {
+  pd_free_memory(addr, bytes, alignment_hint);
+}
+
+void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
+  pd_realign_memory(addr, bytes, alignment_hint);
+}
+
--- a/src/share/vm/runtime/os.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/os.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -99,6 +99,28 @@
     _page_sizes[1] = 0; // sentinel
   }
 
+  static char*  pd_reserve_memory(size_t bytes, char* addr = 0,
+                               size_t alignment_hint = 0);
+  static char*  pd_attempt_reserve_memory_at(size_t bytes, char* addr);
+  static void   pd_split_reserved_memory(char *base, size_t size,
+                                      size_t split, bool realloc);
+  static bool   pd_commit_memory(char* addr, size_t bytes, bool executable = false);
+  static bool   pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
+                              bool executable = false);
+  static bool   pd_uncommit_memory(char* addr, size_t bytes);
+  static bool   pd_release_memory(char* addr, size_t bytes);
+
+  static char*  pd_map_memory(int fd, const char* file_name, size_t file_offset,
+                           char *addr, size_t bytes, bool read_only = false,
+                           bool allow_exec = false);
+  static char*  pd_remap_memory(int fd, const char* file_name, size_t file_offset,
+                             char *addr, size_t bytes, bool read_only,
+                             bool allow_exec);
+  static bool   pd_unmap_memory(char *addr, size_t bytes);
+  static void   pd_free_memory(char *addr, size_t bytes, size_t alignment_hint);
+  static void   pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint);
+
+
  public:
   static void init(void);                      // Called before command line parsing
   static jint init_2(void);                    // Called after command line parsing
@@ -236,8 +258,7 @@
   static char*  attempt_reserve_memory_at(size_t bytes, char* addr);
   static void   split_reserved_memory(char *base, size_t size,
                                       size_t split, bool realloc);
-  static bool   commit_memory(char* addr, size_t bytes,
-                              bool executable = false);
+  static bool   commit_memory(char* addr, size_t bytes, bool executable = false);
   static bool   commit_memory(char* addr, size_t size, size_t alignment_hint,
                               bool executable = false);
   static bool   uncommit_memory(char* addr, size_t bytes);
@@ -250,6 +271,7 @@
   static bool   guard_memory(char* addr, size_t bytes);
   static bool   unguard_memory(char* addr, size_t bytes);
   static bool   create_stack_guard_pages(char* addr, size_t bytes);
+  static bool   pd_create_stack_guard_pages(char* addr, size_t bytes);
   static bool   remove_stack_guard_pages(char* addr, size_t bytes);
 
   static char*  map_memory(int fd, const char* file_name, size_t file_offset,
@@ -573,12 +595,15 @@
   static void* thread_local_storage_at(int index);
   static void  free_thread_local_storage(int index);
 
+  // Stack walk
+  static address get_caller_pc(int n = 0);
+
   // General allocation (must be MT-safe)
-  static void* malloc  (size_t size);
-  static void* realloc (void *memblock, size_t size);
-  static void  free    (void *memblock);
+  static void* malloc  (size_t size, MEMFLAGS flags, address caller_pc = 0);
+  static void* realloc (void *memblock, size_t size, MEMFLAGS flags, address caller_pc = 0);
+  static void  free    (void *memblock, MEMFLAGS flags = mtNone);
   static bool  check_heap(bool force = false);      // verify C heap integrity
-  static char* strdup(const char *);  // Like strdup
+  static char* strdup(const char *, MEMFLAGS flags = mtInternal);  // Like strdup
 
 #ifndef PRODUCT
   static julong num_mallocs;         // # of calls to malloc/realloc
@@ -640,6 +665,10 @@
   // On Windows this will create an actual minidump, on Linux/Solaris it will simply check core dump limits
   static void check_or_create_dump(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize);
 
+  // Get the default path to the core file
+  // Returns the length of the string
+  static int get_core_path(char* buffer, size_t bufferSize);
+
   // JVMTI & JVM monitoring and management support
   // The thread_cpu_time() and current_thread_cpu_time() are only
   // supported if is_thread_cpu_time_supported() returns true.
--- a/src/share/vm/runtime/osThread.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/osThread.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -58,7 +58,7 @@
 // the main thread into its own Thread at will.
 
 
-class OSThread: public CHeapObj {
+class OSThread: public CHeapObj<mtThread> {
   friend class VMStructs;
  private:
   OSThreadStartFunc _start_proc;  // Thread start routine
--- a/src/share/vm/runtime/park.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/park.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -141,7 +141,7 @@
 // although Niagara's hash function should help.
 
 void * ParkEvent::operator new (size_t sz) {
-  return (void *) ((intptr_t (CHeapObj::operator new (sz + 256)) + 256) & -256) ;
+  return (void *) ((intptr_t (AllocateHeap(sz + 256, mtInternal, CALLER_PC)) + 256) & -256) ;
 }
 
 void ParkEvent::operator delete (void * a) {
--- a/src/share/vm/runtime/perfData.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/perfData.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -81,7 +81,7 @@
 
   const char* prefix = PerfDataManager::ns_to_string(ns);
 
-  _name = NEW_C_HEAP_ARRAY(char, strlen(name) + strlen(prefix) + 2);
+  _name = NEW_C_HEAP_ARRAY(char, strlen(name) + strlen(prefix) + 2, mtInternal);
   assert(_name != NULL && strlen(name) != 0, "invalid name");
 
   if (ns == NULL_NS) {
@@ -111,10 +111,10 @@
 
 PerfData::~PerfData() {
   if (_name != NULL) {
-    FREE_C_HEAP_ARRAY(char, _name);
+    FREE_C_HEAP_ARRAY(char, _name, mtInternal);
   }
   if (is_on_c_heap()) {
-    FREE_C_HEAP_ARRAY(PerfDataEntry, _pdep);
+    FREE_C_HEAP_ARRAY(PerfDataEntry, _pdep, mtInternal);
   }
 }
 
@@ -137,7 +137,7 @@
   if (psmp == NULL) {
     // out of PerfMemory memory resources. allocate on the C heap
     // to avoid vm termination.
-    psmp = NEW_C_HEAP_ARRAY(char, size);
+    psmp = NEW_C_HEAP_ARRAY(char, size, mtInternal);
     _on_c_heap = true;
   }
 
@@ -559,12 +559,12 @@
 
 PerfDataList::PerfDataList(int length) {
 
-  _set = new(ResourceObj::C_HEAP) PerfDataArray(length, true);
+  _set = new(ResourceObj::C_HEAP, mtInternal) PerfDataArray(length, true);
 }
 
 PerfDataList::PerfDataList(PerfDataList* p) {
 
-  _set = new(ResourceObj::C_HEAP) PerfDataArray(p->length(), true);
+  _set = new(ResourceObj::C_HEAP, mtInternal) PerfDataArray(p->length(), true);
 
   _set->appendAll(p->get_impl());
 }
--- a/src/share/vm/runtime/perfData.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/perfData.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -240,7 +240,7 @@
  * be removed from the product in the future.
  *
  */
-class PerfData : public CHeapObj {
+class PerfData : public CHeapObj<mtInternal> {
 
   friend class StatSampler;      // for access to protected void sample()
   friend class PerfDataManager;  // for access to protected destructor
@@ -342,7 +342,7 @@
  * invoke the take_sample() method and write the value returned to its
  * appropriate location in the PerfData memory region.
  */
-class PerfLongSampleHelper : public CHeapObj {
+class PerfLongSampleHelper : public CHeapObj<mtInternal> {
   public:
     virtual jlong take_sample() = 0;
 };
@@ -591,7 +591,7 @@
  * some other implementation, as long as that implementation provides
  * a mechanism to iterate over the container by index.
  */
-class PerfDataList : public CHeapObj {
+class PerfDataList : public CHeapObj<mtInternal> {
 
   private:
 
--- a/src/share/vm/runtime/perfMemory.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/perfMemory.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -112,7 +112,7 @@
       warning("Could not create PerfData Memory region, reverting to malloc");
     }
 
-    _prologue = NEW_C_HEAP_OBJ(PerfDataPrologue);
+    _prologue = NEW_C_HEAP_OBJ(PerfDataPrologue, mtInternal);
   }
   else {
 
@@ -244,10 +244,10 @@
   if (PerfDataSaveFile != NULL) {
     // dest_file_name stores the validated file name if file_name
     // contains %p which will be replaced by pid.
-    dest_file = NEW_C_HEAP_ARRAY(char, JVM_MAXPATHLEN);
+    dest_file = NEW_C_HEAP_ARRAY(char, JVM_MAXPATHLEN, mtInternal);
     if(!Arguments::copy_expand_pid(PerfDataSaveFile, strlen(PerfDataSaveFile),
                                    dest_file, JVM_MAXPATHLEN)) {
-      FREE_C_HEAP_ARRAY(char, dest_file);
+      FREE_C_HEAP_ARRAY(char, dest_file, mtInternal);
       if (PrintMiscellaneous && Verbose) {
         warning("Invalid performance data file path name specified, "\
                 "fall back to a default name");
@@ -257,7 +257,7 @@
     }
   }
   // create the name of the file for retaining the instrumentation memory.
-  dest_file = NEW_C_HEAP_ARRAY(char, PERFDATA_FILENAME_LEN);
+  dest_file = NEW_C_HEAP_ARRAY(char, PERFDATA_FILENAME_LEN, mtInternal);
   jio_snprintf(dest_file, PERFDATA_FILENAME_LEN,
                "%s_%d", PERFDATA_NAME, os::current_process_id());
 
--- a/src/share/vm/runtime/reflection.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/reflection.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -829,7 +829,7 @@
   java_lang_reflect_Field::set_modifiers(rh(), fd->access_flags().as_int() & JVM_RECOGNIZED_FIELD_MODIFIERS);
   java_lang_reflect_Field::set_override(rh(), false);
   if (java_lang_reflect_Field::has_signature_field() &&
-      fd->generic_signature() != NULL) {
+      fd->has_generic_signature()) {
     Symbol*  gs = fd->generic_signature();
     Handle sig = java_lang_String::create_from_symbol(gs, CHECK_NULL);
     java_lang_reflect_Field::set_signature(rh(), sig());
--- a/src/share/vm/runtime/reflectionUtils.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/reflectionUtils.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -59,7 +59,7 @@
 
 
 GrowableArray<FilteredField*> *FilteredFieldsMap::_filtered_fields =
-  new (ResourceObj::C_HEAP) GrowableArray<FilteredField*>(3,true);
+  new (ResourceObj::C_HEAP, mtInternal) GrowableArray<FilteredField*>(3,true);
 
 
 void FilteredFieldsMap::initialize() {
--- a/src/share/vm/runtime/relocator.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/relocator.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -392,16 +392,16 @@
 // The width of instruction at "pc" is changing by "delta".  Adjust the
 // exception table, if any, of "rc->mb".
 void Relocator::adjust_exception_table(int bci, int delta) {
-  typeArrayOop table = method()->exception_table();
-  for (int index = 0; index < table->length(); index +=4) {
-    if (table->int_at(index) > bci) {
-      table->int_at_put(index+0, table->int_at(index+0) + delta);
-      table->int_at_put(index+1, table->int_at(index+1) + delta);
-    } else if (bci < table->int_at(index+1)) {
-      table->int_at_put(index+1, table->int_at(index+1) + delta);
+  ExceptionTable table(_method());
+  for (int index = 0; index < table.length(); index ++) {
+    if (table.start_pc(index) > bci) {
+      table.set_start_pc(index, table.start_pc(index) + delta);
+      table.set_end_pc(index, table.end_pc(index) + delta);
+    } else if (bci < table.end_pc(index)) {
+      table.set_end_pc(index, table.end_pc(index) + delta);
     }
-    if (table->int_at(index+2) > bci)
-      table->int_at_put(index+2, table->int_at(index+2) + delta);
+    if (table.handler_pc(index) > bci)
+      table.set_handler_pc(index, table.handler_pc(index) + delta);
   }
 }
 
--- a/src/share/vm/runtime/safepoint.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/safepoint.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -23,6 +23,7 @@
  */
 
 #include "precompiled.hpp"
+#include "classfile/symbolTable.hpp"
 #include "classfile/systemDictionary.hpp"
 #include "code/codeCache.hpp"
 #include "code/icBuffer.hpp"
@@ -47,6 +48,7 @@
 #include "runtime/stubRoutines.hpp"
 #include "runtime/sweeper.hpp"
 #include "runtime/synchronizer.hpp"
+#include "services/memTracker.hpp"
 #include "services/runtimeService.hpp"
 #include "utilities/events.hpp"
 #ifdef TARGET_ARCH_x86
@@ -526,13 +528,29 @@
     CompilationPolicy::policy()->do_safepoint_work();
   }
 
-  TraceTime t4("sweeping nmethods", TraceSafepointCleanupTime);
-  NMethodSweeper::scan_stacks();
+  {
+    TraceTime t4("sweeping nmethods", TraceSafepointCleanupTime);
+    NMethodSweeper::scan_stacks();
+  }
+
+  if (SymbolTable::needs_rehashing()) {
+    TraceTime t5("rehashing symbol table", TraceSafepointCleanupTime);
+    SymbolTable::rehash_table();
+  }
+
+  if (StringTable::needs_rehashing()) {
+    TraceTime t6("rehashing string table", TraceSafepointCleanupTime);
+    StringTable::rehash_table();
+  }
 
   // rotate log files?
   if (UseGCLogFileRotation) {
     gclog_or_tty->rotate_log();
   }
+
+  if (MemTracker::is_on()) {
+    MemTracker::sync();
+  }
 }
 
 
@@ -1144,7 +1162,7 @@
     stats_array_size = PrintSafepointStatisticsCount;
   }
   _safepoint_stats = (SafepointStats*)os::malloc(stats_array_size
-                                                 * sizeof(SafepointStats));
+                                                 * sizeof(SafepointStats), mtInternal);
   guarantee(_safepoint_stats != NULL,
             "not enough memory for safepoint instrumentation data");
 
--- a/src/share/vm/runtime/safepoint.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/safepoint.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -190,7 +190,7 @@
 };
 
 // State class for a thread suspended at a safepoint
-class ThreadSafepointState: public CHeapObj {
+class ThreadSafepointState: public CHeapObj<mtInternal> {
  public:
   // These states are maintained by VM thread while threads are being brought
   // to a safepoint.  After SafepointSynchronize::end(), they are reset to
--- a/src/share/vm/runtime/sharedRuntime.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/sharedRuntime.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -2117,7 +2117,7 @@
 
 // A simple wrapper class around the calling convention information
 // that allows sharing of adapters for the same calling convention.
-class AdapterFingerPrint : public CHeapObj {
+class AdapterFingerPrint : public CHeapObj<mtCode> {
  private:
   union {
     int  _compact[3];
@@ -2174,7 +2174,7 @@
       ptr = _value._compact;
     } else {
       _length = len;
-      _value._fingerprint = NEW_C_HEAP_ARRAY(int, _length);
+      _value._fingerprint = NEW_C_HEAP_ARRAY(int, _length, mtCode);
       ptr = _value._fingerprint;
     }
 
@@ -2193,7 +2193,7 @@
 
   ~AdapterFingerPrint() {
     if (_length > 0) {
-      FREE_C_HEAP_ARRAY(int, _value._fingerprint);
+      FREE_C_HEAP_ARRAY(int, _value._fingerprint, mtCode);
     }
   }
 
@@ -2251,7 +2251,7 @@
 
 
 // A hashtable mapping from AdapterFingerPrints to AdapterHandlerEntries
-class AdapterHandlerTable : public BasicHashtable {
+class AdapterHandlerTable : public BasicHashtable<mtCode> {
   friend class AdapterHandlerTableIterator;
 
  private:
@@ -2265,16 +2265,16 @@
 #endif
 
   AdapterHandlerEntry* bucket(int i) {
-    return (AdapterHandlerEntry*)BasicHashtable::bucket(i);
+    return (AdapterHandlerEntry*)BasicHashtable<mtCode>::bucket(i);
   }
 
  public:
   AdapterHandlerTable()
-    : BasicHashtable(293, sizeof(AdapterHandlerEntry)) { }
+    : BasicHashtable<mtCode>(293, sizeof(AdapterHandlerEntry)) { }
 
   // Create a new entry suitable for insertion in the table
   AdapterHandlerEntry* new_entry(AdapterFingerPrint* fingerprint, address i2c_entry, address c2i_entry, address c2i_unverified_entry) {
-    AdapterHandlerEntry* entry = (AdapterHandlerEntry*)BasicHashtable::new_entry(fingerprint->compute_hash());
+    AdapterHandlerEntry* entry = (AdapterHandlerEntry*)BasicHashtable<mtCode>::new_entry(fingerprint->compute_hash());
     entry->init(fingerprint, i2c_entry, c2i_entry, c2i_unverified_entry);
     return entry;
   }
@@ -2287,7 +2287,7 @@
 
   void free_entry(AdapterHandlerEntry* entry) {
     entry->deallocate();
-    BasicHashtable::free_entry(entry);
+    BasicHashtable<mtCode>::free_entry(entry);
   }
 
   // Find a entry with the same fingerprint if it exists
@@ -2572,8 +2572,8 @@
 void AdapterHandlerEntry::deallocate() {
   delete _fingerprint;
 #ifdef ASSERT
-  if (_saved_code) FREE_C_HEAP_ARRAY(unsigned char, _saved_code);
-  if (_saved_sig)  FREE_C_HEAP_ARRAY(Basictype, _saved_sig);
+  if (_saved_code) FREE_C_HEAP_ARRAY(unsigned char, _saved_code, mtCode);
+  if (_saved_sig)  FREE_C_HEAP_ARRAY(Basictype, _saved_sig, mtCode);
 #endif
 }
 
@@ -2583,11 +2583,11 @@
 // against other versions.  If the code is captured after relocation
 // then relative instructions won't be equivalent.
 void AdapterHandlerEntry::save_code(unsigned char* buffer, int length, int total_args_passed, BasicType* sig_bt) {
-  _saved_code = NEW_C_HEAP_ARRAY(unsigned char, length);
+  _saved_code = NEW_C_HEAP_ARRAY(unsigned char, length, mtCode);
   _code_length = length;
   memcpy(_saved_code, buffer, length);
   _total_args_passed = total_args_passed;
-  _saved_sig = NEW_C_HEAP_ARRAY(BasicType, _total_args_passed);
+  _saved_sig = NEW_C_HEAP_ARRAY(BasicType, _total_args_passed, mtCode);
   memcpy(_saved_sig, sig_bt, _total_args_passed * sizeof(BasicType));
 }
 
@@ -2893,7 +2893,7 @@
   int max_locals = moop->max_locals();
   // Allocate temp buffer, 1 word per local & 2 per active monitor
   int buf_size_words = max_locals + active_monitor_count*2;
-  intptr_t *buf = NEW_C_HEAP_ARRAY(intptr_t,buf_size_words);
+  intptr_t *buf = NEW_C_HEAP_ARRAY(intptr_t,buf_size_words, mtCode);
 
   // Copy the locals.  Order is preserved so that loading of longs works.
   // Since there's no GC I can copy the oops blindly.
@@ -2923,7 +2923,7 @@
 JRT_END
 
 JRT_LEAF(void, SharedRuntime::OSR_migration_end( intptr_t* buf) )
-  FREE_C_HEAP_ARRAY(intptr_t,buf);
+  FREE_C_HEAP_ARRAY(intptr_t,buf, mtCode);
 JRT_END
 
 bool AdapterHandlerLibrary::contains(CodeBlob* b) {
--- a/src/share/vm/runtime/sharedRuntime.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/sharedRuntime.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -610,7 +610,7 @@
 // used by the adapters.  The code generation happens here because it's very
 // similar to what the adapters have to do.
 
-class AdapterHandlerEntry : public BasicHashtableEntry {
+class AdapterHandlerEntry : public BasicHashtableEntry<mtCode> {
   friend class AdapterHandlerTable;
 
  private:
@@ -656,7 +656,7 @@
   AdapterFingerPrint* fingerprint()  { return _fingerprint; }
 
   AdapterHandlerEntry* next() {
-    return (AdapterHandlerEntry*)BasicHashtableEntry::next();
+    return (AdapterHandlerEntry*)BasicHashtableEntry<mtCode>::next();
   }
 
 #ifdef ASSERT
--- a/src/share/vm/runtime/stubCodeGenerator.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/stubCodeGenerator.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -36,7 +36,7 @@
 // Currently, code descriptors are simply chained in a linked list,
 // this may have to change if searching becomes too slow.
 
-class StubCodeDesc: public CHeapObj {
+class StubCodeDesc: public CHeapObj<mtCode> {
  protected:
   static StubCodeDesc* _list;                  // the list of all descriptors
   static int           _count;                 // length of list
--- a/src/share/vm/runtime/sweeper.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/sweeper.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -228,7 +228,7 @@
 #ifdef ASSERT
     if (LogSweeper && _records == NULL) {
       // Create the ring buffer for the logging code
-      _records = NEW_C_HEAP_ARRAY(SweeperRecord, SweeperLogEntries);
+      _records = NEW_C_HEAP_ARRAY(SweeperRecord, SweeperLogEntries, mtGC);
       memset(_records, 0, sizeof(SweeperRecord) * SweeperLogEntries);
     }
 #endif
--- a/src/share/vm/runtime/task.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/task.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -35,7 +35,7 @@
 //   ...
 //   pf.disenroll();
 
-class PeriodicTask: public CHeapObj {
+class PeriodicTask: public CHeapObj<mtInternal> {
  public:
   // Useful constants.
   // The interval constants are used to ensure the declared interval
--- a/src/share/vm/runtime/thread.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/thread.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -73,6 +73,7 @@
 #include "runtime/vm_operations.hpp"
 #include "services/attachListener.hpp"
 #include "services/management.hpp"
+#include "services/memTracker.hpp"
 #include "services/threadService.hpp"
 #include "trace/traceEventTypes.hpp"
 #include "utilities/defaultStream.hpp"
@@ -159,6 +160,7 @@
 
 #endif // ndef DTRACE_ENABLED
 
+
 // Class hierarchy
 // - Thread
 //   - VMThread
@@ -168,13 +170,13 @@
 //     - CompilerThread
 
 // ======= Thread ========
-
 // Support for forcing alignment of thread objects for biased locking
-void* Thread::operator new(size_t size) {
+void* Thread::allocate(size_t size, bool throw_excpt, MEMFLAGS flags) {
   if (UseBiasedLocking) {
     const int alignment = markOopDesc::biased_lock_alignment;
     size_t aligned_size = size + (alignment - sizeof(intptr_t));
-    void* real_malloc_addr = CHeapObj::operator new(aligned_size);
+    void* real_malloc_addr = throw_excpt? AllocateHeap(aligned_size, flags, CURRENT_PC)
+                                          : os::malloc(aligned_size, flags, CURRENT_PC);
     void* aligned_addr     = (void*) align_size_up((intptr_t) real_malloc_addr, alignment);
     assert(((uintptr_t) aligned_addr + (uintptr_t) size) <=
            ((uintptr_t) real_malloc_addr + (uintptr_t) aligned_size),
@@ -187,16 +189,17 @@
     ((Thread*) aligned_addr)->_real_malloc_address = real_malloc_addr;
     return aligned_addr;
   } else {
-    return CHeapObj::operator new(size);
+    return throw_excpt? AllocateHeap(size, flags, CURRENT_PC)
+                       : os::malloc(size, flags, CURRENT_PC);
   }
 }
 
 void Thread::operator delete(void* p) {
   if (UseBiasedLocking) {
     void* real_malloc_addr = ((Thread*) p)->_real_malloc_address;
-    CHeapObj::operator delete(real_malloc_addr);
+    FreeHeap(real_malloc_addr, mtThread);
   } else {
-    CHeapObj::operator delete(p);
+    FreeHeap(p, mtThread);
   }
 }
 
@@ -214,8 +217,8 @@
 
   // allocated data structures
   set_osthread(NULL);
-  set_resource_area(new ResourceArea());
-  set_handle_area(new HandleArea(NULL));
+  set_resource_area(new (mtThread)ResourceArea());
+  set_handle_area(new (mtThread) HandleArea(NULL));
   set_active_handles(NULL);
   set_free_handle_block(NULL);
   set_last_handle_mark(NULL);
@@ -306,12 +309,17 @@
 
   // set up any platform-specific state.
   os::initialize_thread();
-
 }
 
 void Thread::record_stack_base_and_size() {
   set_stack_base(os::current_stack_base());
   set_stack_size(os::current_stack_size());
+
+  // record thread's native stack, stack grows downward
+  address vm_base = _stack_base - _stack_size;
+  MemTracker::record_virtual_memory_reserve(vm_base, _stack_size,
+    CURRENT_PC, this);
+  MemTracker::record_virtual_memory_type(vm_base, mtThreadStack);
 }
 
 
@@ -319,6 +327,9 @@
   // Reclaim the objectmonitors from the omFreeList of the moribund thread.
   ObjectSynchronizer::omFlush (this) ;
 
+  MemTracker::record_virtual_memory_release((_stack_base - _stack_size),
+    _stack_size, this);
+
   // deallocate data structures
   delete resource_area();
   // since the handle marks are using the handle area, we have to deallocated the root
@@ -996,6 +1007,29 @@
                                          vmSymbols::void_method_signature(), CHECK);
 }
 
+char java_runtime_name[128] = "";
+
+// extract the JRE name from sun.misc.Version.java_runtime_name
+static const char* get_java_runtime_name(TRAPS) {
+  klassOop k = SystemDictionary::find(vmSymbols::sun_misc_Version(),
+                                      Handle(), Handle(), CHECK_AND_CLEAR_NULL);
+  fieldDescriptor fd;
+  bool found = k != NULL &&
+               instanceKlass::cast(k)->find_local_field(vmSymbols::java_runtime_name_name(),
+                                                        vmSymbols::string_signature(), &fd);
+  if (found) {
+    oop name_oop = k->java_mirror()->obj_field(fd.offset());
+    if (name_oop == NULL)
+      return NULL;
+    const char* name = java_lang_String::as_utf8_string(name_oop,
+                                                        java_runtime_name,
+                                                        sizeof(java_runtime_name));
+    return name;
+  } else {
+    return NULL;
+  }
+}
+
 // General purpose hook into Java code, run once when the VM is initialized.
 // The Java library method itself may be changed independently from the VM.
 static void call_postVMInitHook(TRAPS) {
@@ -1105,14 +1139,14 @@
 
 NamedThread::~NamedThread() {
   if (_name != NULL) {
-    FREE_C_HEAP_ARRAY(char, _name);
+    FREE_C_HEAP_ARRAY(char, _name, mtThread);
     _name = NULL;
   }
 }
 
 void NamedThread::set_name(const char* format, ...) {
   guarantee(_name == NULL, "Only get to set name once.");
-  _name = NEW_C_HEAP_ARRAY(char, max_name_len);
+  _name = NEW_C_HEAP_ARRAY(char, max_name_len, mtThread);
   guarantee(_name != NULL, "alloc failure");
   va_list ap;
   va_start(ap, format);
@@ -1295,6 +1329,7 @@
   set_monitor_chunks(NULL);
   set_next(NULL);
   set_thread_state(_thread_new);
+  set_recorder(NULL);
   _terminated = _not_terminated;
   _privileged_stack_top = NULL;
   _array_for_gc = NULL;
@@ -1370,6 +1405,7 @@
     _jni_attach_state = _not_attaching_via_jni;
   }
   assert(_deferred_card_mark.is_empty(), "Default MemRegion ctor");
+  _safepoint_visible = false;
 }
 
 bool JavaThread::reguard_stack(address cur_sp) {
@@ -1432,7 +1468,7 @@
   thr_type = entry_point == &compiler_thread_entry ? os::compiler_thread :
                                                      os::java_thread;
   os::create_thread(this, thr_type, stack_sz);
-
+  _safepoint_visible = false;
   // The _osthread may be NULL here because we ran out of memory (too many threads active).
   // We need to throw and OutOfMemoryError - however we cannot do this here because the caller
   // may hold a lock and all locks must be unlocked before throwing the exception (throwing
@@ -1450,6 +1486,11 @@
       tty->print_cr("terminate thread %p", this);
   }
 
+  // Info NMT that this JavaThread is exiting, its memory
+  // recorder should be collected
+  assert(!is_safepoint_visible(), "wrong state");
+  MemTracker::thread_exiting(this);
+
   // JSR166 -- return the parker to the free list
   Parker::Release(_parker);
   _parker = NULL ;
@@ -2892,7 +2933,7 @@
 void JavaThread::popframe_preserve_args(ByteSize size_in_bytes, void* start) {
   assert(_popframe_preserved_args == NULL, "should not wipe out old PopFrame preserved arguments");
   if (in_bytes(size_in_bytes) != 0) {
-    _popframe_preserved_args = NEW_C_HEAP_ARRAY(char, in_bytes(size_in_bytes));
+    _popframe_preserved_args = NEW_C_HEAP_ARRAY(char, in_bytes(size_in_bytes), mtThread);
     _popframe_preserved_args_size = in_bytes(size_in_bytes);
     Copy::conjoint_jbytes(start, _popframe_preserved_args, _popframe_preserved_args_size);
   }
@@ -2914,7 +2955,7 @@
 
 void JavaThread::popframe_free_preserved_args() {
   assert(_popframe_preserved_args != NULL, "should not free PopFrame preserved arguments twice");
-  FREE_C_HEAP_ARRAY(char, (char*) _popframe_preserved_args);
+  FREE_C_HEAP_ARRAY(char, (char*) _popframe_preserved_args, mtThread);
   _popframe_preserved_args = NULL;
   _popframe_preserved_args_size = 0;
 }
@@ -3163,6 +3204,14 @@
   jint os_init_2_result = os::init_2();
   if (os_init_2_result != JNI_OK) return os_init_2_result;
 
+  // intialize TLS
+  ThreadLocalStorage::init();
+
+  // Bootstrap native memory tracking, so it can start recording memory
+  // activities before worker thread is started. This is the first phase
+  // of bootstrapping, VM is currently running in single-thread mode.
+  MemTracker::bootstrap_single_thread();
+
   // Initialize output stream logging
   ostream_init_log();
 
@@ -3182,9 +3231,6 @@
   _number_of_threads = 0;
   _number_of_non_daemon_threads = 0;
 
-  // Initialize TLS
-  ThreadLocalStorage::init();
-
   // Initialize global data structures and create system classes in heap
   vm_init_globals();
 
@@ -3216,6 +3262,9 @@
   // Initialize Java-Level synchronization subsystem
   ObjectMonitor::Initialize() ;
 
+  // Second phase of bootstrapping, VM is about entering multi-thread mode
+  MemTracker::bootstrap_multi_thread();
+
   // Initialize global modules
   jint status = init_globals();
   if (status != JNI_OK) {
@@ -3243,6 +3292,9 @@
     Universe::verify();   // make sure we're starting with a clean slate
   }
 
+  // Fully start NMT
+  MemTracker::start();
+
   // Create the VMThread
   { TraceTime timer("Start VMThread", TraceStartupTime);
     VMThread::create();
@@ -3352,6 +3404,9 @@
       // The VM creates & returns objects of this class. Make sure it's initialized.
       initialize_class(vmSymbols::java_lang_Class(), CHECK_0);
       call_initializeSystemClass(CHECK_0);
+
+      // get the Java runtime name after java.lang.System is initialized
+      JDK_Version::set_runtime_name(get_java_runtime_name(THREAD));
     } else {
       warning("java.lang.System not initialized");
     }
@@ -3544,11 +3599,11 @@
       if (library == NULL) {
         const char *sub_msg = " in absolute path, with error: ";
         size_t len = strlen(msg) + strlen(name) + strlen(sub_msg) + strlen(ebuf) + 1;
-        char *buf = NEW_C_HEAP_ARRAY(char, len);
+        char *buf = NEW_C_HEAP_ARRAY(char, len, mtThread);
         jio_snprintf(buf, len, "%s%s%s%s", msg, name, sub_msg, ebuf);
         // If we can't find the agent, exit.
         vm_exit_during_initialization(buf, NULL);
-        FREE_C_HEAP_ARRAY(char, buf);
+        FREE_C_HEAP_ARRAY(char, buf, mtThread);
       }
     } else {
       // Try to load the agent from the standard dll directory
@@ -3562,7 +3617,7 @@
         const char *fmt   = "%s/bin/java %s -Dkernel.background.download=false"
                       " sun.jkernel.DownloadManager -download client_jvm";
         size_t length = strlen(props) + strlen(home) + strlen(fmt) + 1;
-        char *cmd = NEW_C_HEAP_ARRAY(char, length);
+        char *cmd = NEW_C_HEAP_ARRAY(char, length, mtThread);
         jio_snprintf(cmd, length, fmt, home, props);
         int status = os::fork_and_exec(cmd);
         FreeHeap(props);
@@ -3571,7 +3626,7 @@
           vm_exit_during_initialization("fork_and_exec failed: %s",
                                          strerror(errno));
         }
-        FREE_C_HEAP_ARRAY(char, cmd);
+        FREE_C_HEAP_ARRAY(char, cmd, mtThread);
         // when this comes back the instrument.dll should be where it belongs.
         library = os::dll_load(buffer, ebuf, sizeof ebuf);
       }
@@ -3583,11 +3638,11 @@
         if (library == NULL) {
           const char *sub_msg = " on the library path, with error: ";
           size_t len = strlen(msg) + strlen(name) + strlen(sub_msg) + strlen(ebuf) + 1;
-          char *buf = NEW_C_HEAP_ARRAY(char, len);
+          char *buf = NEW_C_HEAP_ARRAY(char, len, mtThread);
           jio_snprintf(buf, len, "%s%s%s%s", msg, name, sub_msg, ebuf);
           // If we can't find the agent, exit.
           vm_exit_during_initialization(buf, NULL);
-          FREE_C_HEAP_ARRAY(char, buf);
+          FREE_C_HEAP_ARRAY(char, buf, mtThread);
         }
       }
     }
@@ -3756,6 +3811,7 @@
 // and VM_Exit op at VM level.
 //
 // Shutdown sequence:
+//   + Shutdown native memory tracking if it is on
 //   + Wait until we are the last non-daemon thread to execute
 //     <-- every thing is still working at this moment -->
 //   + Call java.lang.Shutdown.shutdown(), which will invoke Java level
@@ -3801,6 +3857,10 @@
                          Mutex::_as_suspend_equivalent_flag);
   }
 
+  // Shutdown NMT before exit. Otherwise,
+  // it will run into trouble when system destroys static variables.
+  MemTracker::shutdown(MemTracker::NMT_normal);
+
   // Hang forever on exit if we are reporting an error.
   if (ShowMessageBoxOnError && is_error_reported()) {
     os::infinite_sleep();
@@ -3907,6 +3967,8 @@
     daemon = false;
   }
 
+  p->set_safepoint_visible(true);
+
   ThreadService::add_thread(p, daemon);
 
   // Possible GC point.
@@ -3952,6 +4014,10 @@
     // to do callbacks into the safepoint code. However, the safepoint code is not aware
     // of this thread since it is removed from the queue.
     p->set_terminated_value();
+
+    // Now, this thread is not visible to safepoint
+    p->set_safepoint_visible(false);
+
   } // unlock Threads_lock
 
   // Since Events::log uses a lock, we grab it outside the Threads_lock
--- a/src/share/vm/runtime/thread.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/thread.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -41,6 +41,7 @@
 #include "runtime/stubRoutines.hpp"
 #include "runtime/threadLocalStorage.hpp"
 #include "runtime/unhandledOops.hpp"
+#include "services/memRecorder.hpp"
 #include "trace/tracing.hpp"
 #include "utilities/exceptions.hpp"
 #include "utilities/top.hpp"
@@ -100,12 +101,16 @@
   //oop       _pending_exception;                // pending exception for current thread
   // const char* _exception_file;                   // file information for exception (debugging only)
   // int         _exception_line;                   // line information for exception (debugging only)
-
+ protected:
   // Support for forcing alignment of thread objects for biased locking
   void*       _real_malloc_address;
  public:
-  void* operator new(size_t size);
+  void* operator new(size_t size) { return allocate(size, true); }
+  void* operator new(size_t size, std::nothrow_t& nothrow_constant) { return allocate(size, false); }
   void  operator delete(void* p);
+
+ protected:
+   static void* allocate(size_t size, bool throw_excpt, MEMFLAGS flags = mtThread);
  private:
 
   // ***************************************************************
@@ -548,7 +553,6 @@
   virtual void print_on_error(outputStream* st, char* buf, int buflen) const;
 
   // Debug-only code
-
 #ifdef ASSERT
  private:
   // Deadlock detection support for Mutex locks. List of locks own by thread.
@@ -1027,9 +1031,15 @@
   bool do_not_unlock_if_synchronized()             { return _do_not_unlock_if_synchronized; }
   void set_do_not_unlock_if_synchronized(bool val) { _do_not_unlock_if_synchronized = val; }
 
+  // native memory tracking
+  inline MemRecorder* get_recorder() const          { return (MemRecorder*)_recorder; }
+  inline void         set_recorder(MemRecorder* rc) { _recorder = (volatile MemRecorder*)rc; }
+
+ private:
+  // per-thread memory recorder
+  volatile MemRecorder* _recorder;
 
   // Suspend/resume support for JavaThread
-
  private:
   void set_ext_suspended()       { set_suspend_flag (_ext_suspended);  }
   void clear_ext_suspended()     { clear_suspend_flag(_ext_suspended); }
@@ -1453,6 +1463,18 @@
      return result;
    }
 
+ // NMT (Native memory tracking) support.
+ // This flag helps NMT to determine if this JavaThread will be blocked
+ // at safepoint. If not, ThreadCritical is needed for writing memory records.
+ // JavaThread is only safepoint visible when it is in Threads' thread list,
+ // it is not visible until it is added to the list and becomes invisible
+ // once it is removed from the list.
+ public:
+  bool is_safepoint_visible() const { return _safepoint_visible; }
+  void set_safepoint_visible(bool visible) { _safepoint_visible = visible; }
+ private:
+  bool _safepoint_visible;
+
   // Static operations
  public:
   // Returns the running thread as a JavaThread
--- a/src/share/vm/runtime/unhandledOops.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/unhandledOops.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -37,7 +37,7 @@
 
 UnhandledOops::UnhandledOops(Thread* thread) {
   _thread = thread;
-  _oop_list = new (ResourceObj::C_HEAP)
+  _oop_list = new (ResourceObj::C_HEAP, mtInternal)
                     GrowableArray<UnhandledOopEntry>(free_list_size, true);
   _level = 0;
 }
--- a/src/share/vm/runtime/vframeArray.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/vframeArray.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -443,7 +443,7 @@
   // Allocate the vframeArray
   vframeArray * result = (vframeArray*) AllocateHeap(sizeof(vframeArray) + // fixed part
                                                      sizeof(vframeArrayElement) * (chunk->length() - 1), // variable part
-                                                     "vframeArray::allocate");
+                                                     mtCompiler);
   result->_frames = chunk->length();
   result->_owner_thread = thread;
   result->_sender = sender;
--- a/src/share/vm/runtime/vframeArray.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/vframeArray.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -108,7 +108,7 @@
 // but it does make debugging easier even if we can't look
 // at the data in each vframeElement
 
-class vframeArray: public CHeapObj {
+class vframeArray: public CHeapObj<mtCompiler> {
   friend class VMStructs;
 
  private:
--- a/src/share/vm/runtime/vframe_hp.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/vframe_hp.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -154,7 +154,7 @@
   } else {
     // No deferred updates pending for this thread.
     // allocate in C heap
-    deferred =  new(ResourceObj::C_HEAP) GrowableArray<jvmtiDeferredLocalVariableSet*> (1, true);
+    deferred =  new(ResourceObj::C_HEAP, mtCompiler) GrowableArray<jvmtiDeferredLocalVariableSet*> (1, true);
     thread()->set_deferred_locals(deferred);
   }
   deferred->push(new jvmtiDeferredLocalVariableSet(method(), bci(), fr().id()));
@@ -323,7 +323,7 @@
   _bci = bci;
   _id = id;
   // Alway will need at least one, must be on C heap
-  _locals = new(ResourceObj::C_HEAP) GrowableArray<jvmtiDeferredLocalVariable*> (1, true);
+  _locals = new(ResourceObj::C_HEAP, mtCompiler) GrowableArray<jvmtiDeferredLocalVariable*> (1, true);
 }
 
 jvmtiDeferredLocalVariableSet::~jvmtiDeferredLocalVariableSet() {
--- a/src/share/vm/runtime/vframe_hp.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/vframe_hp.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -89,7 +89,7 @@
 // any updated locals.
 
 class jvmtiDeferredLocalVariable;
-class jvmtiDeferredLocalVariableSet : public CHeapObj {
+class jvmtiDeferredLocalVariableSet : public CHeapObj<mtCompiler> {
 private:
 
   methodOop _method;           // must be GC'd
@@ -119,7 +119,7 @@
 
 };
 
-class jvmtiDeferredLocalVariable : public CHeapObj {
+class jvmtiDeferredLocalVariable : public CHeapObj<mtCompiler> {
   public:
 
     jvmtiDeferredLocalVariable(int index, BasicType type, jvalue value);
--- a/src/share/vm/runtime/virtualspace.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/virtualspace.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -26,6 +26,7 @@
 #include "oops/markOop.hpp"
 #include "oops/oop.inline.hpp"
 #include "runtime/virtualspace.hpp"
+#include "services/memTracker.hpp"
 #ifdef TARGET_OS_FAMILY_linux
 # include "os_linux.inline.hpp"
 #endif
@@ -489,6 +490,10 @@
                 (UseCompressedOops && (Universe::narrow_oop_base() != NULL) &&
                  Universe::narrow_oop_use_implicit_null_checks()) ?
                   lcm(os::vm_page_size(), alignment) : 0) {
+  if (base() > 0) {
+    MemTracker::record_virtual_memory_type((address)base(), mtJavaHeap);
+  }
+
   // Only reserved space for the java heap should have a noaccess_prefix
   // if using compressed oops.
   protect_noaccess_prefix(size);
@@ -504,6 +509,10 @@
                 (UseCompressedOops && (Universe::narrow_oop_base() != NULL) &&
                  Universe::narrow_oop_use_implicit_null_checks()) ?
                   lcm(os::vm_page_size(), prefix_align) : 0) {
+  if (base() > 0) {
+    MemTracker::record_virtual_memory_type((address)base(), mtJavaHeap);
+  }
+
   protect_noaccess_prefix(prefix_size+suffix_size);
 }
 
@@ -513,6 +522,7 @@
                                      size_t rs_align,
                                      bool large) :
   ReservedSpace(r_size, rs_align, large, /*executable*/ true) {
+  MemTracker::record_virtual_memory_type((address)base(), mtCode);
 }
 
 // VirtualSpace
--- a/src/share/vm/runtime/vmStructs.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/vmStructs.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -235,7 +235,6 @@
 #ifndef REG_COUNT
   #define REG_COUNT 0
 #endif
-
 // whole purpose of this function is to work around bug c++/27724 in gcc 4.1.1
 // with optimization turned on it doesn't affect produced code
 static inline uint64_t cast_uint64_t(size_t x)
@@ -244,6 +243,16 @@
 }
 
 
+typedef HashtableEntry<intptr_t, mtInternal>  IntptrHashtableEntry;
+typedef Hashtable<intptr_t, mtInternal>       IntptrHashtable;
+typedef Hashtable<Symbol*, mtSymbol>          SymbolHashtable;
+typedef HashtableEntry<Symbol*, mtClass>      SymbolHashtableEntry;
+typedef Hashtable<oop, mtSymbol>              StringHashtable;
+typedef TwoOopHashtable<klassOop, mtClass>    klassOopTwoOopHashtable;
+typedef Hashtable<klassOop, mtClass>          klassOopHashtable;
+typedef HashtableEntry<klassOop, mtClass>     klassHashtableEntry;
+typedef TwoOopHashtable<Symbol*, mtClass>     SymbolTwoOopHashtable;
+
 //--------------------------------------------------------------------------------
 // VM_STRUCTS
 //
@@ -299,7 +308,7 @@
   nonstatic_field(instanceKlass,               _protection_domain,                            oop)                                   \
   nonstatic_field(instanceKlass,               _signers,                                      objArrayOop)                           \
   nonstatic_field(instanceKlass,               _source_file_name,                             Symbol*)                               \
-  nonstatic_field(instanceKlass,               _source_debug_extension,                       Symbol*)                               \
+  nonstatic_field(instanceKlass,               _source_debug_extension,                       char*)                                 \
   nonstatic_field(instanceKlass,               _inner_classes,                                typeArrayOop)                          \
   nonstatic_field(instanceKlass,               _nonstatic_field_size,                         int)                                   \
   nonstatic_field(instanceKlass,               _static_field_size,                            int)                                   \
@@ -379,7 +388,6 @@
   volatile_nonstatic_field(constMethodOopDesc, _fingerprint,                                  uint64_t)                              \
   nonstatic_field(constMethodOopDesc,          _constants,                                    constantPoolOop)                       \
   nonstatic_field(constMethodOopDesc,          _stackmap_data,                                typeArrayOop)                          \
-  nonstatic_field(constMethodOopDesc,          _exception_table,                              typeArrayOop)                          \
   nonstatic_field(constMethodOopDesc,          _constMethod_size,                             int)                                   \
   nonstatic_field(constMethodOopDesc,          _interpreter_kind,                             jbyte)                                 \
   nonstatic_field(constMethodOopDesc,          _flags,                                        jbyte)                                 \
@@ -416,6 +424,10 @@
   nonstatic_field(LocalVariableTableElement,   descriptor_cp_index,                           u2)                                    \
   nonstatic_field(LocalVariableTableElement,   signature_cp_index,                            u2)                                    \
   nonstatic_field(LocalVariableTableElement,   slot,                                          u2)                                    \
+  nonstatic_field(ExceptionTableElement,       start_pc,                                      u2)                                    \
+  nonstatic_field(ExceptionTableElement,       end_pc,                                        u2)                                    \
+  nonstatic_field(ExceptionTableElement,       handler_pc,                                    u2)                                    \
+  nonstatic_field(ExceptionTableElement,       catch_type_index,                              u2)                                    \
   nonstatic_field(BreakpointInfo,              _orig_bytecode,                                Bytecodes::Code)                       \
   nonstatic_field(BreakpointInfo,              _bci,                                          int)                                   \
   nonstatic_field(BreakpointInfo,              _name_index,                                   u2)                                    \
@@ -711,26 +723,26 @@
   /* HashtableBucket */                                                                                                              \
   /*******************/                                                                                                              \
                                                                                                                                      \
-  nonstatic_field(HashtableBucket,             _entry,                                        BasicHashtableEntry*)                  \
+  nonstatic_field(HashtableBucket<mtInternal>,  _entry,                                        BasicHashtableEntry<mtInternal>*)     \
                                                                                                                                      \
   /******************/                                                                                                               \
   /* HashtableEntry */                                                                                                               \
   /******************/                                                                                                               \
                                                                                                                                      \
-  nonstatic_field(BasicHashtableEntry,         _next,                                         BasicHashtableEntry*)                  \
-  nonstatic_field(BasicHashtableEntry,         _hash,                                         unsigned int)                          \
-  nonstatic_field(HashtableEntry<intptr_t>,    _literal,                                      intptr_t) \
+  nonstatic_field(BasicHashtableEntry<mtInternal>, _next,                                     BasicHashtableEntry<mtInternal>*)      \
+  nonstatic_field(BasicHashtableEntry<mtInternal>, _hash,                                     unsigned int)                          \
+  nonstatic_field(IntptrHashtableEntry,            _literal,                                  intptr_t)                              \
                                                                                                                                      \
   /*************/                                                                                                                    \
   /* Hashtable */                                                                                                                    \
   /*************/                                                                                                                    \
                                                                                                                                      \
-  nonstatic_field(BasicHashtable,              _table_size,                                   int)                                   \
-  nonstatic_field(BasicHashtable,              _buckets,                                      HashtableBucket*)                      \
-  nonstatic_field(BasicHashtable,              _free_list,                                    BasicHashtableEntry*)                  \
-  nonstatic_field(BasicHashtable,              _first_free_entry,                             char*)                                 \
-  nonstatic_field(BasicHashtable,              _end_block,                                    char*)                                 \
-  nonstatic_field(BasicHashtable,              _entry_size,                                   int)                                   \
+  nonstatic_field(BasicHashtable<mtInternal>, _table_size,                                   int)                                   \
+  nonstatic_field(BasicHashtable<mtInternal>, _buckets,                                      HashtableBucket<mtInternal>*)          \
+  nonstatic_field(BasicHashtable<mtInternal>, _free_list,                                    BasicHashtableEntry<mtInternal>*)      \
+  nonstatic_field(BasicHashtable<mtInternal>, _first_free_entry,                             char*)                                 \
+  nonstatic_field(BasicHashtable<mtInternal>, _end_block,                                    char*)                                 \
+  nonstatic_field(BasicHashtable<mtInternal>, _entry_size,                                   int)                                   \
                                                                                                                                      \
   /*******************/                                                                                                              \
   /* DictionaryEntry */                                                                                                              \
@@ -1451,6 +1463,7 @@
                                                                           \
   declare_toplevel_type(CheckedExceptionElement)                          \
   declare_toplevel_type(LocalVariableTableElement)                        \
+  declare_toplevel_type(ExceptionTableElement)                            \
                                                                           \
   /******************************************/                            \
   /* Generation and space hierarchies       */                            \
@@ -1538,20 +1551,20 @@
   /* SymbolTable, SystemDictionary */                                     \
   /*********************************/                                     \
                                                                           \
-  declare_toplevel_type(BasicHashtable)                                   \
-    declare_type(Hashtable<intptr_t>, BasicHashtable)                     \
-  declare_type(SymbolTable, Hashtable<Symbol*>)                           \
-  declare_type(StringTable, Hashtable<oop>)                               \
-    declare_type(LoaderConstraintTable, Hashtable<klassOop>)              \
-    declare_type(TwoOopHashtable<klassOop>, Hashtable<klassOop>)          \
-    declare_type(Dictionary, TwoOopHashtable<klassOop>)                   \
-    declare_type(PlaceholderTable, TwoOopHashtable<Symbol*>)              \
-  declare_toplevel_type(BasicHashtableEntry)                              \
-  declare_type(HashtableEntry<intptr_t>, BasicHashtableEntry)             \
-    declare_type(DictionaryEntry, HashtableEntry<klassOop>)               \
-    declare_type(PlaceholderEntry, HashtableEntry<Symbol*>)               \
-    declare_type(LoaderConstraintEntry, HashtableEntry<klassOop>)         \
-  declare_toplevel_type(HashtableBucket)                                  \
+  declare_toplevel_type(BasicHashtable<mtInternal>)                       \
+    declare_type(IntptrHashtable, BasicHashtable<mtInternal>)             \
+  declare_type(SymbolTable, SymbolHashtable)                              \
+  declare_type(StringTable, StringHashtable)                              \
+    declare_type(LoaderConstraintTable, klassOopHashtable)                \
+    declare_type(klassOopTwoOopHashtable, klassOopHashtable)              \
+    declare_type(Dictionary, klassOopTwoOopHashtable)                     \
+    declare_type(PlaceholderTable, SymbolTwoOopHashtable)                 \
+  declare_toplevel_type(BasicHashtableEntry<mtInternal>)                  \
+  declare_type(IntptrHashtableEntry, BasicHashtableEntry<mtInternal>)     \
+    declare_type(DictionaryEntry, klassHashtableEntry)                    \
+    declare_type(PlaceholderEntry, SymbolHashtableEntry)                  \
+    declare_type(LoaderConstraintEntry, klassHashtableEntry)              \
+  declare_toplevel_type(HashtableBucket<mtInternal>)                      \
   declare_toplevel_type(SystemDictionary)                                 \
   declare_toplevel_type(vmSymbols)                                        \
   declare_toplevel_type(ProtectionDomainEntry)                            \
@@ -1944,14 +1957,12 @@
   declare_c2_type(ReverseBytesLNode, Node)                                \
   declare_c2_type(VectorNode, Node)                                       \
   declare_c2_type(AddVBNode, VectorNode)                                  \
-  declare_c2_type(AddVCNode, VectorNode)                                  \
   declare_c2_type(AddVSNode, VectorNode)                                  \
   declare_c2_type(AddVINode, VectorNode)                                  \
   declare_c2_type(AddVLNode, VectorNode)                                  \
   declare_c2_type(AddVFNode, VectorNode)                                  \
   declare_c2_type(AddVDNode, VectorNode)                                  \
   declare_c2_type(SubVBNode, VectorNode)                                  \
-  declare_c2_type(SubVCNode, VectorNode)                                  \
   declare_c2_type(SubVSNode, VectorNode)                                  \
   declare_c2_type(SubVINode, VectorNode)                                  \
   declare_c2_type(SubVLNode, VectorNode)                                  \
@@ -1962,73 +1973,33 @@
   declare_c2_type(DivVFNode, VectorNode)                                  \
   declare_c2_type(DivVDNode, VectorNode)                                  \
   declare_c2_type(LShiftVBNode, VectorNode)                               \
-  declare_c2_type(LShiftVCNode, VectorNode)                               \
   declare_c2_type(LShiftVSNode, VectorNode)                               \
   declare_c2_type(LShiftVINode, VectorNode)                               \
-  declare_c2_type(URShiftVBNode, VectorNode)                              \
-  declare_c2_type(URShiftVCNode, VectorNode)                              \
-  declare_c2_type(URShiftVSNode, VectorNode)                              \
-  declare_c2_type(URShiftVINode, VectorNode)                              \
+  declare_c2_type(RShiftVBNode, VectorNode)                               \
+  declare_c2_type(RShiftVSNode, VectorNode)                               \
+  declare_c2_type(RShiftVINode, VectorNode)                               \
   declare_c2_type(AndVNode, VectorNode)                                   \
   declare_c2_type(OrVNode, VectorNode)                                    \
   declare_c2_type(XorVNode, VectorNode)                                   \
-  declare_c2_type(VectorLoadNode, LoadNode)                               \
-  declare_c2_type(Load16BNode, VectorLoadNode)                            \
-  declare_c2_type(Load8BNode, VectorLoadNode)                             \
-  declare_c2_type(Load4BNode, VectorLoadNode)                             \
-  declare_c2_type(Load8CNode, VectorLoadNode)                             \
-  declare_c2_type(Load4CNode, VectorLoadNode)                             \
-  declare_c2_type(Load2CNode, VectorLoadNode)                             \
-  declare_c2_type(Load8SNode, VectorLoadNode)                             \
-  declare_c2_type(Load4SNode, VectorLoadNode)                             \
-  declare_c2_type(Load2SNode, VectorLoadNode)                             \
-  declare_c2_type(Load4INode, VectorLoadNode)                             \
-  declare_c2_type(Load2INode, VectorLoadNode)                             \
-  declare_c2_type(Load2LNode, VectorLoadNode)                             \
-  declare_c2_type(Load4FNode, VectorLoadNode)                             \
-  declare_c2_type(Load2FNode, VectorLoadNode)                             \
-  declare_c2_type(Load2DNode, VectorLoadNode)                             \
-  declare_c2_type(VectorStoreNode, StoreNode)                             \
-  declare_c2_type(Store16BNode, VectorStoreNode)                          \
-  declare_c2_type(Store8BNode, VectorStoreNode)                           \
-  declare_c2_type(Store4BNode, VectorStoreNode)                           \
-  declare_c2_type(Store8CNode, VectorStoreNode)                           \
-  declare_c2_type(Store4CNode, VectorStoreNode)                           \
-  declare_c2_type(Store2CNode, VectorStoreNode)                           \
-  declare_c2_type(Store4INode, VectorStoreNode)                           \
-  declare_c2_type(Store2INode, VectorStoreNode)                           \
-  declare_c2_type(Store2LNode, VectorStoreNode)                           \
-  declare_c2_type(Store4FNode, VectorStoreNode)                           \
-  declare_c2_type(Store2FNode, VectorStoreNode)                           \
-  declare_c2_type(Store2DNode, VectorStoreNode)                           \
-  declare_c2_type(Replicate16BNode, VectorNode)                           \
-  declare_c2_type(Replicate8BNode, VectorNode)                            \
-  declare_c2_type(Replicate4BNode, VectorNode)                            \
-  declare_c2_type(Replicate8CNode, VectorNode)                            \
-  declare_c2_type(Replicate4CNode, VectorNode)                            \
-  declare_c2_type(Replicate2CNode, VectorNode)                            \
-  declare_c2_type(Replicate8SNode, VectorNode)                            \
-  declare_c2_type(Replicate4SNode, VectorNode)                            \
-  declare_c2_type(Replicate2SNode, VectorNode)                            \
-  declare_c2_type(Replicate4INode, VectorNode)                            \
-  declare_c2_type(Replicate2INode, VectorNode)                            \
-  declare_c2_type(Replicate2LNode, VectorNode)                            \
-  declare_c2_type(Replicate4FNode, VectorNode)                            \
-  declare_c2_type(Replicate2FNode, VectorNode)                            \
-  declare_c2_type(Replicate2DNode, VectorNode)                            \
+  declare_c2_type(LoadVectorNode, LoadNode)                               \
+  declare_c2_type(StoreVectorNode, StoreNode)                             \
+  declare_c2_type(ReplicateBNode, VectorNode)                             \
+  declare_c2_type(ReplicateSNode, VectorNode)                             \
+  declare_c2_type(ReplicateINode, VectorNode)                             \
+  declare_c2_type(ReplicateLNode, VectorNode)                             \
+  declare_c2_type(ReplicateFNode, VectorNode)                             \
+  declare_c2_type(ReplicateDNode, VectorNode)                             \
   declare_c2_type(PackNode, VectorNode)                                   \
   declare_c2_type(PackBNode, PackNode)                                    \
-  declare_c2_type(PackCNode, PackNode)                                    \
   declare_c2_type(PackSNode, PackNode)                                    \
   declare_c2_type(PackINode, PackNode)                                    \
   declare_c2_type(PackLNode, PackNode)                                    \
   declare_c2_type(PackFNode, PackNode)                                    \
   declare_c2_type(PackDNode, PackNode)                                    \
-  declare_c2_type(Pack2x1BNode, PackNode)                                 \
-  declare_c2_type(Pack2x2BNode, PackNode)                                 \
+  declare_c2_type(Pack2LNode, PackNode)                                   \
+  declare_c2_type(Pack2DNode, PackNode)                                   \
   declare_c2_type(ExtractNode, Node)                                      \
   declare_c2_type(ExtractBNode, ExtractNode)                              \
-  declare_c2_type(ExtractCNode, ExtractNode)                              \
   declare_c2_type(ExtractSNode, ExtractNode)                              \
   declare_c2_type(ExtractINode, ExtractNode)                              \
   declare_c2_type(ExtractLNode, ExtractNode)                              \
@@ -2334,6 +2305,7 @@
   declare_constant(constMethodOopDesc::_has_linenumber_table)             \
   declare_constant(constMethodOopDesc::_has_checked_exceptions)           \
   declare_constant(constMethodOopDesc::_has_localvariable_table)          \
+  declare_constant(constMethodOopDesc::_has_exception_table)              \
                                                                           \
   /*************************************/                                 \
   /* instanceKlass enum                */                                 \
--- a/src/share/vm/runtime/vmThread.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/vmThread.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -46,7 +46,7 @@
 // Encapsulates both queue management and
 // and priority policy
 //
-class VMOperationQueue : public CHeapObj {
+class VMOperationQueue : public CHeapObj<mtInternal> {
  private:
   enum Priorities {
      SafepointPriority, // Highest priority (operation executed at a safepoint)
--- a/src/share/vm/runtime/vm_operations.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/runtime/vm_operations.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -96,7 +96,7 @@
   template(JFRCheckpoint)                         \
   template(Exit)                                  \
 
-class VM_Operation: public CHeapObj {
+class VM_Operation: public CHeapObj<mtInternal> {
  public:
   enum Mode {
     _safepoint,       // blocking,        safepoint, vm_op C-heap allocated
--- a/src/share/vm/services/attachListener.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/services/attachListener.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -320,7 +320,7 @@
   }
   bool res = CommandLineFlags::ccstrAtPut((char*)name, &value, ATTACH_ON_DEMAND);
   if (res) {
-    FREE_C_HEAP_ARRAY(char, value);
+    FREE_C_HEAP_ARRAY(char, value, mtInternal);
   } else {
     out->print_cr("setting flag %s failed", name);
   }
--- a/src/share/vm/services/attachListener.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/services/attachListener.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -98,7 +98,7 @@
 };
 
 #ifndef SERVICES_KERNEL
-class AttachOperation: public CHeapObj {
+class AttachOperation: public CHeapObj<mtInternal> {
  public:
   enum {
     name_length_max = 16,       // maximum length of  name
--- a/src/share/vm/services/diagnosticArgument.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/services/diagnosticArgument.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -140,7 +140,7 @@
   if (str == NULL) {
     _value = NULL;
   } else {
-    _value = NEW_C_HEAP_ARRAY(char, len+1);
+    _value = NEW_C_HEAP_ARRAY(char, len+1, mtInternal);
     strncpy(_value, str, len);
     _value[len] = 0;
   }
@@ -159,7 +159,7 @@
 
 template <> void DCmdArgument<char*>::destroy_value() {
   if (_value != NULL) {
-    FREE_C_HEAP_ARRAY(char, _value);
+    FREE_C_HEAP_ARRAY(char, _value, mtInternal);
     set_value(NULL);
   }
 }
--- a/src/share/vm/services/diagnosticArgument.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/services/diagnosticArgument.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -31,17 +31,17 @@
 #include "runtime/thread.hpp"
 #include "utilities/exceptions.hpp"
 
-class StringArrayArgument : public CHeapObj {
+class StringArrayArgument : public CHeapObj<mtInternal> {
 private:
   GrowableArray<char*>* _array;
 public:
   StringArrayArgument() {
-    _array = new(ResourceObj::C_HEAP)GrowableArray<char *>(32, true);
+    _array = new(ResourceObj::C_HEAP, mtInternal)GrowableArray<char *>(32, true);
     assert(_array != NULL, "Sanity check");
   }
   void add(const char* str, size_t len) {
     if (str != NULL) {
-      char* ptr = NEW_C_HEAP_ARRAY(char, len+1);
+      char* ptr = NEW_C_HEAP_ARRAY(char, len+1, mtInternal);
       strncpy(ptr, str, len);
       ptr[len] = 0;
       _array->append(ptr);
@@ -53,7 +53,7 @@
   ~StringArrayArgument() {
     for (int i=0; i<_array->length(); i++) {
       if(_array->at(i) != NULL) { // Safety check
-        FREE_C_HEAP_ARRAY(char, _array->at(i));
+        FREE_C_HEAP_ARRAY(char, _array->at(i), mtInternal);
       }
     }
     delete _array;
--- a/src/share/vm/services/diagnosticCommand.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/services/diagnosticCommand.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -48,7 +48,7 @@
            "With no argument this will show a list of available commands. "
            "'help all' will show help for all commands.";
   }
-  static const char* impact() { return "Low: "; }
+  static const char* impact() { return "Low"; }
   static int num_arguments();
   virtual void execute(TRAPS);
 };
@@ -60,7 +60,7 @@
   static const char* description() {
     return "Print JVM version information.";
   }
-  static const char* impact() { return "Low: "; }
+  static const char* impact() { return "Low"; }
   static int num_arguments() { return 0; }
   virtual void execute(TRAPS);
 };
@@ -72,7 +72,7 @@
   static const char* description() {
     return "Print the command line used to start this VM instance.";
   }
-  static const char* impact() { return "Low: "; }
+  static const char* impact() { return "Low"; }
   static int num_arguments() { return 0; }
   virtual void execute(TRAPS) {
     Arguments::print_on(_output);
@@ -88,7 +88,7 @@
       return "Print system properties.";
     }
     static const char* impact() {
-      return "Low: ";
+      return "Low";
     }
     static int num_arguments() { return 0; }
     virtual void execute(TRAPS);
@@ -105,7 +105,7 @@
     return "Print VM flag options and their current values.";
   }
   static const char* impact() {
-    return "Low: ";
+    return "Low";
   }
   static int num_arguments();
   virtual void execute(TRAPS);
@@ -121,7 +121,7 @@
     return "Print VM uptime.";
   }
   static const char* impact() {
-    return "Low: ";
+    return "Low";
   }
   static int num_arguments();
   virtual void execute(TRAPS);
--- a/src/share/vm/services/diagnosticFramework.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/services/diagnosticFramework.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -75,11 +75,13 @@
   }
   // extracting first item, argument or option name
   _key_addr = &_buffer[_cursor];
+  bool arg_had_quotes = false;
   while (_cursor <= _len - 1 && _buffer[_cursor] != '=' && _buffer[_cursor] != _delim) {
     // argument can be surrounded by single or double quotes
     if (_buffer[_cursor] == '\"' || _buffer[_cursor] == '\'') {
       _key_addr++;
       char quote = _buffer[_cursor];
+      arg_had_quotes = true;
       while (_cursor < _len - 1) {
         _cursor++;
         if (_buffer[_cursor] == quote && _buffer[_cursor - 1] != '\\') {
@@ -95,16 +97,22 @@
     _cursor++;
   }
   _key_len = &_buffer[_cursor] - _key_addr;
+  if (arg_had_quotes) {
+    // if the argument was quoted, we need to step past the last quote here
+    _cursor++;
+  }
   // check if the argument has the <key>=<value> format
   if (_cursor <= _len -1 && _buffer[_cursor] == '=') {
     _cursor++;
     _value_addr = &_buffer[_cursor];
+    bool value_had_quotes = false;
     // extract the value
     while (_cursor <= _len - 1 && _buffer[_cursor] != _delim) {
       // value can be surrounded by simple or double quotes
       if (_buffer[_cursor] == '\"' || _buffer[_cursor] == '\'') {
         _value_addr++;
         char quote = _buffer[_cursor];
+        value_had_quotes = true;
         while (_cursor < _len - 1) {
           _cursor++;
           if (_buffer[_cursor] == quote && _buffer[_cursor - 1] != '\\') {
@@ -120,6 +128,10 @@
       _cursor++;
     }
     _value_len = &_buffer[_cursor] - _value_addr;
+    if (value_had_quotes) {
+      // if the value was quoted, we need to step past the last quote here
+      _cursor++;
+    }
   } else {
     _value_addr = NULL;
     _value_len = 0;
@@ -185,8 +197,17 @@
         arg->read_value(iter.key_addr(), iter.key_length(), CHECK);
         next_argument = next_argument->next();
       } else {
-        THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
-          "Unknown argument in diagnostic command");
+        const size_t buflen    = 120;
+        const size_t argbuflen = 30;
+        char buf[buflen];
+        char argbuf[argbuflen];
+        size_t len = MIN2<size_t>(iter.key_length(), argbuflen - 1);
+
+        strncpy(argbuf, iter.key_addr(), len);
+        argbuf[len] = '\0';
+        jio_snprintf(buf, buflen - 1, "Unknown argument '%s' in diagnostic command.", argbuf);
+
+        THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), buf);
       }
     }
     cont = iter.next(CHECK);
@@ -207,19 +228,21 @@
 }
 
 void DCmdParser::check(TRAPS) {
+  const size_t buflen = 256;
+  char buf[buflen];
   GenDCmdArgument* arg = _arguments_list;
   while (arg != NULL) {
     if (arg->is_mandatory() && !arg->has_value()) {
-      THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
-              "Missing argument for diagnostic command");
+      jio_snprintf(buf, buflen - 1, "The argument '%s' is mandatory.", arg->name());
+      THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), buf);
     }
     arg = arg->next();
   }
   arg = _options;
   while (arg != NULL) {
     if (arg->is_mandatory() && !arg->has_value()) {
-      THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
-              "Missing option for diagnostic command");
+      jio_snprintf(buf, buflen - 1, "The option '%s' is mandatory.", arg->name());
+      THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), buf);
     }
     arg = arg->next();
   }
--- a/src/share/vm/services/diagnosticFramework.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/services/diagnosticFramework.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -238,6 +238,16 @@
   static const char* name() { return "No Name";}
   static const char* description() { return "No Help";}
   static const char* disabled_message() { return "Diagnostic command currently disabled"; }
+  // The impact() method returns a description of the intrusiveness of the diagnostic
+  // command on the Java Virtual Machine behavior. The rational for this method is that some
+  // diagnostic commands can seriously disrupt the behavior of the Java Virtual Machine
+  // (for instance a Thread Dump for an application with several tens of thousands of threads,
+  // or a Head Dump with a 40GB+ heap size) and other diagnostic commands have no serious
+  // impact on the JVM (for instance, getting the command line arguments or the JVM version).
+  // The recommended format for the description is <impact level>: [longer description],
+  // where the impact level is selected among this list: {Low, Medium, High}. The optional
+  // longer description can provide more specific details like the fact that Thread Dump
+  // impact depends on the heap size.
   static const char* impact() { return "Low: No impact"; }
   static int num_arguments() { return 0; }
   outputStream* output() { return _output; }
@@ -250,7 +260,7 @@
     bool has_arg = iter.next(CHECK);
     if (has_arg) {
       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
-                "Unknown argument in diagnostic command");
+                "The argument list of this diagnostic command should be empty.");
     }
   }
   virtual void execute(TRAPS) { }
@@ -310,7 +320,7 @@
 // manages the status of the diagnostic command (hidden, enabled). A DCmdFactory
 // has to be registered to make the diagnostic command available (see
 // management.cpp)
-class DCmdFactory: public CHeapObj {
+class DCmdFactory: public CHeapObj<mtInternal> {
 private:
   static Mutex*       _dcmdFactory_lock;
   // Pointer to the next factory in the singly-linked list of registered
@@ -368,7 +378,7 @@
     DCmdFactory(DCmdClass::num_arguments(), enabled, hidden) { }
   // Returns a C-heap allocated instance
   virtual DCmd* create_Cheap_instance(outputStream* output) {
-    return new (ResourceObj::C_HEAP) DCmdClass(output, true);
+    return new (ResourceObj::C_HEAP, mtInternal) DCmdClass(output, true);
   }
   // Returns a resourceArea allocated instance
   virtual DCmd* create_resource_instance(outputStream* output) {
--- a/src/share/vm/services/gcNotifier.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/services/gcNotifier.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -45,7 +45,7 @@
   // GC may occur between now and the creation of the notification
   int num_pools = MemoryService::num_memory_pools();
   // stat is deallocated inside GCNotificationRequest
-  GCStatInfo* stat = new(ResourceObj::C_HEAP) GCStatInfo(num_pools);
+  GCStatInfo* stat = new(ResourceObj::C_HEAP, mtGC) GCStatInfo(num_pools);
   mgr->get_last_gc_stat(stat);
   GCNotificationRequest *request = new GCNotificationRequest(os::javaTimeMillis(),mgr,action,cause,stat);
   addRequest(request);
--- a/src/share/vm/services/gcNotifier.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/services/gcNotifier.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -30,7 +30,7 @@
 #include "services/memoryService.hpp"
 #include "services/memoryManager.hpp"
 
-class GCNotificationRequest : public CHeapObj {
+class GCNotificationRequest : public CHeapObj<mtInternal> {
   friend class GCNotifier;
   GCNotificationRequest *next;
   jlong timestamp;
--- a/src/share/vm/services/heapDumper.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/services/heapDumper.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -436,7 +436,7 @@
   // sufficient memory then reduce size until we can allocate something.
   _size = io_buffer_size;
   do {
-    _buffer = (char*)os::malloc(_size);
+    _buffer = (char*)os::malloc(_size, mtInternal);
     if (_buffer == NULL) {
       _size = _size >> 1;
     }
@@ -1405,7 +1405,7 @@
     _gc_before_heap_dump = gc_before_heap_dump;
     _is_segmented_dump = false;
     _dump_start = (jlong)-1;
-    _klass_map = new (ResourceObj::C_HEAP) GrowableArray<Klass*>(INITIAL_CLASS_COUNT, true);
+    _klass_map = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<Klass*>(INITIAL_CLASS_COUNT, true);
     _stack_traces = NULL;
     _num_threads = 0;
     if (oome) {
@@ -1426,7 +1426,7 @@
       for (int i=0; i < _num_threads; i++) {
         delete _stack_traces[i];
       }
-      FREE_C_HEAP_ARRAY(ThreadStackTrace*, _stack_traces);
+      FREE_C_HEAP_ARRAY(ThreadStackTrace*, _stack_traces, mtInternal);
     }
     delete _klass_map;
   }
@@ -1806,7 +1806,7 @@
   writer()->write_u4(0);                    // thread number
   writer()->write_u4(0);                    // frame count
 
-  _stack_traces = NEW_C_HEAP_ARRAY(ThreadStackTrace*, Threads::number_of_threads());
+  _stack_traces = NEW_C_HEAP_ARRAY(ThreadStackTrace*, Threads::number_of_threads(), mtInternal);
   int frame_serial_num = 0;
   for (JavaThread* thread = Threads::first(); thread != NULL ; thread = thread->next()) {
     oop threadObj = thread->threadObj();
@@ -2005,7 +2005,7 @@
                    dump_file_name, os::current_process_id(), dump_file_ext);
     }
     const size_t len = strlen(base_path) + 1;
-    my_path = (char*)os::malloc(len);
+    my_path = (char*)os::malloc(len, mtInternal);
     if (my_path == NULL) {
       warning("Cannot create heap dump file.  Out of system memory.");
       return;
@@ -2014,7 +2014,7 @@
   } else {
     // Append a sequence number id for dumps following the first
     const size_t len = strlen(base_path) + max_digit_chars + 2; // for '.' and \0
-    my_path = (char*)os::malloc(len);
+    my_path = (char*)os::malloc(len, mtInternal);
     if (my_path == NULL) {
       warning("Cannot create heap dump file.  Out of system memory.");
       return;
--- a/src/share/vm/services/lowMemoryDetector.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/services/lowMemoryDetector.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -63,7 +63,7 @@
 class OopClosure;
 class MemoryPool;
 
-class ThresholdSupport : public CHeapObj {
+class ThresholdSupport : public CHeapObj<mtInternal> {
  private:
   bool            _support_high_threshold;
   bool            _support_low_threshold;
@@ -112,7 +112,7 @@
   }
 };
 
-class SensorInfo : public CHeapObj {
+class SensorInfo : public CHeapObj<mtInternal> {
 private:
   instanceOop     _sensor_obj;
   bool            _sensor_on;
--- a/src/share/vm/services/management.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/services/management.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -47,6 +47,7 @@
 #include "services/jmm.h"
 #include "services/lowMemoryDetector.hpp"
 #include "services/gcNotifier.hpp"
+#include "services/nmtDCmd.hpp"
 #include "services/management.hpp"
 #include "services/memoryManager.hpp"
 #include "services/memoryPool.hpp"
@@ -121,6 +122,7 @@
   // Registration of the diagnostic commands
   DCmdRegistrant::register_dcmds();
   DCmdRegistrant::register_dcmds_ext();
+  DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<NMTDCmd>(true, false));
 }
 
 void Management::initialize(TRAPS) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/services/memBaseline.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,387 @@
+/*
+ * 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.
+ *
+ */
+#include "precompiled.hpp"
+#include "classfile/systemDictionary.hpp"
+#include "memory/allocation.hpp"
+#include "services/memBaseline.hpp"
+#include "services/memTracker.hpp"
+
+MemType2Name MemBaseline::MemType2NameMap[NUMBER_OF_MEMORY_TYPE] = {
+  {mtJavaHeap,   "Java Heap"},
+  {mtClass,      "Class"},
+  {mtThreadStack,"Thread Stack"},
+  {mtThread,     "Thread"},
+  {mtCode,       "Code"},
+  {mtGC,         "GC"},
+  {mtCompiler,   "Compiler"},
+  {mtInternal,   "Internal"},
+  {mtOther,      "Other"},
+  {mtSymbol,     "Symbol"},
+  {mtNMT,        "Memory Tracking"},
+  {mtChunk,      "Pooled Free Chunks"},
+  {mtNone,       "Unknown"}  // It can happen when type tagging records are lagging
+                             // behind
+};
+
+MemBaseline::MemBaseline() {
+  _baselined = false;
+
+  for (int index = 0; index < NUMBER_OF_MEMORY_TYPE; index ++) {
+    _malloc_data[index].set_type(MemType2NameMap[index]._flag);
+    _vm_data[index].set_type(MemType2NameMap[index]._flag);
+    _arena_data[index].set_type(MemType2NameMap[index]._flag);
+  }
+
+  _malloc_cs = NULL;
+  _vm_cs = NULL;
+
+  _number_of_classes = 0;
+  _number_of_threads = 0;
+}
+
+
+void MemBaseline::clear() {
+  if (_malloc_cs != NULL) {
+    delete _malloc_cs;
+    _malloc_cs = NULL;
+  }
+
+  if (_vm_cs != NULL) {
+    delete _vm_cs;
+    _vm_cs = NULL;
+  }
+
+  reset();
+}
+
+
+void MemBaseline::reset() {
+  _baselined = false;
+  _total_vm_reserved = 0;
+  _total_vm_committed = 0;
+  _total_malloced = 0;
+  _number_of_classes = 0;
+
+  if (_malloc_cs != NULL) _malloc_cs->clear();
+  if (_vm_cs != NULL) _vm_cs->clear();
+
+  for (int index = 0; index < NUMBER_OF_MEMORY_TYPE; index ++) {
+    _malloc_data[index].clear();
+    _vm_data[index].clear();
+    _arena_data[index].clear();
+  }
+}
+
+MemBaseline::~MemBaseline() {
+  if (_malloc_cs != NULL) {
+    delete _malloc_cs;
+  }
+
+  if (_vm_cs != NULL) {
+    delete _vm_cs;
+  }
+}
+
+// baseline malloc'd memory records, generate overall summary and summaries by
+// memory types
+bool MemBaseline::baseline_malloc_summary(const MemPointerArray* malloc_records) {
+  MemPointerArrayIteratorImpl mItr((MemPointerArray*)malloc_records);
+  MemPointerRecord* mptr = (MemPointerRecord*)mItr.current();
+  size_t used_arena_size = 0;
+  int index;
+  while (mptr != NULL) {
+    index = flag2index(FLAGS_TO_MEMORY_TYPE(mptr->flags()));
+    size_t size = mptr->size();
+    _total_malloced += size;
+    _malloc_data[index].inc(size);
+    if (MemPointerRecord::is_arena_record(mptr->flags())) {
+      // see if arena size record present
+      MemPointerRecord* next_p = (MemPointerRecordEx*)mItr.peek_next();
+      if (MemPointerRecord::is_arena_size_record(next_p->flags())) {
+        assert(next_p->is_size_record_of_arena(mptr), "arena records do not match");
+        size = next_p->size();
+        _arena_data[index].inc(size);
+        used_arena_size += size;
+        mItr.next();
+      }
+    }
+    mptr = (MemPointerRecordEx*)mItr.next();
+  }
+
+  // substract used arena size to get size of arena chunk in free list
+  index = flag2index(mtChunk);
+  _malloc_data[index].reduce(used_arena_size);
+  // we really don't know how many chunks in free list, so just set to
+  // 0
+  _malloc_data[index].overwrite_counter(0);
+
+  return true;
+}
+
+// baseline mmap'd memory records, generate overall summary and summaries by
+// memory types
+bool MemBaseline::baseline_vm_summary(const MemPointerArray* vm_records) {
+  MemPointerArrayIteratorImpl vItr((MemPointerArray*)vm_records);
+  VMMemRegion* vptr = (VMMemRegion*)vItr.current();
+  int index;
+  while (vptr != NULL) {
+    index = flag2index(FLAGS_TO_MEMORY_TYPE(vptr->flags()));
+
+    // we use the number of thread stack to count threads
+    if (IS_MEMORY_TYPE(vptr->flags(), mtThreadStack)) {
+      _number_of_threads ++;
+    }
+    _total_vm_reserved += vptr->reserved_size();
+    _total_vm_committed += vptr->committed_size();
+    _vm_data[index].inc(vptr->reserved_size(), vptr->committed_size());
+    vptr = (VMMemRegion*)vItr.next();
+  }
+  return true;
+}
+
+// baseline malloc'd memory by callsites, but only the callsites with memory allocation
+// over 1KB are stored.
+bool MemBaseline::baseline_malloc_details(const MemPointerArray* malloc_records) {
+  assert(MemTracker::track_callsite(), "detail tracking is off");
+
+  MemPointerArrayIteratorImpl mItr((MemPointerArray*)malloc_records);
+  MemPointerRecordEx* mptr = (MemPointerRecordEx*)mItr.current();
+  MallocCallsitePointer mp;
+
+  if (_malloc_cs == NULL) {
+    _malloc_cs = new (std::nothrow) MemPointerArrayImpl<MallocCallsitePointer>(64);
+    // out of native memory
+    if (_malloc_cs == NULL) {
+      return false;
+    }
+  } else {
+    _malloc_cs->clear();
+  }
+
+  // baseline memory that is totaled over 1 KB
+  while (mptr != NULL) {
+    if (!MemPointerRecord::is_arena_size_record(mptr->flags())) {
+      // skip thread stacks
+      if (!IS_MEMORY_TYPE(mptr->flags(), mtThreadStack)) {
+        if (mp.addr() != mptr->pc()) {
+          if ((mp.amount()/K) > 0) {
+            if (!_malloc_cs->append(&mp)) {
+              return false;
+            }
+          }
+          mp = MallocCallsitePointer(mptr->pc());
+        }
+        mp.inc(mptr->size());
+      }
+    }
+    mptr = (MemPointerRecordEx*)mItr.next();
+  }
+
+  if (mp.addr() != 0 && (mp.amount()/K) > 0) {
+    if (!_malloc_cs->append(&mp)) {
+      return false;
+    }
+  }
+  return true;
+}
+
+// baseline mmap'd memory by callsites
+bool MemBaseline::baseline_vm_details(const MemPointerArray* vm_records) {
+  assert(MemTracker::track_callsite(), "detail tracking is off");
+
+  VMCallsitePointer vp;
+  MemPointerArrayIteratorImpl vItr((MemPointerArray*)vm_records);
+  VMMemRegionEx* vptr = (VMMemRegionEx*)vItr.current();
+
+  if (_vm_cs == NULL) {
+    _vm_cs = new (std::nothrow) MemPointerArrayImpl<VMCallsitePointer>(64);
+    if (_vm_cs == NULL) {
+      return false;
+    }
+  } else {
+    _vm_cs->clear();
+  }
+
+  while (vptr != NULL) {
+    if (vp.addr() != vptr->pc()) {
+      if (!_vm_cs->append(&vp)) {
+        return false;
+      }
+      vp = VMCallsitePointer(vptr->pc());
+    }
+    vp.inc(vptr->size(), vptr->committed_size());
+    vptr = (VMMemRegionEx*)vItr.next();
+  }
+  if (vp.addr() != 0) {
+    if (!_vm_cs->append(&vp)) {
+      return false;
+    }
+  }
+  return true;
+}
+
+// baseline a snapshot. If summary_only = false, memory usages aggregated by
+// callsites are also baselined.
+bool MemBaseline::baseline(MemSnapshot& snapshot, bool summary_only) {
+  MutexLockerEx snapshot_locker(snapshot._lock, true);
+  reset();
+  _baselined = baseline_malloc_summary(snapshot._alloc_ptrs) &&
+               baseline_vm_summary(snapshot._vm_ptrs);
+  _number_of_classes = SystemDictionary::number_of_classes();
+
+  if (!summary_only && MemTracker::track_callsite() && _baselined) {
+    ((MemPointerArray*)snapshot._alloc_ptrs)->sort((FN_SORT)malloc_sort_by_pc);
+    ((MemPointerArray*)snapshot._vm_ptrs)->sort((FN_SORT)vm_sort_by_pc);
+    _baselined =  baseline_malloc_details(snapshot._alloc_ptrs) &&
+      baseline_vm_details(snapshot._vm_ptrs);
+    ((MemPointerArray*)snapshot._alloc_ptrs)->sort((FN_SORT)malloc_sort_by_addr);
+    ((MemPointerArray*)snapshot._vm_ptrs)->sort((FN_SORT)vm_sort_by_addr);
+  }
+  return _baselined;
+}
+
+
+int MemBaseline::flag2index(MEMFLAGS flag) const {
+  for (int index = 0; index < NUMBER_OF_MEMORY_TYPE; index ++) {
+    if (MemType2NameMap[index]._flag == flag) {
+      return index;
+    }
+  }
+  assert(false, "no type");
+  return -1;
+}
+
+const char* MemBaseline::type2name(MEMFLAGS type) {
+  for (int index = 0; index < NUMBER_OF_MEMORY_TYPE; index ++) {
+    if (MemType2NameMap[index]._flag == type) {
+      return MemType2NameMap[index]._name;
+    }
+  }
+  assert(false, "no type");
+  return NULL;
+}
+
+
+MemBaseline& MemBaseline::operator=(const MemBaseline& other) {
+  _total_malloced = other._total_malloced;
+  _total_vm_reserved = other._total_vm_reserved;
+  _total_vm_committed = other._total_vm_committed;
+
+  _baselined = other._baselined;
+  _number_of_classes = other._number_of_classes;
+
+  for (int index = 0; index < NUMBER_OF_MEMORY_TYPE; index ++) {
+    _malloc_data[index] = other._malloc_data[index];
+    _vm_data[index] = other._vm_data[index];
+    _arena_data[index] = other._arena_data[index];
+  }
+
+  if (MemTracker::track_callsite()) {
+    assert(_malloc_cs != NULL && _vm_cs != NULL, "out of memory");
+    assert(other._malloc_cs != NULL && other._vm_cs != NULL,
+           "not properly baselined");
+    _malloc_cs->clear();
+    _vm_cs->clear();
+    int index;
+    for (index = 0; index < other._malloc_cs->length(); index ++) {
+      _malloc_cs->append(other._malloc_cs->at(index));
+    }
+
+    for (index = 0; index < other._vm_cs->length(); index ++) {
+      _vm_cs->append(other._vm_cs->at(index));
+    }
+  }
+  return *this;
+}
+
+/* compare functions for sorting */
+
+// sort snapshot malloc'd records in callsite pc order
+int MemBaseline::malloc_sort_by_pc(const void* p1, const void* p2) {
+  assert(MemTracker::track_callsite(),"Just check");
+  const MemPointerRecordEx* mp1 = (const MemPointerRecordEx*)p1;
+  const MemPointerRecordEx* mp2 = (const MemPointerRecordEx*)p2;
+  return UNSIGNED_COMPARE(mp1->pc(), mp2->pc());
+}
+
+// sort baselined malloc'd records in size order
+int MemBaseline::bl_malloc_sort_by_size(const void* p1, const void* p2) {
+  assert(MemTracker::is_on(), "Just check");
+  const MallocCallsitePointer* mp1 = (const MallocCallsitePointer*)p1;
+  const MallocCallsitePointer* mp2 = (const MallocCallsitePointer*)p2;
+  return UNSIGNED_COMPARE(mp2->amount(), mp1->amount());
+}
+
+// sort baselined malloc'd records in callsite pc order
+int MemBaseline::bl_malloc_sort_by_pc(const void* p1, const void* p2) {
+  assert(MemTracker::is_on(), "Just check");
+  const MallocCallsitePointer* mp1 = (const MallocCallsitePointer*)p1;
+  const MallocCallsitePointer* mp2 = (const MallocCallsitePointer*)p2;
+  return UNSIGNED_COMPARE(mp1->addr(), mp2->addr());
+}
+
+// sort snapshot mmap'd records in callsite pc order
+int MemBaseline::vm_sort_by_pc(const void* p1, const void* p2) {
+  assert(MemTracker::track_callsite(),"Just check");
+  const VMMemRegionEx* mp1 = (const VMMemRegionEx*)p1;
+  const VMMemRegionEx* mp2 = (const VMMemRegionEx*)p2;
+  return UNSIGNED_COMPARE(mp1->pc(), mp2->pc());
+}
+
+// sort baselined mmap'd records in size (reserved size) order
+int MemBaseline::bl_vm_sort_by_size(const void* p1, const void* p2) {
+  assert(MemTracker::is_on(), "Just check");
+  const VMCallsitePointer* mp1 = (const VMCallsitePointer*)p1;
+  const VMCallsitePointer* mp2 = (const VMCallsitePointer*)p2;
+  return UNSIGNED_COMPARE(mp2->reserved_amount(), mp1->reserved_amount());
+}
+
+// sort baselined mmap'd records in callsite pc order
+int MemBaseline::bl_vm_sort_by_pc(const void* p1, const void* p2) {
+  assert(MemTracker::is_on(), "Just check");
+  const VMCallsitePointer* mp1 = (const VMCallsitePointer*)p1;
+  const VMCallsitePointer* mp2 = (const VMCallsitePointer*)p2;
+  return UNSIGNED_COMPARE(mp1->addr(), mp2->addr());
+}
+
+
+// sort snapshot malloc'd records in memory block address order
+int MemBaseline::malloc_sort_by_addr(const void* p1, const void* p2) {
+  assert(MemTracker::is_on(), "Just check");
+  const MemPointerRecord* mp1 = (const MemPointerRecord*)p1;
+  const MemPointerRecord* mp2 = (const MemPointerRecord*)p2;
+  int delta = UNSIGNED_COMPARE(mp1->addr(), mp2->addr());
+  assert(delta != 0, "dup pointer");
+  return delta;
+}
+
+// sort snapshot mmap'd records in memory block address order
+int MemBaseline::vm_sort_by_addr(const void* p1, const void* p2) {
+  assert(MemTracker::is_on(), "Just check");
+  const VMMemRegion* mp1 = (const VMMemRegion*)p1;
+  const VMMemRegion* mp2 = (const VMMemRegion*)p2;
+  int delta = UNSIGNED_COMPARE(mp1->addr(), mp2->addr());
+  assert(delta != 0, "dup pointer");
+  return delta;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/services/memBaseline.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,447 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_SERVICES_MEM_BASELINE_HPP
+#define SHARE_VM_SERVICES_MEM_BASELINE_HPP
+
+#include "memory/allocation.hpp"
+#include "runtime/mutex.hpp"
+#include "services/memPtr.hpp"
+#include "services/memSnapshot.hpp"
+
+// compare unsigned number
+#define UNSIGNED_COMPARE(a, b)  ((a > b) ? 1 : ((a == b) ? 0 : -1))
+
+/*
+ * MallocCallsitePointer and VMCallsitePointer are used
+ * to baseline memory blocks with their callsite information.
+ * They are only available when detail tracking is turned
+ * on.
+ */
+
+/* baselined malloc record aggregated by callsite */
+class MallocCallsitePointer : public MemPointer {
+ private:
+  size_t    _count;   // number of malloc invocation from this callsite
+  size_t    _amount;  // total amount of memory malloc-ed from this callsite
+
+ public:
+  MallocCallsitePointer() {
+    _count = 0;
+    _amount = 0;
+  }
+
+  MallocCallsitePointer(address pc) : MemPointer(pc) {
+    _count = 0;
+    _amount = 0;
+  }
+
+  MallocCallsitePointer& operator=(const MallocCallsitePointer& p) {
+    MemPointer::operator=(p);
+    _count = p.count();
+    _amount = p.amount();
+    return *this;
+  }
+
+  inline void inc(size_t size) {
+    _count ++;
+    _amount += size;
+  };
+
+  inline size_t count() const {
+    return _count;
+  }
+
+  inline size_t amount() const {
+    return _amount;
+  }
+};
+
+// baselined virtual memory record aggregated by callsite
+class VMCallsitePointer : public MemPointer {
+ private:
+  size_t     _count;              // number of invocation from this callsite
+  size_t     _reserved_amount;    // total reserved amount
+  size_t     _committed_amount;   // total committed amount
+
+ public:
+  VMCallsitePointer() {
+    _count = 0;
+    _reserved_amount = 0;
+    _committed_amount = 0;
+  }
+
+  VMCallsitePointer(address pc) : MemPointer(pc) {
+    _count = 0;
+    _reserved_amount = 0;
+    _committed_amount = 0;
+  }
+
+  VMCallsitePointer& operator=(const VMCallsitePointer& p) {
+    MemPointer::operator=(p);
+    _count = p.count();
+    _reserved_amount = p.reserved_amount();
+    _committed_amount = p.committed_amount();
+    return *this;
+  }
+
+  inline void inc(size_t reserved, size_t committed) {
+    _count ++;
+    _reserved_amount += reserved;
+    _committed_amount += committed;
+  }
+
+  inline size_t count() const {
+    return _count;
+  }
+
+  inline size_t reserved_amount() const {
+    return _reserved_amount;
+  }
+
+  inline size_t committed_amount() const {
+    return _committed_amount;
+  }
+};
+
+// maps a memory type flag to readable name
+typedef struct _memType2Name {
+  MEMFLAGS     _flag;
+  const char*  _name;
+} MemType2Name;
+
+
+// This class aggregates malloc'd records by memory type
+class MallocMem : public _ValueObj {
+ private:
+  MEMFLAGS       _type;
+
+  size_t         _count;
+  size_t         _amount;
+
+ public:
+  MallocMem() {
+    _type = mtNone;
+    _count = 0;
+    _amount = 0;
+  }
+
+  MallocMem(MEMFLAGS flags) {
+    assert(HAS_VALID_MEMORY_TYPE(flags), "no type");
+    _type = FLAGS_TO_MEMORY_TYPE(flags);
+    _count = 0;
+    _amount = 0;
+  }
+
+  inline void set_type(MEMFLAGS flag) {
+    _type = flag;
+  }
+
+  inline void clear() {
+    _count = 0;
+    _amount = 0;
+    _type = mtNone;
+  }
+
+  MallocMem& operator=(const MallocMem& m) {
+    assert(_type == m.type(), "different type");
+    _count = m.count();
+    _amount = m.amount();
+    return *this;
+  }
+
+  inline void inc(size_t amt) {
+    _amount += amt;
+    _count ++;
+  }
+
+  inline void reduce(size_t amt) {
+    assert(_amount >= amt, "Just check");
+    _amount -= amt;
+  }
+
+  inline void overwrite_counter(size_t count) {
+    _count = count;
+  }
+
+  inline MEMFLAGS type() const {
+    return _type;
+  }
+
+  inline bool is_type(MEMFLAGS flags) const {
+    return FLAGS_TO_MEMORY_TYPE(flags) == _type;
+  }
+
+  inline size_t count() const {
+    return _count;
+  }
+
+  inline size_t amount() const {
+    return _amount;
+  }
+};
+
+// This class records live arena's memory usage
+class ArenaMem : public MallocMem {
+ public:
+  ArenaMem(MEMFLAGS typeflag): MallocMem(typeflag) {
+  }
+  ArenaMem() { }
+};
+
+// This class aggregates virtual memory by its memory type
+class VMMem : public _ValueObj {
+ private:
+  MEMFLAGS       _type;
+
+  size_t         _count;
+  size_t         _reserved_amount;
+  size_t         _committed_amount;
+
+ public:
+  VMMem() {
+    _type = mtNone;
+    _count = 0;
+    _reserved_amount = 0;
+    _committed_amount = 0;
+  }
+
+  VMMem(MEMFLAGS flags) {
+    assert(HAS_VALID_MEMORY_TYPE(flags), "no type");
+    _type = FLAGS_TO_MEMORY_TYPE(flags);
+    _count = 0;
+    _reserved_amount = 0;
+    _committed_amount = 0;
+  }
+
+  inline void clear() {
+    _type = mtNone;
+    _count = 0;
+    _reserved_amount = 0;
+    _committed_amount = 0;
+  }
+
+  inline void set_type(MEMFLAGS flags) {
+    _type = FLAGS_TO_MEMORY_TYPE(flags);
+  }
+
+  VMMem& operator=(const VMMem& m) {
+    assert(_type == m.type(), "different type");
+
+    _count = m.count();
+    _reserved_amount = m.reserved_amount();
+    _committed_amount = m.committed_amount();
+    return *this;
+  }
+
+
+  inline MEMFLAGS type() const {
+    return _type;
+  }
+
+  inline bool is_type(MEMFLAGS flags) const {
+    return FLAGS_TO_MEMORY_TYPE(flags) == _type;
+  }
+
+  inline void inc(size_t reserved_amt, size_t committed_amt) {
+    _reserved_amount += reserved_amt;
+    _committed_amount += committed_amt;
+    _count ++;
+  }
+
+  inline size_t count() const {
+    return _count;
+  }
+
+  inline size_t reserved_amount() const {
+    return _reserved_amount;
+  }
+
+  inline size_t committed_amount() const {
+    return _committed_amount;
+  }
+};
+
+
+
+#define NUMBER_OF_MEMORY_TYPE    (mt_number_of_types + 1)
+
+class BaselineReporter;
+class BaselineComparisonReporter;
+
+/*
+ * This class baselines current memory snapshot.
+ * A memory baseline summarizes memory usage by memory type,
+ * aggregates memory usage by callsites when detail tracking
+ * is on.
+ */
+class MemBaseline : public _ValueObj {
+  friend class BaselineReporter;
+  friend class BaselineComparisonReporter;
+
+ private:
+  // overall summaries
+  size_t        _total_malloced;
+  size_t        _total_vm_reserved;
+  size_t        _total_vm_committed;
+  size_t        _number_of_classes;
+  size_t        _number_of_threads;
+
+  // if it has properly baselined
+  bool          _baselined;
+
+  // we categorize memory into three categories within the memory type
+  MallocMem     _malloc_data[NUMBER_OF_MEMORY_TYPE];
+  VMMem         _vm_data[NUMBER_OF_MEMORY_TYPE];
+  ArenaMem      _arena_data[NUMBER_OF_MEMORY_TYPE];
+
+  // memory records that aggregate memory usage by callsites.
+  // only available when detail tracking is on.
+  MemPointerArray*  _malloc_cs;
+  MemPointerArray*  _vm_cs;
+
+ private:
+  static MemType2Name  MemType2NameMap[NUMBER_OF_MEMORY_TYPE];
+
+ private:
+  // should not use copy constructor
+  MemBaseline(MemBaseline& copy) { ShouldNotReachHere(); }
+
+ public:
+  // create a memory baseline
+  MemBaseline();
+
+  virtual ~MemBaseline();
+
+  inline bool baselined() const {
+    return _baselined;
+  }
+
+  MemBaseline& operator=(const MemBaseline& other);
+
+  // reset the baseline for reuse
+  void clear();
+
+  // baseline the snapshot
+  bool baseline(MemSnapshot& snapshot, bool summary_only = true);
+
+  bool baseline(const MemPointerArray* malloc_records,
+                const MemPointerArray* vm_records,
+                bool summary_only = true);
+
+  // total malloc'd memory of specified memory type
+  inline size_t malloc_amount(MEMFLAGS flag) const {
+    return _malloc_data[flag2index(flag)].amount();
+  }
+  // number of malloc'd memory blocks of specified memory type
+  inline size_t malloc_count(MEMFLAGS flag) const {
+    return _malloc_data[flag2index(flag)].count();
+  }
+  // total memory used by arenas of specified memory type
+  inline size_t arena_amount(MEMFLAGS flag) const {
+    return _arena_data[flag2index(flag)].amount();
+  }
+  // number of arenas of specified memory type
+  inline size_t arena_count(MEMFLAGS flag) const {
+    return _arena_data[flag2index(flag)].count();
+  }
+  // total reserved memory of specified memory type
+  inline size_t reserved_amount(MEMFLAGS flag) const {
+    return _vm_data[flag2index(flag)].reserved_amount();
+  }
+  // total committed memory of specified memory type
+  inline size_t committed_amount(MEMFLAGS flag) const {
+    return _vm_data[flag2index(flag)].committed_amount();
+  }
+  // total memory (malloc'd + mmap'd + arena) of specified
+  // memory type
+  inline size_t total_amount(MEMFLAGS flag) const {
+    int index = flag2index(flag);
+    return _malloc_data[index].amount() +
+           _vm_data[index].reserved_amount() +
+           _arena_data[index].amount();
+  }
+
+  /* overall summaries */
+
+  // total malloc'd memory in snapshot
+  inline size_t total_malloc_amount() const {
+    return _total_malloced;
+  }
+  // total mmap'd memory in snapshot
+  inline size_t total_reserved_amount() const {
+    return _total_vm_reserved;
+  }
+  // total committed memory in snapshot
+  inline size_t total_committed_amount() const {
+    return _total_vm_committed;
+  }
+  // number of loaded classes
+  inline size_t number_of_classes() const {
+    return _number_of_classes;
+  }
+  // number of running threads
+  inline size_t number_of_threads() const {
+    return _number_of_threads;
+  }
+  // lookup human readable name of a memory type
+  static const char* type2name(MEMFLAGS type);
+
+ private:
+  // convert memory flag to the index to mapping table
+  int         flag2index(MEMFLAGS flag) const;
+
+  // reset baseline values
+  void reset();
+
+  // summarize the records in global snapshot
+  bool baseline_malloc_summary(const MemPointerArray* malloc_records);
+  bool baseline_vm_summary(const MemPointerArray* vm_records);
+  bool baseline_malloc_details(const MemPointerArray* malloc_records);
+  bool baseline_vm_details(const MemPointerArray* vm_records);
+
+  // print a line of malloc'd memory aggregated by callsite
+  void print_malloc_callsite(outputStream* st, address pc, size_t size,
+    size_t count, int diff_amt, int diff_count) const;
+  // print a line of mmap'd memory aggregated by callsite
+  void print_vm_callsite(outputStream* st, address pc, size_t rsz,
+    size_t csz, int diff_rsz, int diff_csz) const;
+
+  // sorting functions for raw records
+  static int malloc_sort_by_pc(const void* p1, const void* p2);
+  static int malloc_sort_by_addr(const void* p1, const void* p2);
+
+  static int vm_sort_by_pc(const void* p1, const void* p2);
+  static int vm_sort_by_addr(const void* p1, const void* p2);
+
+ private:
+  // sorting functions for baselined records
+  static int bl_malloc_sort_by_size(const void* p1, const void* p2);
+  static int bl_vm_sort_by_size(const void* p1, const void* p2);
+  static int bl_malloc_sort_by_pc(const void* p1, const void* p2);
+  static int bl_vm_sort_by_pc(const void* p1, const void* p2);
+};
+
+
+#endif // SHARE_VM_SERVICES_MEM_BASELINE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/services/memPtr.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "services/memPtr.hpp"
+#include "services/memTracker.hpp"
+
+volatile jint SequenceGenerator::_seq_number = 1;
+DEBUG_ONLY(jint SequenceGenerator::_max_seq_number = 1;)
+DEBUG_ONLY(volatile unsigned long SequenceGenerator::_generation = 0;)
+
+jint SequenceGenerator::next() {
+  jint seq = Atomic::add(1, &_seq_number);
+  if (seq < 0) {
+    MemTracker::shutdown(MemTracker::NMT_sequence_overflow);
+  }
+  assert(seq > 0, "counter overflow");
+  DEBUG_ONLY(_max_seq_number = (seq > _max_seq_number) ? seq : _max_seq_number;)
+  return seq;
+}
+
+
+
+bool VMMemRegion::contains(const VMMemRegion* mr) const {
+  assert(base() != 0, "no base address");
+  assert(size() != 0 || committed_size() != 0,
+    "no range");
+  address base_addr = base();
+  address end_addr = base_addr +
+    (is_reserve_record()? reserved_size(): committed_size());
+  if (mr->is_reserve_record()) {
+    if (mr->base() == base_addr && mr->size() == size()) {
+      // the same range
+      return true;
+    }
+    return false;
+  } else if (mr->is_commit_record() || mr->is_uncommit_record()) {
+    assert(mr->base() != 0 && mr->committed_size() > 0,
+      "bad record");
+    return (mr->base() >= base_addr &&
+      (mr->base() + mr->committed_size()) <= end_addr);
+  } else if (mr->is_type_tagging_record()) {
+    assert(mr->base() != 0, "no base");
+    return mr->base() == base_addr;
+  } else if (mr->is_release_record()) {
+    assert(mr->base() != 0 && mr->size() > 0,
+      "bad record");
+    return (mr->base() == base_addr && mr->size() == size());
+  } else {
+    assert(false, "what happened?");
+    return false;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/services/memPtr.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,509 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_SERVICES_MEM_PTR_HPP
+#define SHARE_VM_SERVICES_MEM_PTR_HPP
+
+#include "memory/allocation.hpp"
+#include "runtime/atomic.hpp"
+#include "runtime/os.hpp"
+#include "runtime/safepoint.hpp"
+
+/*
+ * global sequence generator that generates sequence numbers to serialize
+ * memory records.
+ */
+class SequenceGenerator : AllStatic {
+ public:
+  static jint next();
+
+  // peek last sequence number
+  static jint peek() {
+    return _seq_number;
+  }
+
+  // reset sequence number
+  static void reset() {
+    assert(SafepointSynchronize::is_at_safepoint(), "Safepoint required");
+    _seq_number = 1;
+    DEBUG_ONLY(_generation ++;)
+  };
+
+  DEBUG_ONLY(static unsigned long current_generation() { return (unsigned long)_generation; })
+  DEBUG_ONLY(static jint max_seq_num() { return _max_seq_number; })
+
+ private:
+  static volatile jint _seq_number;
+  DEBUG_ONLY(static jint _max_seq_number; )
+  DEBUG_ONLY(static volatile unsigned long _generation; )
+};
+
+/*
+ * followings are the classes that are used to hold memory activity records in different stages.
+ *   MemPointer
+ *     |--------MemPointerRecord
+ *                     |
+ *                     |----MemPointerRecordEx
+ *                     |           |
+ *                     |           |-------SeqMemPointerRecordEx
+ *                     |
+ *                     |----SeqMemPointerRecord
+ *                     |
+ *                     |----VMMemRegion
+ *                               |
+ *                               |-----VMMemRegionEx
+ *
+ *
+ *  prefix 'Seq' - sequenced, the record contains a sequence number
+ *  surfix 'Ex'  - extension, the record contains a caller's pc
+ *
+ *  per-thread recorder : SeqMemPointerRecord(Ex)
+ *  snapshot staging    : SeqMemPointerRecord(Ex)
+ *  snapshot            : MemPointerRecord(Ex) and VMMemRegion(Ex)
+ *
+ */
+
+/*
+ * class that wraps an address to a memory block,
+ * the memory pointer either points to a malloc'd
+ * memory block, or a mmap'd memory block
+ */
+class MemPointer : public _ValueObj {
+ public:
+  MemPointer(): _addr(0) { }
+  MemPointer(address addr): _addr(addr) { }
+
+  MemPointer(const MemPointer& copy_from) {
+    _addr = copy_from.addr();
+  }
+
+  inline address addr() const {
+    return _addr;
+  }
+
+  inline operator address() const {
+    return addr();
+  }
+
+  inline bool operator == (const MemPointer& other) const {
+    return addr() == other.addr();
+  }
+
+  inline MemPointer& operator = (const MemPointer& other) {
+    _addr = other.addr();
+    return *this;
+  }
+
+ protected:
+  inline void set_addr(address addr) { _addr = addr; }
+
+ protected:
+  // memory address
+  address    _addr;
+};
+
+/* MemPointerRecord records an activityand associated
+ * attributes on a memory block.
+ */
+class MemPointerRecord : public MemPointer {
+ private:
+  MEMFLAGS       _flags;
+  size_t         _size;
+
+public:
+  /* extension of MemoryType enum
+   * see share/vm/memory/allocation.hpp for details.
+   *
+   * The tag values are associated to sorting orders, so be
+   * careful if changes are needed.
+   * The allocation records should be sorted ahead of tagging
+   * records, which in turn ahead of deallocation records
+   */
+  enum MemPointerTags {
+    tag_alloc            = 0x0001, // malloc or reserve record
+    tag_commit           = 0x0002, // commit record
+    tag_type             = 0x0003, // tag virtual memory to a memory type
+    tag_uncommit         = 0x0004, // uncommit record
+    tag_release          = 0x0005, // free or release record
+    tag_size             = 0x0006, // arena size
+    tag_masks            = 0x0007, // all tag bits
+    vmBit                = 0x0008
+  };
+
+  /* helper functions to interpret the tagging flags */
+
+  inline static bool is_allocation_record(MEMFLAGS flags) {
+    return (flags & tag_masks) == tag_alloc;
+  }
+
+  inline static bool is_deallocation_record(MEMFLAGS flags) {
+    return (flags & tag_masks) == tag_release;
+  }
+
+  inline static bool is_arena_record(MEMFLAGS flags) {
+    return (flags & (otArena | tag_size)) == otArena;
+  }
+
+  inline static bool is_arena_size_record(MEMFLAGS flags) {
+    return (flags & (otArena | tag_size)) == (otArena | tag_size);
+  }
+
+  inline static bool is_virtual_memory_record(MEMFLAGS flags) {
+    return (flags & vmBit) != 0;
+  }
+
+  inline static bool is_virtual_memory_reserve_record(MEMFLAGS flags) {
+    return (flags & 0x0F) == (tag_alloc | vmBit);
+  }
+
+  inline static bool is_virtual_memory_commit_record(MEMFLAGS flags) {
+    return (flags & 0x0F) == (tag_commit | vmBit);
+  }
+
+  inline static bool is_virtual_memory_uncommit_record(MEMFLAGS flags) {
+    return (flags & 0x0F) == (tag_uncommit | vmBit);
+  }
+
+  inline static bool is_virtual_memory_release_record(MEMFLAGS flags) {
+    return (flags & 0x0F) == (tag_release | vmBit);
+  }
+
+  inline static bool is_virtual_memory_type_record(MEMFLAGS flags) {
+    return (flags & 0x0F) == (tag_type | vmBit);
+  }
+
+  /* tagging flags */
+  inline static MEMFLAGS malloc_tag()                 { return tag_alloc;   }
+  inline static MEMFLAGS free_tag()                   { return tag_release; }
+  inline static MEMFLAGS arena_size_tag()             { return tag_size | otArena; }
+  inline static MEMFLAGS virtual_memory_tag()         { return vmBit; }
+  inline static MEMFLAGS virtual_memory_reserve_tag() { return (tag_alloc | vmBit); }
+  inline static MEMFLAGS virtual_memory_commit_tag()  { return (tag_commit | vmBit); }
+  inline static MEMFLAGS virtual_memory_uncommit_tag(){ return (tag_uncommit | vmBit); }
+  inline static MEMFLAGS virtual_memory_release_tag() { return (tag_release | vmBit); }
+  inline static MEMFLAGS virtual_memory_type_tag()    { return (tag_type | vmBit); }
+
+ public:
+  MemPointerRecord(): _size(0), _flags(mtNone) { }
+
+  MemPointerRecord(address addr, MEMFLAGS memflags, size_t size = 0):
+      MemPointer(addr), _flags(memflags), _size(size) { }
+
+  MemPointerRecord(const MemPointerRecord& copy_from):
+    MemPointer(copy_from), _flags(copy_from.flags()),
+    _size(copy_from.size()) {
+  }
+
+  /* MemPointerRecord is not sequenced, it always return
+   * 0 to indicate non-sequenced
+   */
+  virtual jint seq() const               { return 0; }
+
+  inline size_t   size()  const          { return _size; }
+  inline void set_size(size_t size)      { _size = size; }
+
+  inline MEMFLAGS flags() const          { return _flags; }
+  inline void set_flags(MEMFLAGS flags)  { _flags = flags; }
+
+  MemPointerRecord& operator= (const MemPointerRecord& ptr) {
+    MemPointer::operator=(ptr);
+    _flags = ptr.flags();
+#ifdef ASSERT
+    if (IS_ARENA_OBJ(_flags)) {
+      assert(!is_vm_pointer(), "wrong flags");
+      assert((_flags & ot_masks) == otArena, "wrong flags");
+    }
+#endif
+    _size = ptr.size();
+    return *this;
+  }
+
+  // if the pointer represents a malloc-ed memory address
+  inline bool is_malloced_pointer() const {
+    return !is_vm_pointer();
+  }
+
+  // if the pointer represents a virtual memory address
+  inline bool is_vm_pointer() const {
+    return is_virtual_memory_record(_flags);
+  }
+
+  // if this record records a 'malloc' or virtual memory
+  // 'reserve' call
+  inline bool is_allocation_record() const {
+    return is_allocation_record(_flags);
+  }
+
+  // if this record records a size information of an arena
+  inline bool is_arena_size_record() const {
+    return is_arena_size_record(_flags);
+  }
+
+  // if this pointer represents an address to an arena object
+  inline bool is_arena_record() const {
+    return is_arena_record(_flags);
+  }
+
+  // if this record represents a size information of specific arena
+  inline bool is_size_record_of_arena(const MemPointerRecord* arena_rc) {
+    assert(is_arena_size_record(), "not size record");
+    assert(arena_rc->is_arena_record(), "not arena record");
+    return (arena_rc->addr() + sizeof(void*)) == addr();
+  }
+
+  // if this record records a 'free' or virtual memory 'free' call
+  inline bool is_deallocation_record() const {
+    return is_deallocation_record(_flags);
+  }
+
+  // if this record records a virtual memory 'commit' call
+  inline bool is_commit_record() const {
+    return is_virtual_memory_commit_record(_flags);
+  }
+
+  // if this record records a virtual memory 'uncommit' call
+  inline bool is_uncommit_record() const {
+    return is_virtual_memory_uncommit_record(_flags);
+  }
+
+  // if this record is a tagging record of a virtual memory block
+  inline bool is_type_tagging_record() const {
+    return is_virtual_memory_type_record(_flags);
+  }
+};
+
+// MemPointerRecordEx also records callsite pc, from where
+// the memory block is allocated
+class MemPointerRecordEx : public MemPointerRecord {
+ private:
+  address      _pc;  // callsite pc
+
+ public:
+  MemPointerRecordEx(): _pc(0) { }
+
+  MemPointerRecordEx(address addr, MEMFLAGS memflags, size_t size = 0, address pc = 0):
+    MemPointerRecord(addr, memflags, size), _pc(pc) {}
+
+  MemPointerRecordEx(const MemPointerRecordEx& copy_from):
+    MemPointerRecord(copy_from), _pc(copy_from.pc()) {}
+
+  inline address pc() const { return _pc; }
+
+  void init(const MemPointerRecordEx* mpe) {
+    MemPointerRecord::operator=(*mpe);
+    _pc = mpe->pc();
+  }
+
+  void init(const MemPointerRecord* mp) {
+    MemPointerRecord::operator=(*mp);
+    _pc = 0;
+  }
+};
+
+// a virtual memory region
+class VMMemRegion : public MemPointerRecord {
+ private:
+  // committed size
+  size_t       _committed_size;
+
+public:
+  VMMemRegion(): _committed_size(0) { }
+
+  void init(const MemPointerRecord* mp) {
+    assert(mp->is_vm_pointer(), "not virtual memory pointer");
+    _addr = mp->addr();
+    if (mp->is_commit_record() || mp->is_uncommit_record()) {
+      _committed_size = mp->size();
+      set_size(_committed_size);
+    } else {
+      set_size(mp->size());
+      _committed_size = 0;
+    }
+    set_flags(mp->flags());
+  }
+
+  VMMemRegion& operator=(const VMMemRegion& other) {
+    MemPointerRecord::operator=(other);
+    _committed_size = other.committed_size();
+    return *this;
+  }
+
+  inline bool is_reserve_record() const {
+    return is_virtual_memory_reserve_record(flags());
+  }
+
+  inline bool is_release_record() const {
+    return is_virtual_memory_release_record(flags());
+  }
+
+  // resize reserved VM range
+  inline void set_reserved_size(size_t new_size) {
+    assert(new_size >= committed_size(), "resize");
+    set_size(new_size);
+  }
+
+  inline void commit(size_t size) {
+    _committed_size += size;
+  }
+
+  inline void uncommit(size_t size) {
+    if (_committed_size >= size) {
+      _committed_size -= size;
+    } else {
+      _committed_size = 0;
+    }
+  }
+
+  /*
+   * if this virtual memory range covers whole range of
+   * the other VMMemRegion
+   */
+  bool contains(const VMMemRegion* mr) const;
+
+  /* base address of this virtual memory range */
+  inline address base() const {
+    return addr();
+  }
+
+  /* tag this virtual memory range to the specified memory type */
+  inline void tag(MEMFLAGS f) {
+    set_flags(flags() | (f & mt_masks));
+  }
+
+  // release part of memory range
+  inline void partial_release(address add, size_t sz) {
+    assert(add >= addr() && add < addr() + size(), "not valid address");
+    // for now, it can partially release from the both ends,
+    // but not in the middle
+    assert(add == addr() || (add + sz) == (addr() + size()),
+      "release in the middle");
+    if (add == addr()) {
+      set_addr(add + sz);
+      set_size(size() - sz);
+    } else {
+      set_size(size() - sz);
+    }
+  }
+
+  // the committed size of the virtual memory block
+  inline size_t committed_size() const {
+    return _committed_size;
+  }
+
+  // the reserved size of the virtual memory block
+  inline size_t reserved_size() const {
+    return size();
+  }
+};
+
+class VMMemRegionEx : public VMMemRegion {
+ private:
+  jint   _seq;  // sequence number
+
+ public:
+  VMMemRegionEx(): _pc(0) { }
+
+  void init(const MemPointerRecordEx* mpe) {
+    VMMemRegion::init(mpe);
+    _pc = mpe->pc();
+  }
+
+  void init(const MemPointerRecord* mpe) {
+    VMMemRegion::init(mpe);
+    _pc = 0;
+  }
+
+  VMMemRegionEx& operator=(const VMMemRegionEx& other) {
+    VMMemRegion::operator=(other);
+    _pc = other.pc();
+    return *this;
+  }
+
+  inline address pc() const { return _pc; }
+ private:
+  address   _pc;
+};
+
+/*
+ * Sequenced memory record
+ */
+class SeqMemPointerRecord : public MemPointerRecord {
+ private:
+   jint _seq;  // sequence number
+
+ public:
+  SeqMemPointerRecord(): _seq(0){ }
+
+  SeqMemPointerRecord(address addr, MEMFLAGS flags, size_t size)
+    : MemPointerRecord(addr, flags, size) {
+    _seq = SequenceGenerator::next();
+  }
+
+  SeqMemPointerRecord(const SeqMemPointerRecord& copy_from)
+    : MemPointerRecord(copy_from) {
+    _seq = copy_from.seq();
+  }
+
+  SeqMemPointerRecord& operator= (const SeqMemPointerRecord& ptr) {
+    MemPointerRecord::operator=(ptr);
+    _seq = ptr.seq();
+    return *this;
+  }
+
+  inline jint seq() const {
+    return _seq;
+  }
+};
+
+
+
+class SeqMemPointerRecordEx : public MemPointerRecordEx {
+ private:
+  jint    _seq;  // sequence number
+
+ public:
+  SeqMemPointerRecordEx(): _seq(0) { }
+
+  SeqMemPointerRecordEx(address addr, MEMFLAGS flags, size_t size,
+    address pc): MemPointerRecordEx(addr, flags, size, pc) {
+    _seq = SequenceGenerator::next();
+  }
+
+  SeqMemPointerRecordEx(const SeqMemPointerRecordEx& copy_from)
+    : MemPointerRecordEx(copy_from) {
+    _seq = copy_from.seq();
+  }
+
+  SeqMemPointerRecordEx& operator= (const SeqMemPointerRecordEx& ptr) {
+    MemPointerRecordEx::operator=(ptr);
+    _seq = ptr.seq();
+    return *this;
+  }
+
+  inline jint seq() const {
+    return _seq;
+  }
+};
+
+#endif // SHARE_VM_SERVICES_MEM_PTR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/services/memPtrArray.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,310 @@
+/*
+ * 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.
+ *
+ */
+#ifndef SHARE_VM_UTILITIES_MEM_PTR_ARRAY_HPP
+#define SHARE_VM_UTILITIES_MEM_PTR_ARRAY_HPP
+
+#include "memory/allocation.hpp"
+#include "services/memPtr.hpp"
+
+class MemPtr;
+class MemRecorder;
+class ArenaInfo;
+class MemSnapshot;
+
+extern "C" {
+  typedef int (*FN_SORT)(const void *, const void *);
+}
+
+
+// Memory pointer array interface. This array is used by NMT to hold
+// various memory block information.
+// The memory pointer arrays are usually walked with their iterators.
+
+class MemPointerArray : public CHeapObj<mtNMT> {
+ public:
+  virtual ~MemPointerArray() { }
+
+  // return true if it can not allocate storage for the data
+  virtual bool out_of_memory() const = 0;
+  virtual bool is_empty() const = 0;
+  virtual bool is_full() = 0;
+  virtual int  length() const = 0;
+  virtual void clear() = 0;
+  virtual bool append(MemPointer* ptr) = 0;
+  virtual bool insert_at(MemPointer* ptr, int pos) = 0;
+  virtual bool remove_at(int pos) = 0;
+  virtual MemPointer* at(int index) const = 0;
+  virtual void sort(FN_SORT fn) = 0;
+  virtual size_t instance_size() const = 0;
+  virtual bool shrink() = 0;
+
+  debug_only(virtual int capacity() const = 0;)
+};
+
+// Iterator interface
+class MemPointerArrayIterator VALUE_OBJ_CLASS_SPEC {
+ public:
+  // return the pointer at current position
+  virtual MemPointer* current() const = 0;
+  // return the next pointer and advance current position
+  virtual MemPointer* next() = 0;
+  // return next pointer without advancing current position
+  virtual MemPointer* peek_next() const = 0;
+  // return previous pointer without changing current position
+  virtual MemPointer* peek_prev() const = 0;
+  // remove the pointer at current position
+  virtual void        remove() = 0;
+  // insert the pointer at current position
+  virtual bool        insert(MemPointer* ptr) = 0;
+  // insert specified element after current position and
+  // move current position to newly inserted position
+  virtual bool        insert_after(MemPointer* ptr) = 0;
+};
+
+// implementation class
+class MemPointerArrayIteratorImpl : public MemPointerArrayIterator {
+#ifdef ASSERT
+ protected:
+#else
+ private:
+#endif
+  MemPointerArray*  _array;
+  int               _pos;
+
+ public:
+  MemPointerArrayIteratorImpl(MemPointerArray* arr) {
+    assert(arr != NULL, "Parameter check");
+    _array = arr;
+    _pos = 0;
+  }
+
+  virtual MemPointer* current() const {
+    if (_pos < _array->length()) {
+      return _array->at(_pos);
+    }
+    return NULL;
+  }
+
+  virtual MemPointer* next() {
+    if (_pos + 1 < _array->length()) {
+      return _array->at(++_pos);
+    }
+    _pos = _array->length();
+    return NULL;
+  }
+
+  virtual MemPointer* peek_next() const {
+    if (_pos + 1 < _array->length()) {
+      return _array->at(_pos + 1);
+    }
+    return NULL;
+  }
+
+  virtual MemPointer* peek_prev() const {
+    if (_pos > 0) {
+      return _array->at(_pos - 1);
+    }
+    return NULL;
+  }
+
+  virtual void remove() {
+    if (_pos < _array->length()) {
+      _array->remove_at(_pos);
+    }
+  }
+
+  virtual bool insert(MemPointer* ptr) {
+    return _array->insert_at(ptr, _pos);
+  }
+
+  virtual bool insert_after(MemPointer* ptr) {
+    if (_array->insert_at(ptr, _pos + 1)) {
+      _pos ++;
+      return true;
+    }
+    return false;
+  }
+};
+
+
+
+// Memory pointer array implementation.
+// This implementation implements expandable array
+#define DEFAULT_PTR_ARRAY_SIZE 1024
+
+template <class E> class MemPointerArrayImpl : public MemPointerArray {
+ private:
+  int                   _max_size;
+  int                   _size;
+  bool                  _init_elements;
+  E*                    _data;
+
+ public:
+  MemPointerArrayImpl(int initial_size = DEFAULT_PTR_ARRAY_SIZE, bool init_elements = true):
+   _max_size(initial_size), _size(0), _init_elements(init_elements) {
+    _data = (E*)raw_allocate(sizeof(E), initial_size);
+    if (_init_elements) {
+      for (int index = 0; index < _max_size; index ++) {
+        ::new ((void*)&_data[index]) E();
+      }
+    }
+  }
+
+  virtual ~MemPointerArrayImpl() {
+    if (_data != NULL) {
+      raw_free(_data);
+    }
+  }
+
+ public:
+  bool out_of_memory() const {
+    return (_data == NULL);
+  }
+
+  size_t instance_size() const {
+    return sizeof(MemPointerArrayImpl<E>) + _max_size * sizeof(E);
+  }
+
+  bool is_empty() const {
+    assert(_data != NULL, "Just check");
+    return _size == 0;
+  }
+
+  bool is_full() {
+    assert(_data != NULL, "Just check");
+    if (_size < _max_size) {
+      return false;
+    } else {
+      return !expand_array();
+    }
+  }
+
+  int length() const {
+    assert(_data != NULL, "Just check");
+    return _size;
+  }
+
+  debug_only(int capacity() const { return _max_size; })
+
+  void clear() {
+    assert(_data != NULL, "Just check");
+    _size = 0;
+  }
+
+  bool append(MemPointer* ptr) {
+    assert(_data != NULL, "Just check");
+    if (is_full()) {
+      return false;
+    }
+    _data[_size ++] = *(E*)ptr;
+    return true;
+  }
+
+  bool insert_at(MemPointer* ptr, int pos) {
+    assert(_data != NULL, "Just check");
+    if (is_full()) {
+      return false;
+    }
+    for (int index = _size; index > pos; index --) {
+      _data[index] = _data[index - 1];
+    }
+    _data[pos] = *(E*)ptr;
+    _size ++;
+    return true;
+  }
+
+  bool remove_at(int pos) {
+    assert(_data != NULL, "Just check");
+    if (_size <= pos && pos >= 0) {
+      return false;
+    }
+    -- _size;
+
+    for (int index = pos; index < _size; index ++) {
+      _data[index] = _data[index + 1];
+    }
+    return true;
+  }
+
+  MemPointer* at(int index) const {
+    assert(_data != NULL, "Just check");
+    assert(index >= 0 && index < _size, "illegal index");
+    return &_data[index];
+  }
+
+  bool shrink() {
+    float used = ((float)_size) / ((float)_max_size);
+    if (used < 0.40) {
+      E* old_ptr = _data;
+      int new_size = ((_max_size) / (2 * DEFAULT_PTR_ARRAY_SIZE) + 1) * DEFAULT_PTR_ARRAY_SIZE;
+      _data = (E*)raw_reallocate(_data, sizeof(E), new_size);
+      if (_data == NULL) {
+        _data = old_ptr;
+        return false;
+      } else {
+        _max_size = new_size;
+        return true;
+      }
+    }
+    return false;
+  }
+
+  void sort(FN_SORT fn) {
+    assert(_data != NULL, "Just check");
+    qsort((void*)_data, _size, sizeof(E), fn);
+  }
+
+ private:
+  bool  expand_array() {
+    assert(_data != NULL, "Not yet allocated");
+    E* old_ptr = _data;
+    if ((_data = (E*)raw_reallocate((void*)_data, sizeof(E),
+      _max_size + DEFAULT_PTR_ARRAY_SIZE)) == NULL) {
+      _data = old_ptr;
+      return false;
+    } else {
+      _max_size += DEFAULT_PTR_ARRAY_SIZE;
+      if (_init_elements) {
+        for (int index = _size; index < _max_size; index ++) {
+          ::new ((void*)&_data[index]) E();
+        }
+      }
+      return true;
+    }
+  }
+
+  void* raw_allocate(size_t elementSize, int items) {
+    return os::malloc(elementSize * items, mtNMT);
+  }
+
+  void* raw_reallocate(void* ptr, size_t elementSize, int items) {
+    return os::realloc(ptr, elementSize * items, mtNMT);
+  }
+
+  void  raw_free(void* ptr) {
+    os::free(ptr, mtNMT);
+  }
+};
+
+#endif // SHARE_VM_UTILITIES_MEM_PTR_ARRAY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/services/memRecorder.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,160 @@
+/*
+ * 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.
+ *
+ */
+
+#include "precompiled.hpp"
+
+#include "runtime/atomic.hpp"
+#include "services/memBaseline.hpp"
+#include "services/memRecorder.hpp"
+#include "services/memPtr.hpp"
+#include "services/memTracker.hpp"
+
+MemPointer* SequencedRecordIterator::next_record() {
+  MemPointer* itr_cur = _itr.current();
+  if (itr_cur == NULL) return NULL;
+  MemPointer* itr_next = _itr.next();
+
+  while (itr_next != NULL &&
+    same_kind((MemPointerRecord*)itr_cur, (MemPointerRecord*)itr_next)) {
+    itr_cur = itr_next;
+    itr_next = _itr.next();
+  }
+
+  return itr_cur;
+}
+
+
+volatile jint MemRecorder::_instance_count = 0;
+
+MemRecorder::MemRecorder() {
+  assert(MemTracker::is_on(), "Native memory tracking is off");
+  Atomic::inc(&_instance_count);
+  debug_only(set_generation();)
+
+  if (MemTracker::track_callsite()) {
+    _pointer_records = new (std::nothrow)FixedSizeMemPointerArray<SeqMemPointerRecordEx,
+        DEFAULT_RECORDER_PTR_ARRAY_SIZE>();
+  } else {
+    _pointer_records = new (std::nothrow)FixedSizeMemPointerArray<SeqMemPointerRecord,
+        DEFAULT_RECORDER_PTR_ARRAY_SIZE>();
+  }
+  _next = NULL;
+
+
+  if (_pointer_records != NULL) {
+    // recode itself
+    record((address)this, (MemPointerRecord::malloc_tag()|mtNMT|otNMTRecorder),
+        sizeof(MemRecorder), CALLER_PC);
+    record((address)_pointer_records, (MemPointerRecord::malloc_tag()|mtNMT|otNMTRecorder),
+        _pointer_records->instance_size(),CURRENT_PC);
+  }
+}
+
+MemRecorder::~MemRecorder() {
+  if (_pointer_records != NULL) {
+    if (MemTracker::is_on()) {
+      MemTracker::record_free((address)_pointer_records, mtNMT);
+      MemTracker::record_free((address)this, mtNMT);
+    }
+    delete _pointer_records;
+  }
+  if (_next != NULL) {
+    delete _next;
+  }
+
+  Atomic::dec(&_instance_count);
+}
+
+// Sorting order:
+//   1. memory block address
+//   2. mem pointer record tags
+//   3. sequence number
+int MemRecorder::sort_record_fn(const void* e1, const void* e2) {
+  const MemPointerRecord* p1 = (const MemPointerRecord*)e1;
+  const MemPointerRecord* p2 = (const MemPointerRecord*)e2;
+  int delta = UNSIGNED_COMPARE(p1->addr(), p2->addr());
+  if (delta == 0) {
+    int df = UNSIGNED_COMPARE((p1->flags() & MemPointerRecord::tag_masks),
+                              (p2->flags() & MemPointerRecord::tag_masks));
+    if (df == 0) {
+      assert(p1->seq() != p2->seq(), "dup seq");
+      return p1->seq() - p2->seq();
+    } else {
+      return df;
+    }
+  } else {
+    return delta;
+  }
+}
+
+bool MemRecorder::record(address p, MEMFLAGS flags, size_t size, address pc) {
+#ifdef ASSERT
+  if (MemPointerRecord::is_virtual_memory_record(flags)) {
+    assert((flags & MemPointerRecord::tag_masks) != 0, "bad virtual memory record");
+  } else {
+    assert((flags & MemPointerRecord::tag_masks) == MemPointerRecord::malloc_tag() ||
+           (flags & MemPointerRecord::tag_masks) == MemPointerRecord::free_tag() ||
+           IS_ARENA_OBJ(flags),
+           "bad malloc record");
+  }
+  // a recorder should only hold records within the same generation
+  unsigned long cur_generation = SequenceGenerator::current_generation();
+  assert(cur_generation == _generation,
+         "this thread did not enter sync point");
+#endif
+
+  if (MemTracker::track_callsite()) {
+    SeqMemPointerRecordEx ap(p, flags, size, pc);
+    debug_only(check_dup_seq(ap.seq());)
+    return _pointer_records->append(&ap);
+  } else {
+    SeqMemPointerRecord ap(p, flags, size);
+    debug_only(check_dup_seq(ap.seq());)
+    return _pointer_records->append(&ap);
+  }
+}
+
+  // iterator for alloc pointers
+SequencedRecordIterator MemRecorder::pointer_itr() {
+  assert(_pointer_records != NULL, "just check");
+  _pointer_records->sort((FN_SORT)sort_record_fn);
+  return SequencedRecordIterator(_pointer_records);
+}
+
+
+#ifdef ASSERT
+void MemRecorder::set_generation() {
+  _generation = SequenceGenerator::current_generation();
+}
+
+void MemRecorder::check_dup_seq(jint seq) const {
+  MemPointerArrayIteratorImpl itr(_pointer_records);
+  MemPointerRecord* rc = (MemPointerRecord*)itr.current();
+  while (rc != NULL) {
+    assert(rc->seq() != seq, "dup seq");
+    rc = (MemPointerRecord*)itr.next();
+  }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/services/memRecorder.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,267 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_SERVICES_MEM_RECORDER_HPP
+#define SHARE_VM_SERVICES_MEM_RECORDER_HPP
+
+#include "memory/allocation.hpp"
+#include "runtime/os.hpp"
+#include "services/memPtrArray.hpp"
+
+class MemSnapshot;
+class MemTracker;
+class MemTrackWorker;
+
+// Fixed size memory pointer array implementation
+template <class E, int SIZE> class FixedSizeMemPointerArray :
+  public MemPointerArray {
+  // This implementation is for memory recorder only
+  friend class MemRecorder;
+
+ private:
+  E      _data[SIZE];
+  int    _size;
+
+ protected:
+  FixedSizeMemPointerArray(bool init_elements = false):
+   _size(0){
+    if (init_elements) {
+      for (int index = 0; index < SIZE; index ++) {
+        ::new ((void*)&_data[index]) E();
+      }
+    }
+  }
+
+  void* operator new(size_t size, const std::nothrow_t& nothrow_constant) {
+    // the instance is part of memRecorder, needs to be tagged with 'otNMTRecorder'
+    // to avoid recursion
+    return os::malloc(size, (mtNMT | otNMTRecorder));
+  }
+
+  void* operator new(size_t size) {
+    assert(false, "use nothrow version");
+    return NULL;
+  }
+
+  void operator delete(void* p) {
+    os::free(p, (mtNMT | otNMTRecorder));
+  }
+
+  // instance size
+  inline size_t instance_size() const {
+    return sizeof(FixedSizeMemPointerArray<E, SIZE>);
+  }
+
+  debug_only(int capacity() const { return SIZE; })
+
+ public:
+  // implementation of public interface
+  bool out_of_memory() const { return false; }
+  bool is_empty()      const { return _size == 0; }
+  bool is_full()             { return length() >= SIZE; }
+  int  length()        const { return _size; }
+
+  void clear() {
+    _size = 0;
+  }
+
+  bool append(MemPointer* ptr) {
+    if (is_full()) return false;
+    _data[_size ++] = *(E*)ptr;
+    return true;
+  }
+
+  virtual bool insert_at(MemPointer* p, int pos) {
+    assert(false, "append only");
+    return false;
+  }
+
+  virtual bool remove_at(int pos) {
+    assert(false, "not supported");
+    return false;
+  }
+
+  MemPointer* at(int index) const {
+    assert(index >= 0 && index < length(),
+      "parameter check");
+    return ((E*)&_data[index]);
+  }
+
+  void sort(FN_SORT fn) {
+    qsort((void*)_data, _size, sizeof(E), fn);
+  }
+
+  bool shrink() {
+    return false;
+  }
+};
+
+
+// This iterator requires pre-sorted MemPointerArray, which is sorted by:
+//  1. address
+//  2. allocation type
+//  3. sequence number
+// During the array walking, iterator collapses pointers with the same
+// address and allocation type, and only returns the one with highest
+// sequence number.
+//
+// This is read-only iterator, update methods are asserted.
+class SequencedRecordIterator : public MemPointerArrayIterator {
+ private:
+   MemPointerArrayIteratorImpl _itr;
+   MemPointer*                 _cur;
+
+ public:
+  SequencedRecordIterator(const MemPointerArray* arr):
+    _itr(const_cast<MemPointerArray*>(arr)) {
+    _cur = next_record();
+  }
+
+  SequencedRecordIterator(const SequencedRecordIterator& itr):
+    _itr(itr._itr) {
+    _cur = next_record();
+  }
+
+  // return the pointer at current position
+  virtual MemPointer* current() const {
+    return _cur;
+  };
+
+  // return the next pointer and advance current position
+  virtual MemPointer* next() {
+    _cur = next_record();
+    return _cur;
+  }
+
+  // return the next pointer without advancing current position
+  virtual MemPointer* peek_next() const {
+    assert(false, "not implemented");
+    return NULL;
+
+  }
+  // return the previous pointer without changing current position
+  virtual MemPointer* peek_prev() const {
+    assert(false, "not implemented");
+    return NULL;
+  }
+
+  // remove the pointer at current position
+  virtual void remove() {
+    assert(false, "read-only iterator");
+  };
+  // insert the pointer at current position
+  virtual bool insert(MemPointer* ptr) {
+    assert(false, "read-only iterator");
+    return false;
+  }
+
+  virtual bool insert_after(MemPointer* ptr) {
+    assert(false, "read-only iterator");
+    return false;
+  }
+ private:
+  // collapse the 'same kind' of records, and return this 'kind' of
+  // record with highest sequence number
+  MemPointer* next_record();
+
+  // Test if the two records are the same kind: the same memory block and allocation
+  // type.
+  inline bool same_kind(const MemPointerRecord* p1, const MemPointerRecord* p2) const {
+    return (p1->addr() == p2->addr() &&
+      (p1->flags() &MemPointerRecord::tag_masks) ==
+      (p2->flags() & MemPointerRecord::tag_masks));
+  }
+};
+
+
+
+#define DEFAULT_RECORDER_PTR_ARRAY_SIZE 512
+
+class MemRecorder : public CHeapObj<mtNMT|otNMTRecorder> {
+  friend class MemSnapshot;
+  friend class MemTracker;
+  friend class MemTrackWorker;
+
+ protected:
+  // the array that holds memory records
+  MemPointerArray*         _pointer_records;
+
+ private:
+  // used for linked list
+  MemRecorder*             _next;
+  // active recorder can only record a certain generation data
+  debug_only(unsigned long _generation;)
+
+ protected:
+  _NOINLINE_ MemRecorder();
+  ~MemRecorder();
+
+  // record a memory operation
+  bool record(address addr, MEMFLAGS flags, size_t size, address caller_pc = 0);
+
+  // linked list support
+  inline void set_next(MemRecorder* rec) {
+    _next = rec;
+  }
+
+  inline MemRecorder* next() const {
+    return _next;
+  }
+
+  // if the recorder is full
+  inline bool is_full() const {
+    assert(_pointer_records != NULL, "just check");
+    return _pointer_records->is_full();
+  }
+
+  // if running out of memory when initializing recorder's internal
+  // data
+  inline bool out_of_memory() const {
+    return (_pointer_records == NULL ||
+      _pointer_records->out_of_memory());
+  }
+
+  inline void clear() {
+    assert(_pointer_records != NULL, "Just check");
+    _pointer_records->clear();
+  }
+
+  SequencedRecordIterator pointer_itr();
+
+ protected:
+  // number of MemRecorder instance
+  static volatile jint _instance_count;
+
+ private:
+  // sorting function, sort records into following order
+  // 1. memory address
+  // 2. allocation type
+  // 3. sequence number
+  static int sort_record_fn(const void* e1, const void* e2);
+
+  debug_only(void check_dup_seq(jint seq) const;)
+  debug_only(void set_generation();)
+};
+
+#endif // SHARE_VM_SERVICES_MEM_RECORDER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/services/memReporter.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,560 @@
+/*
+ * 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.
+ *
+ */
+#include "precompiled.hpp"
+#include "classfile/systemDictionary.hpp"
+#include "runtime/os.hpp"
+#include "services/memReporter.hpp"
+#include "services/memPtrArray.hpp"
+#include "services/memTracker.hpp"
+
+const char* BaselineOutputer::memory_unit(size_t scale) {
+  switch(scale) {
+    case K: return "KB";
+    case M: return "MB";
+    case G: return "GB";
+  }
+  ShouldNotReachHere();
+  return NULL;
+}
+
+
+void BaselineReporter::report_baseline(const MemBaseline& baseline, bool summary_only) {
+  assert(MemTracker::is_on(), "Native memory tracking is off");
+  _outputer.start(scale());
+  _outputer.total_usage(
+    amount_in_current_scale(baseline.total_malloc_amount() + baseline.total_reserved_amount()),
+    amount_in_current_scale(baseline.total_malloc_amount() + baseline.total_committed_amount()));
+
+  _outputer.num_of_classes(baseline.number_of_classes());
+  _outputer.num_of_threads(baseline.number_of_threads());
+
+  report_summaries(baseline);
+  if (!summary_only && MemTracker::track_callsite()) {
+    report_callsites(baseline);
+  }
+  _outputer.done();
+}
+
+void BaselineReporter::report_summaries(const MemBaseline& baseline) {
+  _outputer.start_category_summary();
+  MEMFLAGS type;
+
+  for (int index = 0; index < NUMBER_OF_MEMORY_TYPE; index ++) {
+    type = MemBaseline::MemType2NameMap[index]._flag;
+    _outputer.category_summary(type,
+      amount_in_current_scale(baseline.reserved_amount(type)),
+      amount_in_current_scale(baseline.committed_amount(type)),
+      amount_in_current_scale(baseline.malloc_amount(type)),
+      baseline.malloc_count(type),
+      amount_in_current_scale(baseline.arena_amount(type)),
+      baseline.arena_count(type));
+  }
+
+  _outputer.done_category_summary();
+}
+
+void BaselineReporter::report_callsites(const MemBaseline& baseline) {
+  _outputer.start_callsite();
+  MemBaseline* pBL = const_cast<MemBaseline*>(&baseline);
+
+  pBL->_malloc_cs->sort((FN_SORT)MemBaseline::bl_malloc_sort_by_size);
+  pBL->_vm_cs->sort((FN_SORT)MemBaseline::bl_vm_sort_by_size);
+
+  // walk malloc callsites
+  MemPointerArrayIteratorImpl malloc_itr(pBL->_malloc_cs);
+  MallocCallsitePointer*      malloc_callsite =
+                  (MallocCallsitePointer*)malloc_itr.current();
+  while (malloc_callsite != NULL) {
+    _outputer.malloc_callsite(malloc_callsite->addr(),
+        amount_in_current_scale(malloc_callsite->amount()), malloc_callsite->count());
+    malloc_callsite = (MallocCallsitePointer*)malloc_itr.next();
+  }
+
+  // walk virtual memory callsite
+  MemPointerArrayIteratorImpl vm_itr(pBL->_vm_cs);
+  VMCallsitePointer*          vm_callsite = (VMCallsitePointer*)vm_itr.current();
+  while (vm_callsite != NULL) {
+    _outputer.virtual_memory_callsite(vm_callsite->addr(),
+      amount_in_current_scale(vm_callsite->reserved_amount()),
+      amount_in_current_scale(vm_callsite->committed_amount()));
+    vm_callsite = (VMCallsitePointer*)vm_itr.next();
+  }
+  pBL->_malloc_cs->sort((FN_SORT)MemBaseline::bl_malloc_sort_by_pc);
+  pBL->_vm_cs->sort((FN_SORT)MemBaseline::bl_vm_sort_by_pc);
+  _outputer.done_callsite();
+}
+
+void BaselineReporter::diff_baselines(const MemBaseline& cur, const MemBaseline& prev,
+  bool summary_only) {
+  assert(MemTracker::is_on(), "Native memory tracking is off");
+  _outputer.start(scale());
+  size_t total_reserved = cur.total_malloc_amount() + cur.total_reserved_amount();
+  size_t total_committed = cur.total_malloc_amount() + cur.total_committed_amount();
+
+  _outputer.diff_total_usage(
+    amount_in_current_scale(total_reserved), amount_in_current_scale(total_committed),
+    diff_in_current_scale(total_reserved,  (prev.total_malloc_amount() + prev.total_reserved_amount())),
+    diff_in_current_scale(total_committed, (prev.total_committed_amount() + prev.total_malloc_amount())));
+
+  _outputer.diff_num_of_classes(cur.number_of_classes(),
+       diff(cur.number_of_classes(), prev.number_of_classes()));
+  _outputer.diff_num_of_threads(cur.number_of_threads(),
+       diff(cur.number_of_threads(), prev.number_of_threads()));
+
+  diff_summaries(cur, prev);
+  if (!summary_only && MemTracker::track_callsite()) {
+    diff_callsites(cur, prev);
+  }
+  _outputer.done();
+}
+
+void BaselineReporter::diff_summaries(const MemBaseline& cur, const MemBaseline& prev) {
+  _outputer.start_category_summary();
+  MEMFLAGS type;
+
+  for (int index = 0; index < NUMBER_OF_MEMORY_TYPE; index ++) {
+    type = MemBaseline::MemType2NameMap[index]._flag;
+    _outputer.diff_category_summary(type,
+      amount_in_current_scale(cur.reserved_amount(type)),
+      amount_in_current_scale(cur.committed_amount(type)),
+      amount_in_current_scale(cur.malloc_amount(type)),
+      cur.malloc_count(type),
+      amount_in_current_scale(cur.arena_amount(type)),
+      cur.arena_count(type),
+      diff_in_current_scale(cur.reserved_amount(type), prev.reserved_amount(type)),
+      diff_in_current_scale(cur.committed_amount(type), prev.committed_amount(type)),
+      diff_in_current_scale(cur.malloc_amount(type), prev.malloc_amount(type)),
+      diff(cur.malloc_count(type), prev.malloc_count(type)),
+      diff_in_current_scale(cur.arena_amount(type), prev.arena_amount(type)),
+      diff(cur.arena_count(type), prev.arena_count(type)));
+  }
+
+  _outputer.done_category_summary();
+}
+
+void BaselineReporter::diff_callsites(const MemBaseline& cur, const MemBaseline& prev) {
+  _outputer.start_callsite();
+  MemBaseline* pBL_cur = const_cast<MemBaseline*>(&cur);
+  MemBaseline* pBL_prev = const_cast<MemBaseline*>(&prev);
+
+  // walk malloc callsites
+  MemPointerArrayIteratorImpl cur_malloc_itr(pBL_cur->_malloc_cs);
+  MemPointerArrayIteratorImpl prev_malloc_itr(pBL_prev->_malloc_cs);
+
+  MallocCallsitePointer*      cur_malloc_callsite =
+                  (MallocCallsitePointer*)cur_malloc_itr.current();
+  MallocCallsitePointer*      prev_malloc_callsite =
+                  (MallocCallsitePointer*)prev_malloc_itr.current();
+
+  while (cur_malloc_callsite != NULL || prev_malloc_callsite != NULL) {
+    if (prev_malloc_callsite == NULL ||
+        cur_malloc_callsite->addr() < prev_malloc_callsite->addr()) {
+      _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(),
+        amount_in_current_scale(cur_malloc_callsite->amount()),
+        cur_malloc_callsite->count(),
+        diff_in_current_scale(cur_malloc_callsite->amount(), 0),
+        diff(cur_malloc_callsite->count(), 0));
+      cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next();
+    } else if (prev_malloc_callsite == NULL ||
+               cur_malloc_callsite->addr() > prev_malloc_callsite->addr()) {
+      _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(),
+        amount_in_current_scale(prev_malloc_callsite->amount()),
+        prev_malloc_callsite->count(),
+        diff_in_current_scale(0, prev_malloc_callsite->amount()),
+        diff(0, prev_malloc_callsite->count()));
+      prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next();
+    } else {  // the same callsite
+      _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(),
+        amount_in_current_scale(cur_malloc_callsite->amount()),
+        cur_malloc_callsite->count(),
+        diff_in_current_scale(cur_malloc_callsite->amount(), prev_malloc_callsite->amount()),
+        diff(cur_malloc_callsite->count(), prev_malloc_callsite->count()));
+      cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next();
+      prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next();
+    }
+  }
+
+  // walk virtual memory callsite
+  MemPointerArrayIteratorImpl cur_vm_itr(pBL_cur->_vm_cs);
+  MemPointerArrayIteratorImpl prev_vm_itr(pBL_prev->_vm_cs);
+  VMCallsitePointer*          cur_vm_callsite = (VMCallsitePointer*)cur_vm_itr.current();
+  VMCallsitePointer*          prev_vm_callsite = (VMCallsitePointer*)prev_vm_itr.current();
+  while (cur_vm_callsite != NULL || prev_vm_callsite != NULL) {
+    if (prev_vm_callsite == NULL || cur_vm_callsite->addr() < prev_vm_callsite->addr()) {
+      _outputer.diff_virtual_memory_callsite(cur_vm_callsite->addr(),
+        amount_in_current_scale(cur_vm_callsite->reserved_amount()),
+        amount_in_current_scale(cur_vm_callsite->committed_amount()),
+        diff_in_current_scale(cur_vm_callsite->reserved_amount(), 0),
+        diff_in_current_scale(cur_vm_callsite->committed_amount(), 0));
+      cur_vm_callsite = (VMCallsitePointer*)cur_vm_itr.next();
+    } else if (cur_vm_callsite == NULL || cur_vm_callsite->addr() > prev_vm_callsite->addr()) {
+      _outputer.diff_virtual_memory_callsite(prev_vm_callsite->addr(),
+        amount_in_current_scale(prev_vm_callsite->reserved_amount()),
+        amount_in_current_scale(prev_vm_callsite->committed_amount()),
+        diff_in_current_scale(0, prev_vm_callsite->reserved_amount()),
+        diff_in_current_scale(0, prev_vm_callsite->committed_amount()));
+      prev_vm_callsite = (VMCallsitePointer*)prev_vm_itr.next();
+    } else { // the same callsite
+      _outputer.diff_virtual_memory_callsite(cur_vm_callsite->addr(),
+        amount_in_current_scale(cur_vm_callsite->reserved_amount()),
+        amount_in_current_scale(cur_vm_callsite->committed_amount()),
+        diff_in_current_scale(cur_vm_callsite->reserved_amount(), prev_vm_callsite->reserved_amount()),
+        diff_in_current_scale(cur_vm_callsite->committed_amount(), prev_vm_callsite->committed_amount()));
+      cur_vm_callsite  = (VMCallsitePointer*)cur_vm_itr.next();
+      prev_vm_callsite = (VMCallsitePointer*)prev_vm_itr.next();
+    }
+  }
+
+  _outputer.done_callsite();
+}
+
+size_t BaselineReporter::amount_in_current_scale(size_t amt) const {
+  return (size_t)(((float)amt/(float)_scale) + 0.5);
+}
+
+int BaselineReporter::diff_in_current_scale(size_t value1, size_t value2) const {
+  return (int)(((float)value1 - (float)value2)/((float)_scale) + 0.5);
+}
+
+int BaselineReporter::diff(size_t value1, size_t value2) const {
+  return ((int)value1 - (int)value2);
+}
+
+void BaselineTTYOutputer::start(size_t scale, bool report_diff) {
+  _scale = scale;
+  _output->print_cr(" ");
+  _output->print_cr("Native Memory Tracking:");
+  _output->print_cr(" ");
+}
+
+void BaselineTTYOutputer::done() {
+
+}
+
+void BaselineTTYOutputer::total_usage(size_t total_reserved, size_t total_committed) {
+  const char* unit = memory_unit(_scale);
+  _output->print_cr("Total:  reserved=%d%s,  committed=%d%s",
+    total_reserved, unit, total_committed, unit);
+}
+
+void BaselineTTYOutputer::start_category_summary() {
+  _output->print_cr(" ");
+}
+
+/**
+ * report a summary of memory type
+ */
+void BaselineTTYOutputer::category_summary(MEMFLAGS type,
+  size_t reserved_amt, size_t committed_amt, size_t malloc_amt,
+  size_t malloc_count, size_t arena_amt, size_t arena_count) {
+
+  // we report mtThreadStack under mtThread category
+  if (type == mtThreadStack) {
+    assert(malloc_amt == 0 && malloc_count == 0 && arena_amt == 0,
+      "Just check");
+    _thread_stack_reserved = reserved_amt;
+    _thread_stack_committed = committed_amt;
+  } else {
+    const char* unit = memory_unit(_scale);
+    size_t total_reserved = (reserved_amt + malloc_amt + arena_amt);
+    size_t total_committed = (committed_amt + malloc_amt + arena_amt);
+    if (type == mtThread) {
+      total_reserved += _thread_stack_reserved;
+      total_committed += _thread_stack_committed;
+    }
+
+    if (total_reserved > 0) {
+      _output->print_cr("-%26s (reserved=%d%s, committed=%d%s)",
+        MemBaseline::type2name(type), total_reserved, unit,
+        total_committed, unit);
+
+      if (type == mtClass) {
+        _output->print_cr("%27s (classes #%d)", " ", _num_of_classes);
+      } else if (type == mtThread) {
+        _output->print_cr("%27s (thread #%d)", " ", _num_of_threads);
+        _output->print_cr("%27s (stack: reserved=%d%s, committed=%d%s)", " ",
+          _thread_stack_reserved, unit, _thread_stack_committed, unit);
+      }
+
+      if (malloc_amt > 0) {
+        if (type != mtChunk) {
+          _output->print_cr("%27s (malloc=%d%s, #%d)", " ", malloc_amt, unit,
+            malloc_count);
+        } else {
+          _output->print_cr("%27s (malloc=%d%s)", " ", malloc_amt, unit);
+        }
+      }
+
+      if (reserved_amt > 0) {
+        _output->print_cr("%27s (mmap: reserved=%d%s, committed=%d%s)",
+          " ", reserved_amt, unit, committed_amt, unit);
+      }
+
+      if (arena_amt > 0) {
+        _output->print_cr("%27s (arena=%d%s, #%d)", " ", arena_amt, unit, arena_count);
+      }
+
+      _output->print_cr(" ");
+    }
+  }
+}
+
+void BaselineTTYOutputer::done_category_summary() {
+  _output->print_cr(" ");
+}
+
+void BaselineTTYOutputer::start_callsite() {
+  _output->print_cr("Details:");
+  _output->print_cr(" ");
+}
+
+void BaselineTTYOutputer::done_callsite() {
+  _output->print_cr(" ");
+}
+
+void BaselineTTYOutputer::malloc_callsite(address pc, size_t malloc_amt,
+  size_t malloc_count) {
+  if (malloc_amt > 0) {
+    const char* unit = memory_unit(_scale);
+    char buf[64];
+    int  offset;
+    if (pc == 0) {
+      _output->print("[BOOTSTRAP]%18s", " ");
+    } else if (os::dll_address_to_function_name(pc, buf, sizeof(buf), &offset)) {
+      _output->print_cr("[" PTR_FORMAT "] %s+0x%x", pc, buf, offset);
+      _output->print("%28s", " ");
+    } else {
+      _output->print("[" PTR_FORMAT "]%18s", pc, " ");
+    }
+
+    _output->print_cr("(malloc=%d%s #%d)", malloc_amt, unit, malloc_count);
+    _output->print_cr(" ");
+  }
+}
+
+void BaselineTTYOutputer::virtual_memory_callsite(address pc, size_t reserved_amt,
+  size_t committed_amt) {
+  if (reserved_amt > 0) {
+    const char* unit = memory_unit(_scale);
+    char buf[64];
+    int  offset;
+    if (pc == 0) {
+      _output->print("[BOOTSTRAP]%18s", " ");
+    } else if (os::dll_address_to_function_name(pc, buf, sizeof(buf), &offset)) {
+      _output->print_cr("[" PTR_FORMAT "] %s+0x%x", pc, buf, offset);
+      _output->print("%28s", " ");
+    } else {
+      _output->print("[" PTR_FORMAT "]%18s", " ");
+    }
+
+    _output->print_cr("(mmap: reserved=%d%s, committed=%d%s)",
+      reserved_amt, unit, committed_amt, unit);
+    _output->print_cr(" ");
+  }
+}
+
+void BaselineTTYOutputer::diff_total_usage(size_t total_reserved,
+  size_t total_committed, int reserved_diff, int committed_diff) {
+  const char* unit = memory_unit(_scale);
+  _output->print_cr("Total:  reserved=%d%s  %+d%s, committed=%d%s %+d%s",
+    total_reserved, unit, reserved_diff, unit, total_committed, unit,
+    committed_diff, unit);
+}
+
+void BaselineTTYOutputer::diff_category_summary(MEMFLAGS type,
+  size_t cur_reserved_amt, size_t cur_committed_amt,
+  size_t cur_malloc_amt, size_t cur_malloc_count,
+  size_t cur_arena_amt, size_t cur_arena_count,
+  int reserved_diff, int committed_diff, int malloc_diff,
+  int malloc_count_diff, int arena_diff, int arena_count_diff) {
+
+  if (type == mtThreadStack) {
+    assert(cur_malloc_amt == 0 && cur_malloc_count == 0 &&
+      cur_arena_amt == 0, "Just check");
+    _thread_stack_reserved = cur_reserved_amt;
+    _thread_stack_committed = cur_committed_amt;
+    _thread_stack_reserved_diff = reserved_diff;
+    _thread_stack_committed_diff = committed_diff;
+  } else {
+    const char* unit = memory_unit(_scale);
+    size_t total_reserved = (cur_reserved_amt + cur_malloc_amt + cur_arena_amt);
+    // nothing to report in this category
+    if (total_reserved == 0) {
+      return;
+    }
+    int    diff_reserved = (reserved_diff + malloc_diff + arena_diff);
+
+    // category summary
+    _output->print("-%26s (reserved=%d%s", MemBaseline::type2name(type),
+      total_reserved, unit);
+
+    if (diff_reserved != 0) {
+      _output->print(" %+d%s", diff_reserved, unit);
+    }
+
+    size_t total_committed = cur_committed_amt + cur_malloc_amt + cur_arena_amt;
+    _output->print(", committed=%d%s", total_committed, unit);
+
+    int total_committed_diff = committed_diff + malloc_diff + arena_diff;
+    if (total_committed_diff != 0) {
+      _output->print(" %+d%s", total_committed_diff, unit);
+    }
+
+    _output->print_cr(")");
+
+    // special cases
+    if (type == mtClass) {
+      _output->print("%27s (classes #%d", " ", _num_of_classes);
+      if (_num_of_classes_diff != 0) {
+        _output->print(" %+d", _num_of_classes_diff);
+      }
+      _output->print_cr(")");
+    } else if (type == mtThread) {
+      // thread count
+      _output->print("%27s (thread #%d", " ", _num_of_threads);
+      if (_num_of_threads_diff != 0) {
+        _output->print_cr(" %+d)", _num_of_threads_diff);
+      } else {
+        _output->print_cr(")");
+      }
+      _output->print("%27s (stack: reserved=%d%s", " ", _thread_stack_reserved, unit);
+      if (_thread_stack_reserved_diff != 0) {
+        _output->print(" %+d%s", _thread_stack_reserved_diff, unit);
+      }
+
+      _output->print(", committed=%d%s", _thread_stack_committed, unit);
+      if (_thread_stack_committed_diff != 0) {
+        _output->print(" %+d%s",_thread_stack_committed_diff, unit);
+      }
+
+      _output->print_cr(")");
+    }
+
+    // malloc'd memory
+    if (cur_malloc_amt > 0) {
+      _output->print("%27s (malloc=%d%s", " ", cur_malloc_amt, unit);
+      if (malloc_diff != 0) {
+        _output->print(" %+d%s", malloc_diff, unit);
+      }
+      if (type != mtChunk) {
+        _output->print(", #%d", cur_malloc_count);
+        if (malloc_count_diff) {
+          _output->print(" %+d", malloc_count_diff);
+        }
+      }
+      _output->print_cr(")");
+    }
+
+    // mmap'd memory
+    if (cur_reserved_amt > 0) {
+      _output->print("%27s (mmap: reserved=%d%s", " ", cur_reserved_amt, unit);
+      if (reserved_diff != 0) {
+        _output->print(" %+d%s", reserved_diff, unit);
+      }
+
+      _output->print(", committed=%d%s", cur_committed_amt, unit);
+      if (committed_diff != 0) {
+        _output->print(" %+d%s", committed_diff, unit);
+      }
+      _output->print_cr(")");
+    }
+
+    // arena memory
+    if (cur_arena_amt > 0) {
+      _output->print("%27s (arena=%d%s", " ", cur_arena_amt, unit);
+      if (arena_diff != 0) {
+        _output->print(" %+d%s", arena_diff, unit);
+      }
+      _output->print(", #%d", cur_arena_count);
+      if (arena_count_diff != 0) {
+        _output->print(" %+d", arena_count_diff);
+      }
+      _output->print_cr(")");
+    }
+
+    _output->print_cr(" ");
+  }
+}
+
+void BaselineTTYOutputer::diff_malloc_callsite(address pc,
+    size_t cur_malloc_amt, size_t cur_malloc_count,
+    int malloc_diff, int malloc_count_diff) {
+  if (malloc_diff != 0) {
+    const char* unit = memory_unit(_scale);
+    char buf[64];
+    int  offset;
+    if (pc == 0) {
+      _output->print_cr("[BOOTSTRAP]%18s", " ");
+    } else {
+      if (os::dll_address_to_function_name(pc, buf, sizeof(buf), &offset)) {
+        _output->print_cr("[" PTR_FORMAT "] %s+0x%x", pc, buf, offset);
+        _output->print("%28s", " ");
+      } else {
+        _output->print("[" PTR_FORMAT "]%18s", pc, " ");
+      }
+    }
+
+    _output->print("(malloc=%d%s", cur_malloc_amt, unit);
+    if (malloc_diff != 0) {
+      _output->print(" %+d%s", malloc_diff, unit);
+    }
+    _output->print(", #%d", cur_malloc_count);
+    if (malloc_count_diff != 0) {
+      _output->print(" %+d", malloc_count_diff);
+    }
+    _output->print_cr(")");
+    _output->print_cr(" ");
+  }
+}
+
+void BaselineTTYOutputer::diff_virtual_memory_callsite(address pc,
+    size_t cur_reserved_amt, size_t cur_committed_amt,
+    int reserved_diff, int committed_diff) {
+  if (reserved_diff != 0 || committed_diff != 0) {
+    const char* unit = memory_unit(_scale);
+    char buf[64];
+    int  offset;
+    if (pc == 0) {
+      _output->print_cr("[BOOSTRAP]%18s", " ");
+    } else {
+      if (os::dll_address_to_function_name(pc, buf, sizeof(buf), &offset)) {
+        _output->print_cr("[" PTR_FORMAT "] %s+0x%x", pc, buf, offset);
+        _output->print("%28s", " ");
+      } else {
+        _output->print("[" PTR_FORMAT "]%18s", " ");
+      }
+    }
+
+    _output->print("(mmap: reserved=%d%s", cur_reserved_amt, unit);
+    if (reserved_diff != 0) {
+      _output->print(" %+d%s", reserved_diff, unit);
+    }
+    _output->print(", committed=%d%s", cur_committed_amt, unit);
+    if (committed_diff != 0) {
+      _output->print(" %+d%s", committed_diff, unit);
+    }
+    _output->print_cr(")");
+    _output->print_cr(" ");
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/services/memReporter.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,268 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_SERVICES_MEM_REPORTER_HPP
+#define SHARE_VM_SERVICES_MEM_REPORTER_HPP
+
+#include "runtime/mutexLocker.hpp"
+#include "services/memBaseline.hpp"
+#include "services/memTracker.hpp"
+#include "utilities/ostream.hpp"
+
+/*
+ * MemBaselineReporter reports data to this outputer class,
+ * ReportOutputer is responsible for format, store and redirect
+ * the data to the final destination.
+ */
+class BaselineOutputer : public StackObj {
+ public:
+  // start to report memory usage in specified scale.
+  // if report_diff = true, the reporter reports baseline comparison
+  // information.
+
+  virtual void start(size_t scale, bool report_diff = false) = 0;
+  // Done reporting
+  virtual void done() = 0;
+
+  /* report baseline summary information */
+  virtual void total_usage(size_t total_reserved,
+                           size_t total_committed) = 0;
+  virtual void num_of_classes(size_t classes) = 0;
+  virtual void num_of_threads(size_t threads) = 0;
+
+  virtual void thread_info(size_t stack_reserved_amt, size_t stack_committed_amt) = 0;
+
+  /* report baseline summary comparison */
+  virtual void diff_total_usage(size_t total_reserved,
+                                size_t total_committed,
+                                int reserved_diff,
+                                int committed_diff) = 0;
+  virtual void diff_num_of_classes(size_t classes, int diff) = 0;
+  virtual void diff_num_of_threads(size_t threads, int diff) = 0;
+
+  virtual void diff_thread_info(size_t stack_reserved, size_t stack_committed,
+        int stack_reserved_diff, int stack_committed_diff) = 0;
+
+
+  /*
+   * memory summary by memory types.
+   * for each memory type, following summaries are reported:
+   *  - reserved amount, committed amount
+   *  - malloc'd amount, malloc count
+   *  - arena amount, arena count
+   */
+
+  // start reporting memory summary by memory type
+  virtual void start_category_summary() = 0;
+
+  virtual void category_summary(MEMFLAGS type, size_t reserved_amt,
+                                size_t committed_amt,
+                                size_t malloc_amt, size_t malloc_count,
+                                size_t arena_amt, size_t arena_count) = 0;
+
+  virtual void diff_category_summary(MEMFLAGS type, size_t cur_reserved_amt,
+                                size_t cur_committed_amt,
+                                size_t cur_malloc_amt, size_t cur_malloc_count,
+                                size_t cur_arena_amt, size_t cur_arena_count,
+                                int reserved_diff, int committed_diff, int malloc_diff,
+                                int malloc_count_diff, int arena_diff,
+                                int arena_count_diff) = 0;
+
+  virtual void done_category_summary() = 0;
+
+  /*
+   *  Report callsite information
+   */
+  virtual void start_callsite() = 0;
+  virtual void malloc_callsite(address pc, size_t malloc_amt, size_t malloc_count) = 0;
+  virtual void virtual_memory_callsite(address pc, size_t reserved_amt, size_t committed_amt) = 0;
+
+  virtual void diff_malloc_callsite(address pc, size_t cur_malloc_amt, size_t cur_malloc_count,
+              int malloc_diff, int malloc_count_diff) = 0;
+  virtual void diff_virtual_memory_callsite(address pc, size_t cur_reserved_amt, size_t cur_committed_amt,
+              int reserved_diff, int committed_diff) = 0;
+
+  virtual void done_callsite() = 0;
+
+  // return current scale in "KB", "MB" or "GB"
+  static const char* memory_unit(size_t scale);
+};
+
+/*
+ * This class reports processed data from a baseline or
+ * the changes between the two baseline.
+ */
+class BaselineReporter : public StackObj {
+ private:
+  BaselineOutputer&  _outputer;
+  size_t             _scale;
+
+ public:
+  // construct a reporter that reports memory usage
+  // in specified scale
+  BaselineReporter(BaselineOutputer& outputer, size_t scale = K):
+    _outputer(outputer) {
+    _scale = scale;
+  }
+  virtual void report_baseline(const MemBaseline& baseline, bool summary_only = false);
+  virtual void diff_baselines(const MemBaseline& cur, const MemBaseline& prev,
+                              bool summary_only = false);
+
+  void set_scale(size_t scale);
+  size_t scale() const { return _scale; }
+
+ private:
+  void report_summaries(const MemBaseline& baseline);
+  void report_callsites(const MemBaseline& baseline);
+
+  void diff_summaries(const MemBaseline& cur, const MemBaseline& prev);
+  void diff_callsites(const MemBaseline& cur, const MemBaseline& prev);
+
+  // calculate memory size in current memory scale
+  size_t amount_in_current_scale(size_t amt) const;
+  // diff two unsigned values in current memory scale
+  int    diff_in_current_scale(size_t value1, size_t value2) const;
+  // diff two unsigned value
+  int    diff(size_t value1, size_t value2) const;
+};
+
+/*
+ * tty output implementation. Native memory tracking
+ * DCmd uses this outputer.
+ */
+class BaselineTTYOutputer : public BaselineOutputer {
+ private:
+  size_t         _scale;
+
+  size_t         _num_of_classes;
+  size_t         _num_of_threads;
+  size_t         _thread_stack_reserved;
+  size_t         _thread_stack_committed;
+
+  int            _num_of_classes_diff;
+  int            _num_of_threads_diff;
+  int            _thread_stack_reserved_diff;
+  int            _thread_stack_committed_diff;
+
+  outputStream*  _output;
+
+ public:
+  BaselineTTYOutputer(outputStream* st) {
+    _scale = K;
+    _num_of_classes = 0;
+    _num_of_threads = 0;
+    _thread_stack_reserved = 0;
+    _thread_stack_committed = 0;
+    _num_of_classes_diff = 0;
+    _num_of_threads_diff = 0;
+    _thread_stack_reserved_diff = 0;
+    _thread_stack_committed_diff = 0;
+    _output = st;
+  }
+
+  // begin reporting memory usage in specified scale
+  void start(size_t scale, bool report_diff = false);
+  // done reporting
+  void done();
+
+  // total memory usage
+  void total_usage(size_t total_reserved,
+                   size_t total_committed);
+  // report total loaded classes
+  void num_of_classes(size_t classes) {
+    _num_of_classes = classes;
+  }
+
+  void num_of_threads(size_t threads) {
+    _num_of_threads = threads;
+  }
+
+  void thread_info(size_t stack_reserved_amt, size_t stack_committed_amt) {
+    _thread_stack_reserved = stack_reserved_amt;
+    _thread_stack_committed = stack_committed_amt;
+  }
+
+  void diff_total_usage(size_t total_reserved,
+                        size_t total_committed,
+                        int reserved_diff,
+                        int committed_diff);
+
+  void diff_num_of_classes(size_t classes, int diff) {
+    _num_of_classes = classes;
+    _num_of_classes_diff = diff;
+  }
+
+  void diff_num_of_threads(size_t threads, int diff) {
+    _num_of_threads = threads;
+    _num_of_threads_diff = diff;
+  }
+
+  void diff_thread_info(size_t stack_reserved_amt, size_t stack_committed_amt,
+               int stack_reserved_diff, int stack_committed_diff) {
+    _thread_stack_reserved = stack_reserved_amt;
+    _thread_stack_committed = stack_committed_amt;
+    _thread_stack_reserved_diff = stack_reserved_diff;
+    _thread_stack_committed_diff = stack_committed_diff;
+  }
+
+  /*
+   * Report memory summary categoriuzed by memory types.
+   * For each memory type, following summaries are reported:
+   *  - reserved amount, committed amount
+   *  - malloc-ed amount, malloc count
+   *  - arena amount, arena count
+   */
+  // start reporting memory summary by memory type
+  void start_category_summary();
+  void category_summary(MEMFLAGS type, size_t reserved_amt, size_t committed_amt,
+                               size_t malloc_amt, size_t malloc_count,
+                               size_t arena_amt, size_t arena_count);
+
+  void diff_category_summary(MEMFLAGS type, size_t cur_reserved_amt,
+                          size_t cur_committed_amt,
+                          size_t cur_malloc_amt, size_t cur_malloc_count,
+                          size_t cur_arena_amt, size_t cur_arena_count,
+                          int reserved_diff, int committed_diff, int malloc_diff,
+                          int malloc_count_diff, int arena_diff,
+                          int arena_count_diff);
+
+  void done_category_summary();
+
+  /*
+   *  Report callsite information
+   */
+  void start_callsite();
+  void malloc_callsite(address pc, size_t malloc_amt, size_t malloc_count);
+  void virtual_memory_callsite(address pc, size_t reserved_amt, size_t committed_amt);
+
+  void diff_malloc_callsite(address pc, size_t cur_malloc_amt, size_t cur_malloc_count,
+              int malloc_diff, int malloc_count_diff);
+  void diff_virtual_memory_callsite(address pc, size_t cur_reserved_amt, size_t cur_committed_amt,
+              int reserved_diff, int committed_diff);
+
+  void done_callsite();
+};
+
+
+#endif // SHARE_VM_SERVICES_MEM_REPORTER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/services/memSnapshot.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,463 @@
+/*
+ * 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.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "runtime/mutexLocker.hpp"
+#include "utilities/decoder.hpp"
+#include "services/memBaseline.hpp"
+#include "services/memPtr.hpp"
+#include "services/memPtrArray.hpp"
+#include "services/memSnapshot.hpp"
+#include "services/memTracker.hpp"
+
+
+// stagging data groups the data of a VM memory range, so we can consolidate
+// them into one record during the walk
+bool StagingWalker::consolidate_vm_records(VMMemRegionEx* vm_rec) {
+  MemPointerRecord* cur = (MemPointerRecord*)_itr.current();
+  assert(cur != NULL && cur->is_vm_pointer(), "not a virtual memory pointer");
+
+  jint cur_seq;
+  jint next_seq;
+
+  bool trackCallsite = MemTracker::track_callsite();
+
+  if (trackCallsite) {
+    vm_rec->init((MemPointerRecordEx*)cur);
+    cur_seq = ((SeqMemPointerRecordEx*)cur)->seq();
+  } else {
+    vm_rec->init((MemPointerRecord*)cur);
+    cur_seq = ((SeqMemPointerRecord*)cur)->seq();
+  }
+
+  // only can consolidate when we have allocation record,
+  // which contains virtual memory range
+  if (!cur->is_allocation_record()) {
+    _itr.next();
+    return true;
+  }
+
+  // allocation range
+  address base = cur->addr();
+  address end = base + cur->size();
+
+  MemPointerRecord* next = (MemPointerRecord*)_itr.peek_next();
+  // if the memory range is alive
+  bool live_vm_rec = true;
+  while (next != NULL && next->is_vm_pointer()) {
+    if (next->is_allocation_record()) {
+      assert(next->addr() >= base, "sorting order or overlapping");
+      break;
+    }
+
+    if (trackCallsite) {
+      next_seq = ((SeqMemPointerRecordEx*)next)->seq();
+    } else {
+      next_seq = ((SeqMemPointerRecord*)next)->seq();
+    }
+
+    if (next_seq < cur_seq) {
+      _itr.next();
+      next = (MemPointerRecord*)_itr.peek_next();
+      continue;
+    }
+
+    if (next->is_deallocation_record()) {
+      if (next->addr() == base && next->size() == cur->size()) {
+        // the virtual memory range has been released
+        _itr.next();
+        live_vm_rec = false;
+        break;
+      } else if (next->addr() < end) { // partial release
+        vm_rec->partial_release(next->addr(), next->size());
+        _itr.next();
+      } else {
+        break;
+      }
+    } else if (next->is_commit_record()) {
+      if (next->addr() >= base && next->addr() + next->size() <= end) {
+        vm_rec->commit(next->size());
+        _itr.next();
+      } else {
+        assert(next->addr() >= base, "sorting order or overlapping");
+        break;
+      }
+    } else if (next->is_uncommit_record()) {
+      if (next->addr() >= base && next->addr() + next->size() <= end) {
+        vm_rec->uncommit(next->size());
+        _itr.next();
+      } else {
+        assert(next->addr() >= end, "sorting order or overlapping");
+        break;
+      }
+    } else if (next->is_type_tagging_record()) {
+      if (next->addr() >= base && next->addr() < end ) {
+        vm_rec->tag(next->flags());
+        _itr.next();
+      } else {
+          break;
+      }
+    } else {
+      assert(false, "unknown record type");
+    }
+    next = (MemPointerRecord*)_itr.peek_next();
+  }
+  _itr.next();
+  return live_vm_rec;
+}
+
+MemPointer* StagingWalker::next() {
+  MemPointerRecord* cur_p = (MemPointerRecord*)_itr.current();
+  if (cur_p == NULL) {
+    _end_of_array = true;
+    return NULL;
+  }
+
+  MemPointerRecord* next_p;
+  if (cur_p->is_vm_pointer()) {
+    _is_vm_record = true;
+    if (!consolidate_vm_records(&_vm_record)) {
+      return next();
+    }
+  } else { // malloc-ed pointer
+    _is_vm_record = false;
+    next_p = (MemPointerRecord*)_itr.peek_next();
+    if (next_p != NULL && next_p->addr() == cur_p->addr()) {
+      assert(cur_p->is_allocation_record(), "sorting order");
+      assert(!next_p->is_allocation_record(), "sorting order");
+      _itr.next();
+      if (cur_p->seq() < next_p->seq()) {
+        cur_p = next_p;
+      }
+    }
+    if (MemTracker::track_callsite()) {
+      _malloc_record.init((MemPointerRecordEx*)cur_p);
+    } else {
+      _malloc_record.init((MemPointerRecord*)cur_p);
+    }
+
+    _itr.next();
+  }
+  return current();
+}
+
+MemSnapshot::MemSnapshot() {
+  if (MemTracker::track_callsite()) {
+    _alloc_ptrs = new (std::nothrow) MemPointerArrayImpl<MemPointerRecordEx>();
+    _vm_ptrs = new (std::nothrow)MemPointerArrayImpl<VMMemRegionEx>(64, true);
+    _staging_area = new (std::nothrow)MemPointerArrayImpl<SeqMemPointerRecordEx>();
+  } else {
+    _alloc_ptrs = new (std::nothrow) MemPointerArrayImpl<MemPointerRecord>();
+    _vm_ptrs = new (std::nothrow)MemPointerArrayImpl<VMMemRegion>(64, true);
+    _staging_area = new (std::nothrow)MemPointerArrayImpl<SeqMemPointerRecord>();
+  }
+
+  _lock = new (std::nothrow) Mutex(Monitor::max_nonleaf - 1, "memSnapshotLock");
+  NOT_PRODUCT(_untracked_count = 0;)
+}
+
+MemSnapshot::~MemSnapshot() {
+  assert(MemTracker::shutdown_in_progress(), "native memory tracking still on");
+  {
+    MutexLockerEx locker(_lock);
+    if (_staging_area != NULL) {
+      delete _staging_area;
+      _staging_area = NULL;
+    }
+
+    if (_alloc_ptrs != NULL) {
+      delete _alloc_ptrs;
+      _alloc_ptrs = NULL;
+    }
+
+    if (_vm_ptrs != NULL) {
+      delete _vm_ptrs;
+      _vm_ptrs = NULL;
+    }
+  }
+
+  if (_lock != NULL) {
+    delete _lock;
+    _lock = NULL;
+  }
+}
+
+void MemSnapshot::copy_pointer(MemPointerRecord* dest, const MemPointerRecord* src) {
+  assert(dest != NULL && src != NULL, "Just check");
+  assert(dest->addr() == src->addr(), "Just check");
+
+  MEMFLAGS flags = dest->flags();
+
+  if (MemTracker::track_callsite()) {
+    *(MemPointerRecordEx*)dest = *(MemPointerRecordEx*)src;
+  } else {
+    *dest = *src;
+  }
+}
+
+
+// merge a per-thread memory recorder to the staging area
+bool MemSnapshot::merge(MemRecorder* rec) {
+  assert(rec != NULL && !rec->out_of_memory(), "Just check");
+
+  // out of memory
+  if (_staging_area == NULL || _staging_area->out_of_memory()) {
+    return false;
+  }
+
+  SequencedRecordIterator itr(rec->pointer_itr());
+
+  MutexLockerEx lock(_lock, true);
+  MemPointerIterator staging_itr(_staging_area);
+  MemPointerRecord *p1, *p2;
+  p1 = (MemPointerRecord*) itr.current();
+  while (p1 != NULL) {
+    p2 = (MemPointerRecord*)staging_itr.locate(p1->addr());
+    // we have not seen this memory block, so just add to staging area
+    if (p2 == NULL) {
+      if (!staging_itr.insert(p1)) {
+        return false;
+      }
+    } else if (p1->addr() == p2->addr()) {
+      MemPointerRecord* staging_next = (MemPointerRecord*)staging_itr.peek_next();
+      // a memory block can have many tagging records, find right one to replace or
+      // right position to insert
+      while (staging_next != NULL && staging_next->addr() == p1->addr()) {
+        if ((staging_next->flags() & MemPointerRecord::tag_masks) <=
+          (p1->flags() & MemPointerRecord::tag_masks)) {
+          p2 = (MemPointerRecord*)staging_itr.next();
+          staging_next = (MemPointerRecord*)staging_itr.peek_next();
+        } else {
+          break;
+        }
+      }
+      int df = (p1->flags() & MemPointerRecord::tag_masks) -
+        (p2->flags() & MemPointerRecord::tag_masks);
+      if (df == 0) {
+        assert(p1->seq() > 0, "not sequenced");
+        assert(p2->seq() > 0, "not sequenced");
+        if (p1->seq() > p2->seq()) {
+          copy_pointer(p2, p1);
+        }
+      } else if (df < 0) {
+        if (!staging_itr.insert(p1)) {
+          return false;
+        }
+      } else {
+        if (!staging_itr.insert_after(p1)) {
+          return false;
+        }
+      }
+    } else if (p1->addr() < p2->addr()) {
+      if (!staging_itr.insert(p1)) {
+        return false;
+      }
+    } else {
+      if (!staging_itr.insert_after(p1)) {
+        return false;
+      }
+    }
+    p1 = (MemPointerRecord*)itr.next();
+  }
+  NOT_PRODUCT(void check_staging_data();)
+  return true;
+}
+
+
+
+// promote data to next generation
+void MemSnapshot::promote() {
+  assert(_alloc_ptrs != NULL && _staging_area != NULL && _vm_ptrs != NULL,
+    "Just check");
+  MutexLockerEx lock(_lock, true);
+  StagingWalker walker(_staging_area);
+  MemPointerIterator malloc_itr(_alloc_ptrs);
+  VMMemPointerIterator vm_itr(_vm_ptrs);
+  MemPointer* cur = walker.current();
+  while (cur != NULL) {
+    if (walker.is_vm_record()) {
+      VMMemRegion* cur_vm = (VMMemRegion*)cur;
+      VMMemRegion* p = (VMMemRegion*)vm_itr.locate(cur_vm->addr());
+      cur_vm = (VMMemRegion*)cur;
+      if (p != NULL && (p->contains(cur_vm) || p->base() == cur_vm->base())) {
+        assert(p->is_reserve_record() ||
+          p->is_commit_record(), "wrong vm record type");
+        // resize existing reserved range
+        if (cur_vm->is_reserve_record() && p->base() == cur_vm->base()) {
+          assert(cur_vm->size() >= p->committed_size(), "incorrect resizing");
+          p->set_reserved_size(cur_vm->size());
+        } else if (cur_vm->is_commit_record()) {
+          p->commit(cur_vm->committed_size());
+        } else if (cur_vm->is_uncommit_record()) {
+          p->uncommit(cur_vm->committed_size());
+          if (!p->is_reserve_record() && p->committed_size() == 0) {
+            vm_itr.remove();
+          }
+        } else if (cur_vm->is_type_tagging_record()) {
+          p->tag(cur_vm->flags());
+        } else if (cur_vm->is_release_record()) {
+          if (cur_vm->base() == p->base() && cur_vm->size() == p->size()) {
+            // release the whole range
+            vm_itr.remove();
+          } else {
+            // partial release
+            p->partial_release(cur_vm->base(), cur_vm->size());
+          }
+        } else {
+          // we do see multiple reserver on the same vm range
+          assert((cur_vm->is_commit_record() || cur_vm->is_reserve_record()) &&
+             cur_vm->base() == p->base() && cur_vm->size() == p->size(), "bad record");
+          p->tag(cur_vm->flags());
+        }
+      } else {
+        if(cur_vm->is_reserve_record()) {
+          if (p == NULL || p->base() > cur_vm->base()) {
+            vm_itr.insert(cur_vm);
+          } else {
+            vm_itr.insert_after(cur_vm);
+          }
+        } else {
+#ifdef ASSERT
+          // In theory, we should assert without conditions. However, in case of native
+          // thread stack, NMT explicitly releases the thread stack in Thread's destructor,
+          // due to platform dependent behaviors. On some platforms, we see uncommit/release
+          // native thread stack, but some, we don't.
+          if (!cur_vm->is_uncommit_record() && !cur_vm->is_deallocation_record()) {
+            ShouldNotReachHere();
+          }
+#endif
+        }
+      }
+    } else {
+      MemPointerRecord* cur_p = (MemPointerRecord*)cur;
+      MemPointerRecord* p = (MemPointerRecord*)malloc_itr.locate(cur->addr());
+      if (p != NULL && cur_p->addr() == p->addr()) {
+        assert(p->is_allocation_record() || p->is_arena_size_record(), "untracked");
+        if (cur_p->is_allocation_record() || cur_p->is_arena_size_record()) {
+          copy_pointer(p, cur_p);
+        } else {   // deallocation record
+          assert(cur_p->is_deallocation_record(), "wrong record type");
+
+          // we are removing an arena record, we also need to remove its 'size'
+          // record behind it
+          if (p->is_arena_record()) {
+            MemPointerRecord* next_p = (MemPointerRecord*)malloc_itr.peek_next();
+            if (next_p->is_arena_size_record()) {
+              assert(next_p->is_size_record_of_arena(p), "arena records dont match");
+              malloc_itr.remove();
+            }
+          }
+          malloc_itr.remove();
+        }
+      } else {
+        if (cur_p->is_arena_size_record()) {
+          MemPointerRecord* prev_p = (MemPointerRecord*)malloc_itr.peek_prev();
+          if (prev_p != NULL &&
+             (!prev_p->is_arena_record() || !cur_p->is_size_record_of_arena(prev_p))) {
+            // arena already deallocated
+            cur_p = NULL;
+          }
+        }
+        if (cur_p != NULL) {
+          if (cur_p->is_allocation_record() || cur_p->is_arena_size_record()) {
+            if (p != NULL && cur_p->addr() > p->addr()) {
+              malloc_itr.insert_after(cur);
+            } else {
+              malloc_itr.insert(cur);
+            }
+          }
+#ifndef PRODUCT
+          else if (!has_allocation_record(cur_p->addr())){
+            // NMT can not track some startup memory, which allocated before NMT
+            // is enabled
+            _untracked_count ++;
+          }
+#endif
+        }
+      }
+    }
+
+    cur = walker.next();
+  }
+  NOT_PRODUCT(check_malloc_pointers();)
+  _staging_area->shrink();
+  _staging_area->clear();
+}
+
+
+#ifdef ASSERT
+void MemSnapshot::print_snapshot_stats(outputStream* st) {
+  st->print_cr("Snapshot:");
+  st->print_cr("\tMalloced: %d/%d [%5.2f%%]  %dKB", _alloc_ptrs->length(), _alloc_ptrs->capacity(),
+    (100.0 * (float)_alloc_ptrs->length()) / (float)_alloc_ptrs->capacity(), _alloc_ptrs->instance_size()/K);
+
+  st->print_cr("\tVM: %d/%d [%5.2f%%] %dKB", _vm_ptrs->length(), _vm_ptrs->capacity(),
+    (100.0 * (float)_vm_ptrs->length()) / (float)_vm_ptrs->capacity(), _vm_ptrs->instance_size()/K);
+
+  st->print_cr("\tStaging:     %d/%d [%5.2f%%] %dKB", _staging_area->length(), _staging_area->capacity(),
+    (100.0 * (float)_staging_area->length()) / (float)_staging_area->capacity(), _staging_area->instance_size()/K);
+
+  st->print_cr("\tUntracked allocation: %d", _untracked_count);
+}
+
+void MemSnapshot::check_malloc_pointers() {
+  MemPointerArrayIteratorImpl mItr(_alloc_ptrs);
+  MemPointerRecord* p = (MemPointerRecord*)mItr.current();
+  MemPointerRecord* prev = NULL;
+  while (p != NULL) {
+    if (prev != NULL) {
+      assert(p->addr() >= prev->addr(), "sorting order");
+    }
+    prev = p;
+    p = (MemPointerRecord*)mItr.next();
+  }
+}
+
+void MemSnapshot::check_staging_data() {
+  MemPointerArrayIteratorImpl itr(_staging_area);
+  MemPointerRecord* cur = (MemPointerRecord*)itr.current();
+  MemPointerRecord* next = (MemPointerRecord*)itr.next();
+  while (next != NULL) {
+    assert((next->addr() > cur->addr()) ||
+      ((next->flags() & MemPointerRecord::tag_masks) >
+       (cur->flags() & MemPointerRecord::tag_masks)),
+       "sorting order");
+    cur = next;
+    next = (MemPointerRecord*)itr.next();
+  }
+}
+
+bool MemSnapshot::has_allocation_record(address addr) {
+  MemPointerArrayIteratorImpl itr(_staging_area);
+  MemPointerRecord* cur = (MemPointerRecord*)itr.current();
+  while (cur != NULL) {
+    if (cur->addr() == addr && cur->is_allocation_record()) {
+      return true;
+    }
+    cur = (MemPointerRecord*)itr.next();
+  }
+  return false;
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/services/memSnapshot.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,286 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_SERVICES_MEM_SNAPSHOT_HPP
+#define SHARE_VM_SERVICES_MEM_SNAPSHOT_HPP
+
+#include "memory/allocation.hpp"
+#include "runtime/mutex.hpp"
+#include "runtime/mutexLocker.hpp"
+#include "services/memBaseline.hpp"
+#include "services/memPtrArray.hpp"
+
+
+// Snapshot pointer array iterator
+
+// The pointer array contains malloc-ed pointers
+class MemPointerIterator : public MemPointerArrayIteratorImpl {
+ public:
+  MemPointerIterator(MemPointerArray* arr):
+    MemPointerArrayIteratorImpl(arr) {
+    assert(arr != NULL, "null array");
+  }
+
+#ifdef ASSERT
+  virtual bool is_dup_pointer(const MemPointer* ptr1,
+    const MemPointer* ptr2) const {
+    MemPointerRecord* p1 = (MemPointerRecord*)ptr1;
+    MemPointerRecord* p2 = (MemPointerRecord*)ptr2;
+
+    if (p1->addr() != p2->addr()) return false;
+    if ((p1->flags() & MemPointerRecord::tag_masks) !=
+        (p2->flags() & MemPointerRecord::tag_masks)) {
+      return false;
+    }
+    // we do see multiple commit/uncommit on the same memory, it is ok
+    return (p1->flags() & MemPointerRecord::tag_masks) == MemPointerRecord::tag_alloc ||
+           (p1->flags() & MemPointerRecord::tag_masks) == MemPointerRecord::tag_release;
+  }
+
+  virtual bool insert(MemPointer* ptr) {
+    if (_pos > 0) {
+      MemPointer* p1 = (MemPointer*)ptr;
+      MemPointer* p2 = (MemPointer*)_array->at(_pos - 1);
+      assert(!is_dup_pointer(p1, p2),
+        "dup pointer");
+    }
+     if (_pos < _array->length() -1) {
+      MemPointer* p1 = (MemPointer*)ptr;
+      MemPointer* p2 = (MemPointer*)_array->at(_pos + 1);
+      assert(!is_dup_pointer(p1, p2),
+        "dup pointer");
+     }
+    return _array->insert_at(ptr, _pos);
+  }
+
+  virtual bool insert_after(MemPointer* ptr) {
+    if (_pos > 0) {
+      MemPointer* p1 = (MemPointer*)ptr;
+      MemPointer* p2 = (MemPointer*)_array->at(_pos - 1);
+      assert(!is_dup_pointer(p1, p2),
+        "dup pointer");
+    }
+    if (_pos < _array->length() - 1) {
+      MemPointer* p1 = (MemPointer*)ptr;
+      MemPointer* p2 = (MemPointer*)_array->at(_pos + 1);
+
+      assert(!is_dup_pointer(p1, p2),
+        "dup pointer");
+     }
+    if (_array->insert_at(ptr, _pos + 1)) {
+      _pos ++;
+      return true;
+    }
+    return false;
+  }
+#endif
+
+  virtual MemPointer* locate(address addr) {
+    MemPointer* cur = current();
+    while (cur != NULL && cur->addr() < addr) {
+      cur = next();
+    }
+    return cur;
+  }
+};
+
+class VMMemPointerIterator : public MemPointerIterator {
+ public:
+  VMMemPointerIterator(MemPointerArray* arr):
+      MemPointerIterator(arr) {
+  }
+
+  // locate an exiting record that contains specified address, or
+  // the record, where the record with specified address, should
+  // be inserted
+  virtual MemPointer* locate(address addr) {
+    VMMemRegion* cur = (VMMemRegion*)current();
+    VMMemRegion* next_p;
+
+    while (cur != NULL) {
+      if (cur->base() > addr) {
+        return cur;
+      } else {
+        // find nearest existing range that has base address <= addr
+        next_p = (VMMemRegion*)peek_next();
+        if (next_p != NULL && next_p->base() <= addr) {
+          cur = (VMMemRegion*)next();
+          continue;
+        }
+      }
+
+      if (cur->is_reserve_record() &&
+        cur->base() <= addr &&
+        (cur->base() + cur->size() > addr)) {
+          return cur;
+      } else if (cur->is_commit_record() &&
+        cur->base() <= addr &&
+        (cur->base() + cur->committed_size() > addr)) {
+          return cur;
+      }
+      cur = (VMMemRegion*)next();
+    }
+    return NULL;
+  }
+
+#ifdef ASSERT
+  virtual bool is_dup_pointer(const MemPointer* ptr1,
+    const MemPointer* ptr2) const {
+    VMMemRegion* p1 = (VMMemRegion*)ptr1;
+    VMMemRegion* p2 = (VMMemRegion*)ptr2;
+
+    if (p1->addr() != p2->addr()) return false;
+    if ((p1->flags() & MemPointerRecord::tag_masks) !=
+        (p2->flags() & MemPointerRecord::tag_masks)) {
+      return false;
+    }
+    // we do see multiple commit/uncommit on the same memory, it is ok
+    return (p1->flags() & MemPointerRecord::tag_masks) == MemPointerRecord::tag_alloc ||
+           (p1->flags() & MemPointerRecord::tag_masks) == MemPointerRecord::tag_release;
+  }
+#endif
+};
+
+class StagingWalker : public MemPointerArrayIterator {
+ private:
+  MemPointerArrayIteratorImpl  _itr;
+  bool                         _is_vm_record;
+  bool                         _end_of_array;
+  VMMemRegionEx                _vm_record;
+  MemPointerRecordEx           _malloc_record;
+
+ public:
+  StagingWalker(MemPointerArray* arr): _itr(arr) {
+    _end_of_array = false;
+    next();
+  }
+
+  // return the pointer at current position
+  MemPointer* current() const {
+    if (_end_of_array) {
+      return NULL;
+    }
+    if (is_vm_record()) {
+      return (MemPointer*)&_vm_record;
+    } else {
+      return (MemPointer*)&_malloc_record;
+    }
+  }
+
+  // return the next pointer and advance current position
+  MemPointer* next();
+
+  // type of 'current' record
+  bool is_vm_record() const {
+    return _is_vm_record;
+  }
+
+  // return the next poinger without advancing current position
+  MemPointer* peek_next() const {
+    assert(false, "not supported");
+    return NULL;
+  }
+
+  MemPointer* peek_prev() const {
+    assert(false, "not supported");
+    return NULL;
+  }
+  // remove the pointer at current position
+  void remove() {
+    assert(false, "not supported");
+  }
+
+  // insert the pointer at current position
+  bool insert(MemPointer* ptr) {
+    assert(false, "not supported");
+    return false;
+  }
+
+  bool insert_after(MemPointer* ptr) {
+    assert(false, "not supported");
+    return false;
+  }
+
+ private:
+  // consolidate all records referring to this vm region
+  bool consolidate_vm_records(VMMemRegionEx* vm_rec);
+};
+
+class MemBaseline;
+
+class MemSnapshot : public CHeapObj<mtNMT> {
+ private:
+  // the following two arrays contain records of all known lived memory blocks
+  // live malloc-ed memory pointers
+  MemPointerArray*      _alloc_ptrs;
+  // live virtual memory pointers
+  MemPointerArray*      _vm_ptrs;
+
+  // stagging a generation's data, before
+  // it can be prompted to snapshot
+  MemPointerArray*      _staging_area;
+
+  // the lock to protect this snapshot
+  Monitor*              _lock;
+
+  NOT_PRODUCT(size_t    _untracked_count;)
+  friend class MemBaseline;
+
+ public:
+  MemSnapshot();
+  virtual ~MemSnapshot();
+
+  // if we are running out of native memory
+  bool out_of_memory() const {
+    return (_alloc_ptrs == NULL || _staging_area == NULL ||
+      _vm_ptrs == NULL || _lock == NULL ||
+      _alloc_ptrs->out_of_memory() ||
+      _staging_area->out_of_memory() ||
+      _vm_ptrs->out_of_memory());
+  }
+
+  // merge a per-thread memory recorder into staging area
+  bool merge(MemRecorder* rec);
+  // promote staged data to snapshot
+  void promote();
+
+
+  void wait(long timeout) {
+    assert(_lock != NULL, "Just check");
+    MonitorLockerEx locker(_lock);
+    locker.wait(true, timeout);
+  }
+
+  NOT_PRODUCT(void print_snapshot_stats(outputStream* st);)
+  NOT_PRODUCT(void check_staging_data();)
+  NOT_PRODUCT(void check_malloc_pointers();)
+  NOT_PRODUCT(bool has_allocation_record(address addr);)
+
+ private:
+   // copy pointer data from src to dest
+   void copy_pointer(MemPointerRecord* dest, const MemPointerRecord* src);
+};
+
+
+#endif // SHARE_VM_SERVICES_MEM_SNAPSHOT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/services/memTrackWorker.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,199 @@
+/*
+ * 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.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "runtime/threadCritical.hpp"
+#include "services/memTracker.hpp"
+#include "services/memTrackWorker.hpp"
+#include "utilities/decoder.hpp"
+#include "utilities/vmError.hpp"
+
+MemTrackWorker::MemTrackWorker() {
+  // create thread uses cgc thread type for now. We should revisit
+  // the option, or create new thread type.
+  _has_error = !os::create_thread(this, os::cgc_thread);
+  set_name("MemTrackWorker", 0);
+
+  // initial generation circuit buffer
+  if (!has_error()) {
+    _head = _tail = 0;
+    for(int index = 0; index < MAX_GENERATIONS; index ++) {
+      _gen[index] = NULL;
+    }
+  }
+  NOT_PRODUCT(_sync_point_count = 0;)
+  NOT_PRODUCT(_merge_count = 0;)
+  NOT_PRODUCT(_last_gen_in_use = 0;)
+}
+
+MemTrackWorker::~MemTrackWorker() {
+  for (int index = 0; index < MAX_GENERATIONS; index ++) {
+    MemRecorder* rc = _gen[index];
+    if (rc != NULL) {
+      delete rc;
+    }
+  }
+}
+
+void* MemTrackWorker::operator new(size_t size) {
+  assert(false, "use nothrow version");
+  return NULL;
+}
+
+void* MemTrackWorker::operator new(size_t size, const std::nothrow_t& nothrow_constant) {
+  return allocate(size, false, mtNMT);
+}
+
+void MemTrackWorker::start() {
+  os::start_thread(this);
+}
+
+/*
+ * Native memory tracking worker thread loop:
+ *   1. merge one generation of memory recorders to staging area
+ *   2. promote staging data to memory snapshot
+ *
+ * This thread can run through safepoint.
+ */
+
+void MemTrackWorker::run() {
+  assert(MemTracker::is_on(), "native memory tracking is off");
+  this->initialize_thread_local_storage();
+  this->record_stack_base_and_size();
+  MemSnapshot* snapshot = MemTracker::get_snapshot();
+  assert(snapshot != NULL, "Worker should not be started");
+  MemRecorder* rec;
+
+  while (!MemTracker::shutdown_in_progress()) {
+    NOT_PRODUCT(_last_gen_in_use = generations_in_use();)
+    {
+      // take a recorder from earliest generation in buffer
+      ThreadCritical tc;
+      rec = _gen[_head];
+      if (rec != NULL) {
+        _gen[_head] = rec->next();
+      }
+      assert(count_recorder(_gen[_head]) <= MemRecorder::_instance_count,
+        "infinite loop after dequeue");
+    }
+    if (rec != NULL) {
+      // merge the recorder into staging area
+      bool result = snapshot->merge(rec);
+      assert(result, "merge failed");
+      debug_only(_merge_count ++;)
+      MemTracker::release_thread_recorder(rec);
+    } else {
+      // no more recorder to merge, promote staging area
+      // to snapshot
+      if (_head != _tail) {
+        {
+          ThreadCritical tc;
+          if (_gen[_head] != NULL || _head == _tail) {
+            continue;
+          }
+          // done with this generation, increment _head pointer
+          _head = (_head + 1) % MAX_GENERATIONS;
+        }
+        // promote this generation data to snapshot
+        snapshot->promote();
+      } else {
+        snapshot->wait(1000);
+        ThreadCritical tc;
+        // check if more data arrived
+        if (_gen[_head] == NULL) {
+          _gen[_head] = MemTracker::get_pending_recorders();
+        }
+      }
+    }
+  }
+  assert(MemTracker::shutdown_in_progress(), "just check");
+
+  // transites to final shutdown
+  MemTracker::final_shutdown();
+}
+
+// at synchronization point, where 'safepoint visible' Java threads are blocked
+// at a safepoint, and the rest of threads are blocked on ThreadCritical lock.
+// The caller MemTracker::sync() already takes ThreadCritical before calling this
+// method.
+//
+// Following tasks are performed:
+//   1. add all recorders in pending queue to current generation
+//   2. increase generation
+
+void MemTrackWorker::at_sync_point(MemRecorder* rec) {
+  NOT_PRODUCT(_sync_point_count ++;)
+  assert(count_recorder(rec) <= MemRecorder::_instance_count,
+    "pending queue has infinite loop");
+
+  bool out_of_generation_buffer = false;
+  // check shutdown state inside ThreadCritical
+  if (MemTracker::shutdown_in_progress()) return;
+  // append the recorders to the end of the generation
+  if( rec != NULL) {
+    MemRecorder* cur_head = _gen[_tail];
+    if (cur_head == NULL) {
+      _gen[_tail] = rec;
+    } else {
+      while (cur_head->next() != NULL) {
+        cur_head = cur_head->next();
+      }
+      cur_head->set_next(rec);
+    }
+  }
+  assert(count_recorder(rec) <= MemRecorder::_instance_count,
+    "after add to current generation has infinite loop");
+  // we have collected all recorders for this generation. If there is data,
+  // we need to increment _tail to start a new generation.
+  if (_gen[_tail] != NULL || _head == _tail) {
+    _tail = (_tail + 1) % MAX_GENERATIONS;
+    out_of_generation_buffer = (_tail == _head);
+  }
+
+  if (out_of_generation_buffer) {
+    MemTracker::shutdown(MemTracker::NMT_out_of_generation);
+  }
+}
+
+#ifndef PRODUCT
+int MemTrackWorker::count_recorder(const MemRecorder* head) {
+  int count = 0;
+  while(head != NULL) {
+    count ++;
+    head = head->next();
+  }
+  return count;
+}
+
+int MemTrackWorker::count_pending_recorders() const {
+  int count = 0;
+  for (int index = 0; index < MAX_GENERATIONS; index ++) {
+    MemRecorder* head = _gen[index];
+    if (head != NULL) {
+      count += count_recorder(head);
+    }
+  }
+  return count;
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/services/memTrackWorker.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_SERVICES_MEM_TRACK_WORKER_HPP
+#define SHARE_VM_SERVICES_MEM_TRACK_WORKER_HPP
+
+#include "memory/allocation.hpp"
+#include "runtime/thread.hpp"
+#include "services/memRecorder.hpp"
+
+// Maximum MAX_GENERATIONS generation data can be tracked.
+#define MAX_GENERATIONS  512
+
+
+class MemTrackWorker : public NamedThread {
+ private:
+  // circular buffer. This buffer contains recorders to be merged into global
+  // snaphsot.
+  // Each slot holds a linked list of memory recorders, that contains one
+  // generation of memory data.
+  MemRecorder*  _gen[MAX_GENERATIONS];
+  int           _head, _tail; // head and tail pointers to above circular buffer
+
+  bool          _has_error;
+
+ public:
+  MemTrackWorker();
+  ~MemTrackWorker();
+  _NOINLINE_ void* operator new(size_t size);
+  _NOINLINE_ void* operator new(size_t size, const std::nothrow_t& nothrow_constant);
+
+  void start();
+  void run();
+
+  inline bool has_error() const { return _has_error; }
+
+  // task at synchronization point
+  void at_sync_point(MemRecorder* pending_recorders);
+
+  // for debugging purpose, they are not thread safe.
+  NOT_PRODUCT(static int count_recorder(const MemRecorder* head);)
+  NOT_PRODUCT(int count_pending_recorders() const;)
+
+  NOT_PRODUCT(int _sync_point_count;)
+  NOT_PRODUCT(int _merge_count;)
+  NOT_PRODUCT(int _last_gen_in_use;)
+
+  inline int generations_in_use() const {
+    return (_tail >= _head ? (_tail - _head + 1) : (MAX_GENERATIONS - (_head - _tail) + 1));
+  }
+};
+
+#endif // SHARE_VM_SERVICES_MEM_TRACK_WORKER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/services/memTracker.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,625 @@
+/*
+ * 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.
+ *
+ */
+#include "precompiled.hpp"
+
+#include "runtime/atomic.hpp"
+#include "runtime/interfaceSupport.hpp"
+#include "runtime/mutexLocker.hpp"
+#include "runtime/safepoint.hpp"
+#include "runtime/threadCritical.hpp"
+#include "services/memPtr.hpp"
+#include "services/memReporter.hpp"
+#include "services/memTracker.hpp"
+#include "utilities/decoder.hpp"
+#include "utilities/globalDefinitions.hpp"
+
+bool NMT_track_callsite = false;
+
+// walk all 'known' threads at NMT sync point, and collect their recorders
+void SyncThreadRecorderClosure::do_thread(Thread* thread) {
+  assert(SafepointSynchronize::is_at_safepoint(), "Safepoint required");
+  if (thread->is_Java_thread()) {
+    JavaThread* javaThread = (JavaThread*)thread;
+    MemRecorder* recorder = javaThread->get_recorder();
+    if (recorder != NULL) {
+      MemTracker::enqueue_pending_recorder(recorder);
+      javaThread->set_recorder(NULL);
+    }
+  }
+  _thread_count ++;
+}
+
+
+MemRecorder*                    MemTracker::_global_recorder = NULL;
+MemSnapshot*                    MemTracker::_snapshot = NULL;
+MemBaseline                     MemTracker::_baseline;
+Mutex*                          MemTracker::_query_lock = NULL;
+volatile MemRecorder*           MemTracker::_merge_pending_queue = NULL;
+volatile MemRecorder*           MemTracker::_pooled_recorders = NULL;
+MemTrackWorker*                 MemTracker::_worker_thread = NULL;
+int                             MemTracker::_sync_point_skip_count = 0;
+MemTracker::NMTLevel            MemTracker::_tracking_level = MemTracker::NMT_off;
+volatile MemTracker::NMTStates  MemTracker::_state = NMT_uninited;
+MemTracker::ShutdownReason      MemTracker::_reason = NMT_shutdown_none;
+int                             MemTracker::_thread_count = 255;
+volatile jint                   MemTracker::_pooled_recorder_count = 0;
+debug_only(intx                 MemTracker::_main_thread_tid = 0;)
+debug_only(volatile jint        MemTracker::_pending_recorder_count = 0;)
+
+void MemTracker::init_tracking_options(const char* option_line) {
+  _tracking_level = NMT_off;
+  if (strncmp(option_line, "=summary", 8) == 0) {
+    _tracking_level = NMT_summary;
+  } else if (strncmp(option_line, "=detail", 8) == 0) {
+    _tracking_level = NMT_detail;
+  }
+}
+
+// first phase of bootstrapping, when VM is still in single-threaded mode.
+void MemTracker::bootstrap_single_thread() {
+  if (_tracking_level > NMT_off) {
+    assert(_state == NMT_uninited, "wrong state");
+
+    // NMT is not supported with UseMallocOnly is on. NMT can NOT
+    // handle the amount of malloc data without significantly impacting
+    // runtime performance when this flag is on.
+    if (UseMallocOnly) {
+      shutdown(NMT_use_malloc_only);
+      return;
+    }
+
+    _query_lock = new (std::nothrow) Mutex(Monitor::max_nonleaf, "NMT_queryLock");
+    if (_query_lock == NULL) {
+      shutdown(NMT_out_of_memory);
+      return;
+    }
+
+    debug_only(_main_thread_tid = os::current_thread_id();)
+    _state = NMT_bootstrapping_single_thread;
+    NMT_track_callsite = (_tracking_level == NMT_detail && can_walk_stack());
+  }
+}
+
+// second phase of bootstrapping, when VM is about to or already entered multi-theaded mode.
+void MemTracker::bootstrap_multi_thread() {
+  if (_tracking_level > NMT_off && _state == NMT_bootstrapping_single_thread) {
+  // create nmt lock for multi-thread execution
+    assert(_main_thread_tid == os::current_thread_id(), "wrong thread");
+    _state = NMT_bootstrapping_multi_thread;
+    NMT_track_callsite = (_tracking_level == NMT_detail && can_walk_stack());
+  }
+}
+
+// fully start nmt
+void MemTracker::start() {
+  // Native memory tracking is off from command line option
+  if (_tracking_level == NMT_off || shutdown_in_progress()) return;
+
+  assert(_main_thread_tid == os::current_thread_id(), "wrong thread");
+  assert(_state == NMT_bootstrapping_multi_thread, "wrong state");
+
+  _snapshot = new (std::nothrow)MemSnapshot();
+  if (_snapshot != NULL && !_snapshot->out_of_memory()) {
+    if (start_worker()) {
+      _state = NMT_started;
+      NMT_track_callsite = (_tracking_level == NMT_detail && can_walk_stack());
+      return;
+    }
+  }
+
+  // fail to start native memory tracking, shut it down
+  shutdown(NMT_initialization);
+}
+
+/**
+ * Shutting down native memory tracking.
+ * We can not shutdown native memory tracking immediately, so we just
+ * setup shutdown pending flag, every native memory tracking component
+ * should orderly shut itself down.
+ *
+ * The shutdown sequences:
+ *  1. MemTracker::shutdown() sets MemTracker to shutdown pending state
+ *  2. Worker thread calls MemTracker::final_shutdown(), which transites
+ *     MemTracker to final shutdown state.
+ *  3. At sync point, MemTracker does final cleanup, before sets memory
+ *     tracking level to off to complete shutdown.
+ */
+void MemTracker::shutdown(ShutdownReason reason) {
+  if (_tracking_level == NMT_off) return;
+
+  if (_state <= NMT_bootstrapping_single_thread) {
+    // we still in single thread mode, there is not contention
+    _state = NMT_shutdown_pending;
+    _reason = reason;
+  } else {
+    // we want to know who initialized shutdown
+    if ((jint)NMT_started == Atomic::cmpxchg((jint)NMT_shutdown_pending,
+                                       (jint*)&_state, (jint)NMT_started)) {
+        _reason = reason;
+    }
+  }
+}
+
+// final phase of shutdown
+void MemTracker::final_shutdown() {
+  // delete all pending recorders and pooled recorders
+  delete_all_pending_recorders();
+  delete_all_pooled_recorders();
+
+  {
+    // shared baseline and snapshot are the only objects needed to
+    // create query results
+    MutexLockerEx locker(_query_lock, true);
+    // cleanup baseline data and snapshot
+    _baseline.clear();
+    delete _snapshot;
+    _snapshot = NULL;
+  }
+
+  // shutdown shared decoder instance, since it is only
+  // used by native memory tracking so far.
+  Decoder::shutdown();
+
+  MemTrackWorker* worker = NULL;
+  {
+    ThreadCritical tc;
+    // can not delete worker inside the thread critical
+    if (_worker_thread != NULL && Thread::current() == _worker_thread) {
+      worker = _worker_thread;
+      _worker_thread = NULL;
+    }
+  }
+  if (worker != NULL) {
+    delete worker;
+  }
+  _state = NMT_final_shutdown;
+}
+
+// delete all pooled recorders
+void MemTracker::delete_all_pooled_recorders() {
+  // free all pooled recorders
+  volatile MemRecorder* cur_head = _pooled_recorders;
+  if (cur_head != NULL) {
+    MemRecorder* null_ptr = NULL;
+    while (cur_head != NULL && (void*)cur_head != Atomic::cmpxchg_ptr((void*)null_ptr,
+      (void*)&_pooled_recorders, (void*)cur_head)) {
+      cur_head = _pooled_recorders;
+    }
+    if (cur_head != NULL) {
+      delete cur_head;
+      _pooled_recorder_count = 0;
+    }
+  }
+}
+
+// delete all recorders in pending queue
+void MemTracker::delete_all_pending_recorders() {
+  // free all pending recorders
+  MemRecorder* pending_head = get_pending_recorders();
+  if (pending_head != NULL) {
+    delete pending_head;
+  }
+}
+
+/*
+ * retrieve per-thread recorder of specified thread.
+ * if thread == NULL, it means global recorder
+ */
+MemRecorder* MemTracker::get_thread_recorder(JavaThread* thread) {
+  if (shutdown_in_progress()) return NULL;
+
+  MemRecorder* rc;
+  if (thread == NULL) {
+    rc = _global_recorder;
+  } else {
+    rc = thread->get_recorder();
+  }
+
+  if (rc != NULL && rc->is_full()) {
+    enqueue_pending_recorder(rc);
+    rc = NULL;
+  }
+
+  if (rc == NULL) {
+    rc = get_new_or_pooled_instance();
+    if (thread == NULL) {
+      _global_recorder = rc;
+    } else {
+      thread->set_recorder(rc);
+    }
+  }
+  return rc;
+}
+
+/*
+ * get a per-thread recorder from pool, or create a new one if
+ * there is not one available.
+ */
+MemRecorder* MemTracker::get_new_or_pooled_instance() {
+   MemRecorder* cur_head = const_cast<MemRecorder*> (_pooled_recorders);
+   if (cur_head == NULL) {
+     MemRecorder* rec = new (std::nothrow)MemRecorder();
+     if (rec == NULL || rec->out_of_memory()) {
+       shutdown(NMT_out_of_memory);
+       if (rec != NULL) {
+         delete rec;
+         rec = NULL;
+       }
+     }
+     return rec;
+   } else {
+     MemRecorder* next_head = cur_head->next();
+     if ((void*)cur_head != Atomic::cmpxchg_ptr((void*)next_head, (void*)&_pooled_recorders,
+       (void*)cur_head)) {
+       return get_new_or_pooled_instance();
+     }
+     cur_head->set_next(NULL);
+     Atomic::dec(&_pooled_recorder_count);
+     debug_only(cur_head->set_generation();)
+     return cur_head;
+  }
+}
+
+/*
+ * retrieve all recorders in pending queue, and empty the queue
+ */
+MemRecorder* MemTracker::get_pending_recorders() {
+  MemRecorder* cur_head = const_cast<MemRecorder*>(_merge_pending_queue);
+  MemRecorder* null_ptr = NULL;
+  while ((void*)cur_head != Atomic::cmpxchg_ptr((void*)null_ptr, (void*)&_merge_pending_queue,
+    (void*)cur_head)) {
+    cur_head = const_cast<MemRecorder*>(_merge_pending_queue);
+  }
+  debug_only(Atomic::store(0, &_pending_recorder_count));
+  return cur_head;
+}
+
+/*
+ * release a recorder to recorder pool.
+ */
+void MemTracker::release_thread_recorder(MemRecorder* rec) {
+  assert(rec != NULL, "null recorder");
+  // we don't want to pool too many recorders
+  rec->set_next(NULL);
+  if (shutdown_in_progress() || _pooled_recorder_count > _thread_count * 2) {
+    delete rec;
+    return;
+  }
+
+  rec->clear();
+  MemRecorder* cur_head = const_cast<MemRecorder*>(_pooled_recorders);
+  rec->set_next(cur_head);
+  while ((void*)cur_head != Atomic::cmpxchg_ptr((void*)rec, (void*)&_pooled_recorders,
+    (void*)cur_head)) {
+    cur_head = const_cast<MemRecorder*>(_pooled_recorders);
+    rec->set_next(cur_head);
+  }
+  Atomic::inc(&_pooled_recorder_count);
+}
+
+/*
+ * This is the most important method in whole nmt implementation.
+ *
+ * Create a memory record.
+ * 1. When nmt is in single-threaded bootstrapping mode, no lock is needed as VM
+ *    still in single thread mode.
+ * 2. For all threads other than JavaThread, ThreadCritical is needed
+ *    to write to recorders to global recorder.
+ * 3. For JavaThreads that are not longer visible by safepoint, also
+ *    need to take ThreadCritical and records are written to global
+ *    recorders, since these threads are NOT walked by Threads.do_thread().
+ * 4. JavaThreads that are running in native state, have to transition
+ *    to VM state before writing to per-thread recorders.
+ * 5. JavaThreads that are running in VM state do not need any lock and
+ *    records are written to per-thread recorders.
+ * 6. For a thread has yet to attach VM 'Thread', they need to take
+ *    ThreadCritical to write to global recorder.
+ *
+ *    Important note:
+ *    NO LOCK should be taken inside ThreadCritical lock !!!
+ */
+void MemTracker::create_memory_record(address addr, MEMFLAGS flags,
+    size_t size, address pc, Thread* thread) {
+  if (!shutdown_in_progress()) {
+    // single thread, we just write records direct to global recorder,'
+    // with any lock
+    if (_state == NMT_bootstrapping_single_thread) {
+      assert(_main_thread_tid == os::current_thread_id(), "wrong thread");
+      thread = NULL;
+    } else {
+      if (thread == NULL) {
+          // don't use Thread::current(), since it is possible that
+          // the calling thread has yet to attach to VM 'Thread',
+          // which will result assertion failure
+          thread = ThreadLocalStorage::thread();
+      }
+    }
+
+    if (thread != NULL) {
+      if (thread->is_Java_thread() && ((JavaThread*)thread)->is_safepoint_visible()) {
+        JavaThread*      java_thread = static_cast<JavaThread*>(thread);
+        JavaThreadState  state = java_thread->thread_state();
+        if (SafepointSynchronize::safepoint_safe(java_thread, state)) {
+          // JavaThreads that are safepoint safe, can run through safepoint,
+          // so ThreadCritical is needed to ensure no threads at safepoint create
+          // new records while the records are being gathered and the sequence number is changing
+          ThreadCritical tc;
+          create_record_in_recorder(addr, flags, size, pc, java_thread);
+        } else {
+          create_record_in_recorder(addr, flags, size, pc, java_thread);
+        }
+      } else {
+        // other threads, such as worker and watcher threads, etc. need to
+        // take ThreadCritical to write to global recorder
+        ThreadCritical tc;
+        create_record_in_recorder(addr, flags, size, pc, NULL);
+      }
+    } else {
+      if (_state == NMT_bootstrapping_single_thread) {
+        // single thread, no lock needed
+        create_record_in_recorder(addr, flags, size, pc, NULL);
+      } else {
+        // for thread has yet to attach VM 'Thread', we can not use VM mutex.
+        // use native thread critical instead
+        ThreadCritical tc;
+        create_record_in_recorder(addr, flags, size, pc, NULL);
+      }
+    }
+  }
+}
+
+// write a record to proper recorder. No lock can be taken from this method
+// down.
+void MemTracker::create_record_in_recorder(address addr, MEMFLAGS flags,
+    size_t size, address pc, JavaThread* thread) {
+
+    MemRecorder* rc = get_thread_recorder(thread);
+    if (rc != NULL) {
+      rc->record(addr, flags, size, pc);
+    }
+}
+
+/**
+ * enqueue a recorder to pending queue
+ */
+void MemTracker::enqueue_pending_recorder(MemRecorder* rec) {
+  assert(rec != NULL, "null recorder");
+
+  // we are shutting down, so just delete it
+  if (shutdown_in_progress()) {
+    rec->set_next(NULL);
+    delete rec;
+    return;
+  }
+
+  MemRecorder* cur_head = const_cast<MemRecorder*>(_merge_pending_queue);
+  rec->set_next(cur_head);
+  while ((void*)cur_head != Atomic::cmpxchg_ptr((void*)rec, (void*)&_merge_pending_queue,
+    (void*)cur_head)) {
+    cur_head = const_cast<MemRecorder*>(_merge_pending_queue);
+    rec->set_next(cur_head);
+  }
+  debug_only(Atomic::inc(&_pending_recorder_count);)
+}
+
+/*
+ * The method is called at global safepoint
+ * during it synchronization process.
+ *   1. enqueue all JavaThreads' per-thread recorders
+ *   2. enqueue global recorder
+ *   3. retrieve all pending recorders
+ *   4. reset global sequence number generator
+ *   5. call worker's sync
+ */
+#define MAX_SAFEPOINTS_TO_SKIP     128
+#define SAFE_SEQUENCE_THRESHOLD    30
+#define HIGH_GENERATION_THRESHOLD  60
+
+void MemTracker::sync() {
+  assert(_tracking_level > NMT_off, "NMT is not enabled");
+  assert(SafepointSynchronize::is_at_safepoint(), "Safepoint required");
+
+  // Some GC tests hit large number of safepoints in short period of time
+  // without meaningful activities. We should prevent going to
+  // sync point in these cases, which can potentially exhaust generation buffer.
+  // Here is the factots to determine if we should go into sync point:
+  // 1. not to overflow sequence number
+  // 2. if we are in danger to overflow generation buffer
+  // 3. how many safepoints we already skipped sync point
+  if (_state == NMT_started) {
+    // worker thread is not ready, no one can manage generation
+    // buffer, so skip this safepoint
+    if (_worker_thread == NULL) return;
+
+    if (_sync_point_skip_count < MAX_SAFEPOINTS_TO_SKIP) {
+      int per_seq_in_use = SequenceGenerator::peek() * 100 / max_jint;
+      int per_gen_in_use = _worker_thread->generations_in_use() * 100 / MAX_GENERATIONS;
+      if (per_seq_in_use < SAFE_SEQUENCE_THRESHOLD && per_gen_in_use >= HIGH_GENERATION_THRESHOLD) {
+        _sync_point_skip_count ++;
+        return;
+      }
+    }
+    _sync_point_skip_count = 0;
+    {
+      // This method is running at safepoint, with ThreadCritical lock,
+      // it should guarantee that NMT is fully sync-ed.
+      ThreadCritical tc;
+
+      // walk all JavaThreads to collect recorders
+      SyncThreadRecorderClosure stc;
+      Threads::threads_do(&stc);
+
+      _thread_count = stc.get_thread_count();
+      MemRecorder* pending_recorders = get_pending_recorders();
+
+      if (_global_recorder != NULL) {
+        _global_recorder->set_next(pending_recorders);
+        pending_recorders = _global_recorder;
+        _global_recorder = NULL;
+      }
+      SequenceGenerator::reset();
+      // check _worker_thread with lock to avoid racing condition
+      if (_worker_thread != NULL) {
+        _worker_thread->at_sync_point(pending_recorders);
+      }
+    }
+  }
+
+  // now, it is the time to shut whole things off
+  if (_state == NMT_final_shutdown) {
+    // walk all JavaThreads to delete all recorders
+    SyncThreadRecorderClosure stc;
+    Threads::threads_do(&stc);
+    // delete global recorder
+    {
+      ThreadCritical tc;
+      if (_global_recorder != NULL) {
+        delete _global_recorder;
+        _global_recorder = NULL;
+      }
+    }
+    MemRecorder* pending_recorders = get_pending_recorders();
+    if (pending_recorders != NULL) {
+      delete pending_recorders;
+    }
+    // try at a later sync point to ensure MemRecorder instance drops to zero to
+    // completely shutdown NMT
+    if (MemRecorder::_instance_count == 0) {
+      _state = NMT_shutdown;
+      _tracking_level = NMT_off;
+    }
+  }
+}
+
+/*
+ * Start worker thread.
+ */
+bool MemTracker::start_worker() {
+  assert(_worker_thread == NULL, "Just Check");
+  _worker_thread = new (std::nothrow) MemTrackWorker();
+  if (_worker_thread == NULL || _worker_thread->has_error()) {
+    shutdown(NMT_initialization);
+    return false;
+  }
+  _worker_thread->start();
+  return true;
+}
+
+/*
+ * We need to collect a JavaThread's per-thread recorder
+ * before it exits.
+ */
+void MemTracker::thread_exiting(JavaThread* thread) {
+  if (is_on()) {
+    MemRecorder* rec = thread->get_recorder();
+    if (rec != NULL) {
+      enqueue_pending_recorder(rec);
+      thread->set_recorder(NULL);
+    }
+  }
+}
+
+// baseline current memory snapshot
+bool MemTracker::baseline() {
+  MutexLockerEx lock(_query_lock, true);
+  MemSnapshot* snapshot = get_snapshot();
+  if (snapshot != NULL) {
+    return _baseline.baseline(*snapshot, false);
+  }
+  return false;
+}
+
+// print memory usage from current snapshot
+bool MemTracker::print_memory_usage(BaselineOutputer& out, size_t unit, bool summary_only) {
+  MemBaseline  baseline;
+  MutexLockerEx lock(_query_lock, true);
+  MemSnapshot* snapshot = get_snapshot();
+  if (snapshot != NULL && baseline.baseline(*snapshot, summary_only)) {
+    BaselineReporter reporter(out, unit);
+    reporter.report_baseline(baseline, summary_only);
+    return true;
+  }
+  return false;
+}
+
+// compare memory usage between current snapshot and baseline
+bool MemTracker::compare_memory_usage(BaselineOutputer& out, size_t unit, bool summary_only) {
+  MutexLockerEx lock(_query_lock, true);
+  if (_baseline.baselined()) {
+    MemBaseline baseline;
+    MemSnapshot* snapshot = get_snapshot();
+    if (snapshot != NULL && baseline.baseline(*snapshot, summary_only)) {
+      BaselineReporter reporter(out, unit);
+      reporter.diff_baselines(baseline, _baseline, summary_only);
+      return true;
+    }
+  }
+  return false;
+}
+
+#ifndef PRODUCT
+void MemTracker::walk_stack(int toSkip, char* buf, int len) {
+  int cur_len = 0;
+  char tmp[1024];
+  address pc;
+
+  while (cur_len < len) {
+    pc = os::get_caller_pc(toSkip + 1);
+    if (pc != NULL && os::dll_address_to_function_name(pc, tmp, sizeof(tmp), NULL)) {
+      jio_snprintf(&buf[cur_len], (len - cur_len), "%s\n", tmp);
+      cur_len = (int)strlen(buf);
+    } else {
+      buf[cur_len] = '\0';
+      break;
+    }
+    toSkip ++;
+  }
+}
+
+void MemTracker::print_tracker_stats(outputStream* st) {
+  st->print_cr("\nMemory Tracker Stats:");
+  st->print_cr("\tMax sequence number = %d", SequenceGenerator::max_seq_num());
+  st->print_cr("\tthead count = %d", _thread_count);
+  st->print_cr("\tArena instance = %d", Arena::_instance_count);
+  st->print_cr("\tpooled recorder count = %d", _pooled_recorder_count);
+  st->print_cr("\tqueued recorder count = %d", _pending_recorder_count);
+  st->print_cr("\tmemory recorder instance count = %d", MemRecorder::_instance_count);
+  if (_worker_thread != NULL) {
+    st->print_cr("\tWorker thread:");
+    st->print_cr("\t\tSync point count = %d", _worker_thread->_sync_point_count);
+    st->print_cr("\t\tpending recorder count = %d", _worker_thread->count_pending_recorders());
+    st->print_cr("\t\tmerge count = %d", _worker_thread->_merge_count);
+  } else {
+    st->print_cr("\tWorker thread is not started");
+  }
+  st->print_cr(" ");
+
+  if (_snapshot != NULL) {
+    _snapshot->print_snapshot_stats(st);
+  } else {
+    st->print_cr("No snapshot");
+  }
+}
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/services/memTracker.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,386 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_SERVICES_MEM_TRACKER_HPP
+#define SHARE_VM_SERVICES_MEM_TRACKER_HPP
+
+#include "memory/allocation.hpp"
+#include "runtime/globals.hpp"
+#include "runtime/mutex.hpp"
+#include "runtime/os.hpp"
+#include "runtime/thread.hpp"
+#include "services/memPtr.hpp"
+#include "services/memRecorder.hpp"
+#include "services/memSnapshot.hpp"
+#include "services/memTrackWorker.hpp"
+
+#ifdef SOLARIS
+#include "thread_solaris.inline.hpp"
+#endif
+
+#ifdef _DEBUG_
+  #define DEBUG_CALLER_PC  os::get_caller_pc(3)
+#else
+  #define DEBUG_CALLER_PC  0
+#endif
+
+// The thread closure walks threads to collect per-thread
+// memory recorders at NMT sync point
+class SyncThreadRecorderClosure : public ThreadClosure {
+ private:
+  int _thread_count;
+
+ public:
+  SyncThreadRecorderClosure() {
+    _thread_count =0;
+  }
+
+  void do_thread(Thread* thread);
+  int  get_thread_count() const {
+    return _thread_count;
+  }
+};
+
+class BaselineOutputer;
+class MemSnapshot;
+class MemTrackWorker;
+class Thread;
+/*
+ * MemTracker is the 'gate' class to native memory tracking runtime.
+ */
+class MemTracker : AllStatic {
+  friend class MemTrackWorker;
+  friend class MemSnapshot;
+  friend class SyncThreadRecorderClosure;
+
+  // NMT state
+  enum NMTStates {
+    NMT_uninited,                        // not yet initialized
+    NMT_bootstrapping_single_thread,     // bootstrapping, VM is in single thread mode
+    NMT_bootstrapping_multi_thread,      // bootstrapping, VM is about to enter multi-thread mode
+    NMT_started,                         // NMT fully started
+    NMT_shutdown_pending,                // shutdown pending
+    NMT_final_shutdown,                  // in final phase of shutdown
+    NMT_shutdown                         // shutdown
+  };
+
+
+  // native memory tracking level
+  enum NMTLevel {
+    NMT_off,              // native memory tracking is off
+    NMT_summary,          // don't track callsite
+    NMT_detail            // track callsite also
+  };
+
+ public:
+   enum ShutdownReason {
+     NMT_shutdown_none,     // no shutdown requested
+     NMT_shutdown_user,     // user requested shutdown
+     NMT_normal,            // normal shutdown, process exit
+     NMT_out_of_memory,     // shutdown due to out of memory
+     NMT_initialization,    // shutdown due to initialization failure
+     NMT_use_malloc_only,   // can not combine NMT with UseMallocOnly flag
+     NMT_error_reporting,   // shutdown by vmError::report_and_die()
+     NMT_out_of_generation, // running out of generation queue
+     NMT_sequence_overflow  // overflow the sequence number
+   };
+
+ public:
+  // initialize NMT tracking level from command line options, called
+   // from VM command line parsing code
+  static void init_tracking_options(const char* option_line);
+
+  // if NMT is enabled to record memory activities
+  static inline bool is_on() {
+    return (_tracking_level >= NMT_summary &&
+      _state >= NMT_bootstrapping_single_thread);
+  }
+
+  // user readable reason for shutting down NMT
+  static const char* reason() {
+    switch(_reason) {
+      case NMT_shutdown_none:
+        return "Native memory tracking is not enabled";
+      case NMT_shutdown_user:
+        return "Native memory tracking has been shutdown by user";
+      case NMT_normal:
+        return "Native memory tracking has been shutdown due to process exiting";
+      case NMT_out_of_memory:
+        return "Native memory tracking has been shutdown due to out of native memory";
+      case NMT_initialization:
+        return "Native memory tracking failed to initialize";
+      case NMT_error_reporting:
+        return "Native memory tracking has been shutdown due to error reporting";
+      case NMT_out_of_generation:
+        return "Native memory tracking has been shutdown due to running out of generation buffer";
+      case NMT_sequence_overflow:
+        return "Native memory tracking has been shutdown due to overflow the sequence number";
+      case NMT_use_malloc_only:
+        return "Native memory tracking is not supported when UseMallocOnly is on";
+      default:
+        ShouldNotReachHere();
+        return NULL;
+    }
+  }
+
+  // test if we can walk native stack
+  static bool can_walk_stack() {
+  // native stack is not walkable during bootstrapping on sparc
+#if defined(SPARC)
+    return (_state == NMT_started);
+#else
+    return (_state >= NMT_bootstrapping_single_thread && _state  <= NMT_started);
+#endif
+  }
+
+  // if native memory tracking tracks callsite
+  static inline bool track_callsite() { return _tracking_level == NMT_detail; }
+
+  // shutdown native memory tracking capability. Native memory tracking
+  // can be shutdown by VM when it encounters low memory scenarios.
+  // Memory tracker should gracefully shutdown itself, and preserve the
+  // latest memory statistics for post morten diagnosis.
+  static void shutdown(ShutdownReason reason);
+
+  // if there is shutdown requested
+  static inline bool shutdown_in_progress() {
+    return (_state >= NMT_shutdown_pending);
+  }
+
+  // bootstrap native memory tracking, so it can start to collect raw data
+  // before worker thread can start
+
+  // the first phase of bootstrapping, when VM still in single-threaded mode
+  static void bootstrap_single_thread();
+  // the second phase of bootstrapping, VM is about or already in multi-threaded mode
+  static void bootstrap_multi_thread();
+
+
+  // start() has to be called when VM still in single thread mode, but after
+  // command line option parsing is done.
+  static void start();
+
+  // record a 'malloc' call
+  static inline void record_malloc(address addr, size_t size, MEMFLAGS flags,
+                            address pc = 0, Thread* thread = NULL) {
+    assert(is_on(), "check by caller");
+    if (NMT_CAN_TRACK(flags)) {
+      create_memory_record(addr, (flags|MemPointerRecord::malloc_tag()), size, pc, thread);
+    }
+  }
+  // record a 'free' call
+  static inline void record_free(address addr, MEMFLAGS flags, Thread* thread = NULL) {
+    if (is_on() && NMT_CAN_TRACK(flags)) {
+      create_memory_record(addr, MemPointerRecord::free_tag(), 0, 0, thread);
+    }
+  }
+  // record a 'realloc' call
+  static inline void record_realloc(address old_addr, address new_addr, size_t size,
+       MEMFLAGS flags, address pc = 0, Thread* thread = NULL) {
+    if (is_on()) {
+      record_free(old_addr, flags, thread);
+      record_malloc(new_addr, size, flags, pc, thread);
+    }
+  }
+
+  // record arena size
+  static inline void record_arena_size(address addr, size_t size) {
+    // we add a positive offset to arena address, so we can have arena size record
+    // sorted after arena record
+    if (is_on() && !UseMallocOnly) {
+      create_memory_record((addr + sizeof(void*)), MemPointerRecord::arena_size_tag(), size,
+        0, NULL);
+    }
+  }
+
+  // record a virtual memory 'reserve' call
+  static inline void record_virtual_memory_reserve(address addr, size_t size,
+                            address pc = 0, Thread* thread = NULL) {
+    if (is_on()) {
+      assert(size > 0, "reserve szero size");
+      create_memory_record(addr, MemPointerRecord::virtual_memory_reserve_tag(),
+                           size, pc, thread);
+    }
+  }
+
+  // record a virtual memory 'commit' call
+  static inline void record_virtual_memory_commit(address addr, size_t size,
+                            address pc = 0, Thread* thread = NULL) {
+    if (is_on()) {
+      create_memory_record(addr, MemPointerRecord::virtual_memory_commit_tag(),
+                           size, pc, thread);
+    }
+  }
+
+  // record a virtual memory 'uncommit' call
+  static inline void record_virtual_memory_uncommit(address addr, size_t size,
+                            Thread* thread = NULL) {
+    if (is_on()) {
+      create_memory_record(addr, MemPointerRecord::virtual_memory_uncommit_tag(),
+                           size, 0, thread);
+    }
+  }
+
+  // record a virtual memory 'release' call
+  static inline void record_virtual_memory_release(address addr, size_t size,
+                            Thread* thread = NULL) {
+    if (is_on()) {
+      create_memory_record(addr, MemPointerRecord::virtual_memory_release_tag(),
+                           size, 0, thread);
+    }
+  }
+
+  // record memory type on virtual memory base address
+  static inline void record_virtual_memory_type(address base, MEMFLAGS flags,
+                            Thread* thread = NULL) {
+    if (is_on()) {
+      assert(base > 0, "wrong base address");
+      assert((flags & (~mt_masks)) == 0, "memory type only");
+      create_memory_record(base, (flags | MemPointerRecord::virtual_memory_type_tag()),
+                           0, 0, thread);
+    }
+  }
+
+
+  // create memory baseline of current memory snapshot
+  static bool baseline();
+  // is there a memory baseline
+  static bool has_baseline() {
+    return _baseline.baselined();
+  }
+
+  // print memory usage from current snapshot
+  static bool print_memory_usage(BaselineOutputer& out, size_t unit,
+           bool summary_only = true);
+  // compare memory usage between current snapshot and baseline
+  static bool compare_memory_usage(BaselineOutputer& out, size_t unit,
+           bool summary_only = true);
+
+  // sync is called within global safepoint to synchronize nmt data
+  static void sync();
+
+  // called when a thread is about to exit
+  static void thread_exiting(JavaThread* thread);
+
+  // retrieve global snapshot
+  static MemSnapshot* get_snapshot() {
+    assert(is_on(), "native memory tracking is off");
+    if (shutdown_in_progress()) {
+      return NULL;
+    }
+    return _snapshot;
+  }
+
+  // print tracker stats
+  NOT_PRODUCT(static void print_tracker_stats(outputStream* st);)
+  NOT_PRODUCT(static void walk_stack(int toSkip, char* buf, int len);)
+
+ private:
+  // start native memory tracking worker thread
+  static bool start_worker();
+
+  // called by worker thread to complete shutdown process
+  static void final_shutdown();
+
+ protected:
+  // retrieve per-thread recorder of the specified thread.
+  // if the recorder is full, it will be enqueued to overflow
+  // queue, a new recorder is acquired from recorder pool or a
+  // new instance is created.
+  // when thread == NULL, it means global recorder
+  static MemRecorder* get_thread_recorder(JavaThread* thread);
+
+  // per-thread recorder pool
+  static void release_thread_recorder(MemRecorder* rec);
+  static void delete_all_pooled_recorders();
+
+  // pending recorder queue. Recorders are queued to pending queue
+  // when they are overflowed or collected at nmt sync point.
+  static void enqueue_pending_recorder(MemRecorder* rec);
+  static MemRecorder* get_pending_recorders();
+  static void delete_all_pending_recorders();
+
+ private:
+  // retrieve a pooled memory record or create new one if there is not
+  // one available
+  static MemRecorder* get_new_or_pooled_instance();
+  static void create_memory_record(address addr, MEMFLAGS type,
+                   size_t size, address pc, Thread* thread);
+  static void create_record_in_recorder(address addr, MEMFLAGS type,
+                   size_t size, address pc, JavaThread* thread);
+
+ private:
+  // global memory snapshot
+  static MemSnapshot*     _snapshot;
+
+  // a memory baseline of snapshot
+  static MemBaseline      _baseline;
+
+  // query lock
+  static Mutex*           _query_lock;
+
+  // a thread can start to allocate memory before it is attached
+  // to VM 'Thread', those memory activities are recorded here.
+  // ThreadCritical is required to guard this global recorder.
+  static MemRecorder*     _global_recorder;
+
+  // main thread id
+  debug_only(static intx   _main_thread_tid;)
+
+  // pending recorders to be merged
+  static volatile MemRecorder*      _merge_pending_queue;
+
+  NOT_PRODUCT(static volatile jint   _pending_recorder_count;)
+
+  // pooled memory recorders
+  static volatile MemRecorder*      _pooled_recorders;
+
+  // memory recorder pool management, uses following
+  // counter to determine if a released memory recorder
+  // should be pooled
+
+  // latest thread count
+  static int               _thread_count;
+  // pooled recorder count
+  static volatile jint     _pooled_recorder_count;
+
+
+  // worker thread to merge pending recorders into snapshot
+  static MemTrackWorker*  _worker_thread;
+
+  // how many safepoints we skipped without entering sync point
+  static int              _sync_point_skip_count;
+
+  // if the tracker is properly intialized
+  static bool             _is_tracker_ready;
+  // tracking level (off, summary and detail)
+  static enum NMTLevel    _tracking_level;
+
+  // current nmt state
+  static volatile enum NMTStates   _state;
+  // the reason for shutting down nmt
+  static enum ShutdownReason       _reason;
+};
+
+#endif // SHARE_VM_SERVICES_MEM_TRACKER_HPP
--- a/src/share/vm/services/memoryManager.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/services/memoryManager.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -166,15 +166,15 @@
 
 GCStatInfo::GCStatInfo(int num_pools) {
   // initialize the arrays for memory usage
-  _before_gc_usage_array = (MemoryUsage*) NEW_C_HEAP_ARRAY(MemoryUsage, num_pools);
-  _after_gc_usage_array  = (MemoryUsage*) NEW_C_HEAP_ARRAY(MemoryUsage, num_pools);
+  _before_gc_usage_array = (MemoryUsage*) NEW_C_HEAP_ARRAY(MemoryUsage, num_pools, mtInternal);
+  _after_gc_usage_array  = (MemoryUsage*) NEW_C_HEAP_ARRAY(MemoryUsage, num_pools, mtInternal);
   _usage_array_size = num_pools;
   clear();
 }
 
 GCStatInfo::~GCStatInfo() {
-  FREE_C_HEAP_ARRAY(MemoryUsage*, _before_gc_usage_array);
-  FREE_C_HEAP_ARRAY(MemoryUsage*, _after_gc_usage_array);
+  FREE_C_HEAP_ARRAY(MemoryUsage*, _before_gc_usage_array, mtInternal);
+  FREE_C_HEAP_ARRAY(MemoryUsage*, _after_gc_usage_array, mtInternal);
 }
 
 void GCStatInfo::set_gc_usage(int pool_index, MemoryUsage usage, bool before_gc) {
@@ -214,8 +214,8 @@
 
 void GCMemoryManager::initialize_gc_stat_info() {
   assert(MemoryService::num_memory_pools() > 0, "should have one or more memory pools");
-  _last_gc_stat = new(ResourceObj::C_HEAP) GCStatInfo(MemoryService::num_memory_pools());
-  _current_gc_stat = new(ResourceObj::C_HEAP) GCStatInfo(MemoryService::num_memory_pools());
+  _last_gc_stat = new(ResourceObj::C_HEAP, mtGC) GCStatInfo(MemoryService::num_memory_pools());
+  _current_gc_stat = new(ResourceObj::C_HEAP, mtGC) GCStatInfo(MemoryService::num_memory_pools());
   // tracking concurrent collections we need two objects: one to update, and one to
   // hold the publicly available "last (completed) gc" information.
 }
--- a/src/share/vm/services/memoryManager.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/services/memoryManager.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -40,7 +40,7 @@
 class GCMemoryManager;
 class OopClosure;
 
-class MemoryManager : public CHeapObj {
+class MemoryManager : public CHeapObj<mtInternal> {
 private:
   enum {
     max_num_pools = 10
--- a/src/share/vm/services/memoryPool.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/services/memoryPool.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -50,7 +50,7 @@
 class PermGen;
 class ThresholdSupport;
 
-class MemoryPool : public CHeapObj {
+class MemoryPool : public CHeapObj<mtInternal> {
   friend class MemoryManager;
  public:
   enum PoolType {
--- a/src/share/vm/services/memoryService.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/services/memoryService.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -58,9 +58,9 @@
 #endif
 
 GrowableArray<MemoryPool*>* MemoryService::_pools_list =
-  new (ResourceObj::C_HEAP) GrowableArray<MemoryPool*>(init_pools_list_size, true);
+  new (ResourceObj::C_HEAP, mtInternal) GrowableArray<MemoryPool*>(init_pools_list_size, true);
 GrowableArray<MemoryManager*>* MemoryService::_managers_list =
-  new (ResourceObj::C_HEAP) GrowableArray<MemoryManager*>(init_managers_list_size, true);
+  new (ResourceObj::C_HEAP, mtInternal) GrowableArray<MemoryManager*>(init_managers_list_size, true);
 
 GCMemoryManager* MemoryService::_minor_gc_manager = NULL;
 GCMemoryManager* MemoryService::_major_gc_manager = NULL;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/services/nmtDCmd.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,172 @@
+/*
+ * 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.
+ *
+ */
+#include "precompiled.hpp"
+#include "services/nmtDCmd.hpp"
+#include "services/memReporter.hpp"
+#include "services/memTracker.hpp"
+#include "utilities/globalDefinitions.hpp"
+
+NMTDCmd::NMTDCmd(outputStream* output,
+  bool heap): DCmdWithParser(output, heap),
+  _summary("summary", "request runtime to report current memory summary, " \
+           "which includes total reserved and committed memory, along " \
+           "with memory usage summary by each subsytem.",
+           "BOOLEAN", false, "false"),
+  _detail("detail", "request runtime to report memory allocation >= "
+           "1K by each callsite.",
+           "BOOLEAN", false, "false"),
+  _baseline("baseline", "request runtime to baseline current memory usage, " \
+            "so it can be compared against in later time.",
+            "BOOLEAN", false, "false"),
+  _summary_diff("summary.diff", "request runtime to report memory summary " \
+            "comparison against previous baseline.",
+            "BOOLEAN", false, "false"),
+  _detail_diff("detail.diff", "request runtime to report memory detail " \
+            "comparison against previous baseline, which shows the memory " \
+            "allocation activities at different callsites.",
+            "BOOLEAN", false, "false"),
+  _shutdown("shutdown", "request runtime to shutdown itself and free the " \
+            "memory used by runtime.",
+            "BOOLEAN", false, "false"),
+#ifndef PRODUCT
+  _debug("debug", "print tracker statistics. Debug only, not thread safe", \
+            "BOOLEAN", false, "false"),
+#endif
+  _scale("scale", "Memory usage in which scale, KB, MB or GB",
+       "STRING", false, "KB") {
+  _dcmdparser.add_dcmd_option(&_summary);
+  _dcmdparser.add_dcmd_option(&_detail);
+  _dcmdparser.add_dcmd_option(&_baseline);
+  _dcmdparser.add_dcmd_option(&_summary_diff);
+  _dcmdparser.add_dcmd_option(&_detail_diff);
+  _dcmdparser.add_dcmd_option(&_shutdown);
+#ifndef PRODUCT
+  _dcmdparser.add_dcmd_option(&_debug);
+#endif
+  _dcmdparser.add_dcmd_option(&_scale);
+}
+
+void NMTDCmd::execute(TRAPS) {
+  const char* scale_value = _scale.value();
+  size_t scale_unit;
+  if (strcmp(scale_value, "KB") == 0 || strcmp(scale_value, "kb") == 0) {
+    scale_unit = K;
+  } else if (strcmp(scale_value, "MB") == 0 ||
+             strcmp(scale_value, "mb") == 0) {
+    scale_unit = M;
+  } else if (strcmp(scale_value, "GB") == 0 ||
+             strcmp(scale_value, "gb") == 0) {
+    scale_unit = G;
+  } else {
+    output()->print_cr("Incorrect scale value: %s", scale_value);
+    return;
+  }
+
+  int nopt = 0;
+  if(_summary.is_set()) { ++nopt; }
+  if(_detail.is_set()) { ++nopt; }
+  if(_baseline.is_set()) { ++nopt; }
+  if(_summary_diff.is_set()) { ++nopt; }
+  if(_detail_diff.is_set()) { ++nopt; }
+  if(_shutdown.is_set()) { ++nopt; }
+#ifndef PRODUCT
+  if(_debug.is_set()) { ++nopt; }
+#endif
+
+  if(nopt > 1) {
+      output()->print_cr("At most one of the following option can be specified: " \
+        "summary, detail, baseline, summary.diff, detail.diff, shutdown"
+#ifndef PRODUCT
+        " ,debug"
+#endif
+      );
+      return;
+  }
+
+  if(nopt == 0) {
+      _summary.set_value(true);
+  }
+
+#ifndef PRODUCT
+  if (_debug.value()) {
+    output()->print_cr("debug command is NOT thread-safe, may cause crash");
+    MemTracker::print_tracker_stats(output());
+    return;
+  }
+#endif
+
+  // native memory tracking has to be on
+  if (!MemTracker::is_on() || MemTracker::shutdown_in_progress()) {
+    // if it is not on, what's the reason?
+    output()->print_cr(MemTracker::reason());
+    return;
+  }
+
+  if (_summary.value()) {
+    BaselineTTYOutputer outputer(output());
+    MemTracker::print_memory_usage(outputer, scale_unit, true);
+  } else if (_detail.value()) {
+    BaselineTTYOutputer outputer(output());
+    MemTracker::print_memory_usage(outputer, scale_unit, false);
+  } else if (_baseline.value()) {
+    if (MemTracker::baseline()) {
+      output()->print_cr("Successfully baselined.");
+    } else {
+      output()->print_cr("Baseline failed.");
+    }
+  } else if (_summary_diff.value()) {
+    if (MemTracker::has_baseline()) {
+      BaselineTTYOutputer outputer(output());
+      MemTracker::compare_memory_usage(outputer, scale_unit, true);
+    } else {
+      output()->print_cr("No baseline to compare, run 'baseline' command first");
+    }
+  } else if (_detail_diff.value()) {
+    if (MemTracker::has_baseline()) {
+      BaselineTTYOutputer outputer(output());
+      MemTracker::compare_memory_usage(outputer, scale_unit, false);
+    } else {
+      output()->print_cr("No baseline to compare to, run 'baseline' command first");
+    }
+  } else if (_shutdown.value()) {
+    MemTracker::shutdown(MemTracker::NMT_shutdown_user);
+    output()->print_cr("Shutdown is in progress, it will take a few moments to " \
+      "completely shutdown");
+  } else {
+    ShouldNotReachHere();
+    output()->print_cr("Unknown command");
+  }
+}
+
+int NMTDCmd::num_arguments() {
+  ResourceMark rm;
+  NMTDCmd* dcmd = new NMTDCmd(NULL, false);
+  if (dcmd != NULL) {
+    DCmdMark mark(dcmd);
+    return dcmd->_dcmdparser.num_arguments();
+  } else {
+    return 0;
+  }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/services/nmtDCmd.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,60 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_SERVICES_NMT_DCMD_HPP
+#define SHARE_VM_SERVICES_NMT_DCMD_HPP
+
+#include "services/diagnosticArgument.hpp"
+#include "services/diagnosticFramework.hpp"
+
+/**
+ * Native memory tracking DCmd implementation
+ */
+class NMTDCmd: public DCmdWithParser {
+ protected:
+  DCmdArgument<bool>  _summary;
+  DCmdArgument<bool>  _detail;
+  DCmdArgument<bool>  _baseline;
+  DCmdArgument<bool>  _summary_diff;
+  DCmdArgument<bool>  _detail_diff;
+  DCmdArgument<bool>  _shutdown;
+#ifndef PRODUCT
+  DCmdArgument<bool>  _debug;
+#endif
+  DCmdArgument<char*> _scale;
+
+ public:
+  NMTDCmd(outputStream* output, bool heap);
+  static const char* name() { return "VM.native_memory"; }
+  static const char* description() {
+    return "Print native memory usage";
+  }
+  static const char* impact() {
+    return "Medium:";
+  }
+  static int num_arguments();
+  virtual void execute(TRAPS);
+};
+
+#endif // SHARE_VM_SERVICES_NMT_DCMD_HPP
--- a/src/share/vm/services/threadService.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/services/threadService.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -437,7 +437,7 @@
     GrowableArray<MonitorInfo*>* list = jvf->locked_monitors();
     int length = list->length();
     if (length > 0) {
-      _locked_monitors = new (ResourceObj::C_HEAP) GrowableArray<oop>(length, true);
+      _locked_monitors = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<oop>(length, true);
       for (int i = 0; i < length; i++) {
         MonitorInfo* monitor = list->at(i);
         assert(monitor->owner(), "This monitor must have an owning object");
@@ -491,11 +491,11 @@
 
 ThreadStackTrace::ThreadStackTrace(JavaThread* t, bool with_locked_monitors) {
   _thread = t;
-  _frames = new (ResourceObj::C_HEAP) GrowableArray<StackFrameInfo*>(INITIAL_ARRAY_SIZE, true);
+  _frames = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<StackFrameInfo*>(INITIAL_ARRAY_SIZE, true);
   _depth = 0;
   _with_locked_monitors = with_locked_monitors;
   if (_with_locked_monitors) {
-    _jni_locked_monitors = new (ResourceObj::C_HEAP) GrowableArray<oop>(INITIAL_ARRAY_SIZE, true);
+    _jni_locked_monitors = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<oop>(INITIAL_ARRAY_SIZE, true);
   } else {
     _jni_locked_monitors = NULL;
   }
@@ -689,7 +689,7 @@
 
 ThreadConcurrentLocks::ThreadConcurrentLocks(JavaThread* thread) {
   _thread = thread;
-  _owned_locks = new (ResourceObj::C_HEAP) GrowableArray<instanceOop>(INITIAL_ARRAY_SIZE, true);
+  _owned_locks = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<instanceOop>(INITIAL_ARRAY_SIZE, true);
   _next = NULL;
 }
 
@@ -803,7 +803,7 @@
 
 DeadlockCycle::DeadlockCycle() {
   _is_deadlock = false;
-  _threads = new (ResourceObj::C_HEAP) GrowableArray<JavaThread*>(INITIAL_ARRAY_SIZE, true);
+  _threads = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<JavaThread*>(INITIAL_ARRAY_SIZE, true);
   _next = NULL;
 }
 
--- a/src/share/vm/services/threadService.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/services/threadService.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -116,7 +116,7 @@
 };
 
 // Per-thread Statistics for synchronization
-class ThreadStatistics : public CHeapObj {
+class ThreadStatistics : public CHeapObj<mtInternal> {
 private:
   // The following contention statistics are only updated by
   // the thread owning these statistics when contention occurs.
@@ -186,7 +186,7 @@
 };
 
 // Thread snapshot to represent the thread state and statistics
-class ThreadSnapshot : public CHeapObj {
+class ThreadSnapshot : public CHeapObj<mtInternal> {
 private:
   JavaThread* _thread;
   oop         _threadObj;
@@ -244,7 +244,7 @@
   void        oops_do(OopClosure* f);
 };
 
-class ThreadStackTrace : public CHeapObj {
+class ThreadStackTrace : public CHeapObj<mtInternal> {
  private:
   JavaThread*                     _thread;
   int                             _depth;  // number of stack frames added
@@ -275,7 +275,7 @@
 // StackFrameInfo for keeping methodOop and bci during
 // stack walking for later construction of StackTraceElement[]
 // Java instances
-class StackFrameInfo : public CHeapObj {
+class StackFrameInfo : public CHeapObj<mtInternal> {
  private:
   methodOop           _method;
   int                 _bci;
@@ -299,7 +299,7 @@
   void      print_on(outputStream* st) const;
 };
 
-class ThreadConcurrentLocks : public CHeapObj {
+class ThreadConcurrentLocks : public CHeapObj<mtInternal> {
 private:
   GrowableArray<instanceOop>* _owned_locks;
   ThreadConcurrentLocks*      _next;
@@ -356,7 +356,7 @@
   void                 oops_do(OopClosure* f);
 };
 
-class DeadlockCycle : public CHeapObj {
+class DeadlockCycle : public CHeapObj<mtInternal> {
  private:
   bool _is_deadlock;
   GrowableArray<JavaThread*>* _threads;
--- a/src/share/vm/utilities/array.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/array.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -49,7 +49,7 @@
 void ResourceArray::sort(size_t esize, ftype f) {
   if (!is_empty()) qsort(_data, length(), esize, f);
 }
-void CHeapArray::sort(size_t esize, ftype f) {
+template <MEMFLAGS F> void CHeapArray<F>::sort(size_t esize, ftype f) {
   if (!is_empty()) qsort(_data, length(), esize, f);
 }
 
@@ -70,14 +70,14 @@
 }
 
 
-void CHeapArray::expand(size_t esize, int i, int& size) {
+template <MEMFLAGS F> void CHeapArray<F>::expand(size_t esize, int i, int& size) {
   // determine new size
   if (size == 0) size = 4; // prevent endless loop
   while (i >= size) size *= 2;
   // allocate and initialize new data section
-  void* data = NEW_C_HEAP_ARRAY(char*, esize * size);
+  void* data = NEW_C_HEAP_ARRAY(char*, esize * size, F);
   memcpy(data, _data, esize * length());
-  FREE_C_HEAP_ARRAY(char*, _data);
+  FREE_C_HEAP_ARRAY(char*, _data, F);
   _data = data;
 }
 
@@ -91,7 +91,7 @@
   memmove(dst, src, cnt);
 }
 
-void CHeapArray::remove_at(size_t esize, int i) {
+template <MEMFLAGS F> void CHeapArray<F>::remove_at(size_t esize, int i) {
   assert(0 <= i && i < length(), "index out of bounds");
   _length--;
   void* dst = (char*)_data + i*esize;
--- a/src/share/vm/utilities/array.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/array.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -79,7 +79,7 @@
 };
 
 
-class CHeapArray: public CHeapObj {
+template <MEMFLAGS F>class CHeapArray: public CHeapObj<F> {
  protected:
   int   _length;                                 // the number of array elements
   void* _data;                                   // the array memory
@@ -94,7 +94,7 @@
   CHeapArray(size_t esize, int length) {
     assert(length >= 0, "illegal length");
     _length  = length;
-    _data    = (void*) NEW_C_HEAP_ARRAY(char *, esize * length);
+    _data    = (void*) NEW_C_HEAP_ARRAY(char *, esize * length, F);
   }
 
 #ifdef ASSERT
--- a/src/share/vm/utilities/bitMap.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/bitMap.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -65,8 +65,8 @@
   if (in_resource_area) {
     _map = NEW_RESOURCE_ARRAY(bm_word_t, new_size_in_words);
   } else {
-    if (old_map != NULL) FREE_C_HEAP_ARRAY(bm_word_t, _map);
-    _map = NEW_C_HEAP_ARRAY(bm_word_t, new_size_in_words);
+    if (old_map != NULL) FREE_C_HEAP_ARRAY(bm_word_t, _map, mtInternal);
+    _map = NEW_C_HEAP_ARRAY(bm_word_t, new_size_in_words, mtInternal);
   }
   Copy::disjoint_words((HeapWord*)old_map, (HeapWord*) _map,
                        MIN2(old_size_in_words, new_size_in_words));
@@ -469,7 +469,7 @@
 
 void BitMap::init_pop_count_table() {
   if (_pop_count_table == NULL) {
-    BitMap::idx_t *table = NEW_C_HEAP_ARRAY(idx_t, 256);
+    BitMap::idx_t *table = NEW_C_HEAP_ARRAY(idx_t, 256, mtInternal);
     for (uint i = 0; i < 256; i++) {
       table[i] = num_set_bits(i);
     }
@@ -479,7 +479,7 @@
                                        (intptr_t)  NULL_WORD);
     if (res != NULL_WORD) {
       guarantee( _pop_count_table == (void*) res, "invariant" );
-      FREE_C_HEAP_ARRAY(bm_word_t, table);
+      FREE_C_HEAP_ARRAY(bm_word_t, table, mtInternal);
     }
   }
 }
--- a/src/share/vm/utilities/decoder.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/decoder.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -29,7 +29,7 @@
 #include "memory/allocation.hpp"
 #include "runtime/mutex.hpp"
 
-class AbstractDecoder : public CHeapObj {
+class AbstractDecoder : public CHeapObj<mtInternal> {
 public:
   // status code for decoding native C frame
   enum decoder_status {
--- a/src/share/vm/utilities/elfFile.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/elfFile.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -47,7 +47,7 @@
   m_status = NullDecoder::no_error;
 
   int len = strlen(filepath) + 1;
-  m_filepath = (const char*)os::malloc(len * sizeof(char));
+  m_filepath = (const char*)os::malloc(len * sizeof(char), mtInternal);
   if (m_filepath != NULL) {
     strcpy((char*)m_filepath, filepath);
     m_file = fopen(filepath, "r");
--- a/src/share/vm/utilities/elfFile.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/elfFile.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -82,7 +82,7 @@
 // in "error" state, so there are scenarios, lookup will fail. We want this
 // part of code to be very defensive, and bait out if anything went wrong.
 
-class ElfFile: public CHeapObj {
+class ElfFile: public CHeapObj<mtInternal> {
   friend class ElfDecoder;
  public:
   ElfFile(const char* filepath);
--- a/src/share/vm/utilities/elfStringTable.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/elfStringTable.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -42,7 +42,7 @@
 
   // try to load the string table
   long cur_offset = ftell(file);
-  m_table = (char*)os::malloc(sizeof(char) * shdr.sh_size);
+  m_table = (char*)os::malloc(sizeof(char) * shdr.sh_size, mtInternal);
   if (m_table != NULL) {
     // if there is an error, mark the error
     if (fseek(file, shdr.sh_offset, SEEK_SET) ||
--- a/src/share/vm/utilities/elfStringTable.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/elfStringTable.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -35,7 +35,7 @@
 // The string table represents a string table section in an elf file.
 // Whenever there is enough memory, it will load whole string table as
 // one blob. Otherwise, it will load string from file when requested.
-class ElfStringTable: CHeapObj {
+class ElfStringTable: CHeapObj<mtInternal> {
   friend class ElfFile;
  public:
   ElfStringTable(FILE* file, Elf_Shdr shdr, int index);
--- a/src/share/vm/utilities/elfSymbolTable.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/elfSymbolTable.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -40,7 +40,7 @@
   long cur_offset = ftell(file);
   if (cur_offset != -1) {
     // call malloc so we can back up if memory allocation fails.
-    m_symbols = (Elf_Sym*)os::malloc(shdr.sh_size);
+    m_symbols = (Elf_Sym*)os::malloc(shdr.sh_size, mtInternal);
     if (m_symbols) {
       if (fseek(file, shdr.sh_offset, SEEK_SET) ||
         fread((void*)m_symbols, shdr.sh_size, 1, file) != 1 ||
--- a/src/share/vm/utilities/elfSymbolTable.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/elfSymbolTable.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -38,7 +38,7 @@
  * of the elf file into memory. Otherwise, it will walk the section in file
  * to look up the symbol that nearest the given address.
  */
-class ElfSymbolTable: public CHeapObj {
+class ElfSymbolTable: public CHeapObj<mtInternal> {
   friend class ElfFile;
  public:
   ElfSymbolTable(FILE* file, Elf_Shdr shdr);
--- a/src/share/vm/utilities/events.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/events.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -46,7 +46,7 @@
 // crash time.  This is a very generic interface that is mainly here
 // for completeness.  Normally the templated EventLogBase would be
 // subclassed to provide different log types.
-class EventLog : public CHeapObj {
+class EventLog : public CHeapObj<mtInternal> {
   friend class Events;
 
  private:
--- a/src/share/vm/utilities/exceptions.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/exceptions.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -57,7 +57,7 @@
 // field of the Thread class w/o having access to the Thread's interface (for
 // include hierachy reasons).
 
-class ThreadShadow: public CHeapObj {
+class ThreadShadow: public CHeapObj<mtThread> {
   friend class VMStructs;
 
  protected:
--- a/src/share/vm/utilities/growableArray.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/growableArray.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -61,7 +61,7 @@
   if (on_stack()) {
     return (void*)resource_allocate_bytes(byte_size);
   } else if (on_C_heap()) {
-    return (void*)AllocateHeap(byte_size, "GrET in " __FILE__);
+    return (void*)AllocateHeap(byte_size, _memflags);
   } else {
     return _arena->Amalloc(byte_size);
   }
--- a/src/share/vm/utilities/growableArray.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/growableArray.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -86,6 +86,9 @@
                         //   0 means default ResourceArea
                         //   1 means on C heap
                         //   otherwise, allocate in _arena
+
+  MEMFLAGS   _memflags;   // memory type if allocation in C heap
+
 #ifdef ASSERT
   int    _nesting;      // resource area nesting at creation
   void   set_nesting();
@@ -102,9 +105,14 @@
 
   // This GA will use the resource stack for storage if c_heap==false,
   // Else it will use the C heap.  Use clear_and_deallocate to avoid leaks.
-  GenericGrowableArray(int initial_size, int initial_len, bool c_heap) {
+  GenericGrowableArray(int initial_size, int initial_len, bool c_heap, MEMFLAGS flags = mtNone) {
     _len = initial_len;
     _max = initial_size;
+    _memflags = flags;
+
+    // memory type has to be specified for C heap allocation
+    assert(!(c_heap && flags == mtNone), "memory type not specified for C heap object");
+
     assert(_len >= 0 && _len <= _max, "initial_len too big");
     _arena = (c_heap ? (Arena*)1 : NULL);
     set_nesting();
@@ -121,6 +129,8 @@
     _max = initial_size;
     assert(_len >= 0 && _len <= _max, "initial_len too big");
     _arena = arena;
+    _memflags = mtNone;
+
     assert(on_arena(), "arena has taken on reserved value 0 or 1");
     // Relax next assert to allow object allocation on resource area,
     // on stack or embedded into an other object.
@@ -152,12 +162,14 @@
     for (int i = 0; i < _max; i++) ::new ((void*)&_data[i]) E();
   }
 
-  GrowableArray(int initial_size, bool C_heap = false) : GenericGrowableArray(initial_size, 0, C_heap) {
+  GrowableArray(int initial_size, bool C_heap = false, MEMFLAGS F = mtInternal)
+    : GenericGrowableArray(initial_size, 0, C_heap, F) {
     _data = (E*)raw_allocate(sizeof(E));
     for (int i = 0; i < _max; i++) ::new ((void*)&_data[i]) E();
   }
 
-  GrowableArray(int initial_size, int initial_len, const E& filler, bool C_heap = false) : GenericGrowableArray(initial_size, initial_len, C_heap) {
+  GrowableArray(int initial_size, int initial_len, const E& filler, bool C_heap = false, MEMFLAGS memflags = mtInternal)
+    : GenericGrowableArray(initial_size, initial_len, C_heap, memflags) {
     _data = (E*)raw_allocate(sizeof(E));
     int i = 0;
     for (; i < _len; i++) ::new ((void*)&_data[i]) E(filler);
--- a/src/share/vm/utilities/hashtable.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/hashtable.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,10 @@
  */
 
 #include "precompiled.hpp"
+#include "classfile/altHashing.hpp"
+#include "classfile/javaClasses.hpp"
 #include "memory/allocation.inline.hpp"
+#include "memory/filemap.hpp"
 #include "memory/resourceArea.hpp"
 #include "oops/oop.inline.hpp"
 #include "runtime/safepoint.hpp"
@@ -32,11 +35,6 @@
 #include "utilities/hashtable.inline.hpp"
 
 
-#ifndef USDT2
-HS_DTRACE_PROBE_DECL4(hs_private, hashtable__new_entry,
-  void*, unsigned int, void*, void*);
-#endif /* !USDT2 */
-
 // This is a generic hashtable, designed to be used for the symbol
 // and string tables.
 //
@@ -45,8 +43,8 @@
 // %note:
 //  - HashtableEntrys are allocated in blocks to reduce the space overhead.
 
-BasicHashtableEntry* BasicHashtable::new_entry(unsigned int hashValue) {
-  BasicHashtableEntry* entry;
+template <MEMFLAGS F> BasicHashtableEntry<F>* BasicHashtable<F>::new_entry(unsigned int hashValue) {
+  BasicHashtableEntry<F>* entry;
 
   if (_free_list) {
     entry = _free_list;
@@ -57,10 +55,10 @@
       int len = _entry_size * block_size;
       len = 1 << log2_intptr(len); // round down to power of 2
       assert(len >= _entry_size, "");
-      _first_free_entry = NEW_C_HEAP_ARRAY(char, len);
+      _first_free_entry = NEW_C_HEAP_ARRAY2(char, len, F, CURRENT_PC);
       _end_block = _first_free_entry + len;
     }
-    entry = (BasicHashtableEntry*)_first_free_entry;
+    entry = (BasicHashtableEntry<F>*)_first_free_entry;
     _first_free_entry += _entry_size;
   }
 
@@ -70,31 +68,114 @@
 }
 
 
-template <class T> HashtableEntry<T>* Hashtable<T>::new_entry(unsigned int hashValue, T obj) {
-  HashtableEntry<T>* entry;
+template <class T, MEMFLAGS F> HashtableEntry<T, F>* Hashtable<T, F>::new_entry(unsigned int hashValue, T obj) {
+  HashtableEntry<T, F>* entry;
 
-  entry = (HashtableEntry<T>*)BasicHashtable::new_entry(hashValue);
+  entry = (HashtableEntry<T, F>*)BasicHashtable<F>::new_entry(hashValue);
   entry->set_literal(obj);
-#ifndef USDT2
-  HS_DTRACE_PROBE4(hs_private, hashtable__new_entry,
-    this, hashValue, obj, entry);
-#else /* USDT2 */
-  HS_PRIVATE_HASHTABLE_NEW_ENTRY(
-    this, hashValue, (uintptr_t) obj, entry);
-#endif /* USDT2 */
   return entry;
 }
 
+// Check to see if the hashtable is unbalanced.  The caller set a flag to
+// rehash at the next safepoint.  If this bucket is 60 times greater than the
+// expected average bucket length, it's an unbalanced hashtable.
+// This is somewhat an arbitrary heuristic but if one bucket gets to
+// rehash_count which is currently 100, there's probably something wrong.
+
+template <MEMFLAGS F> bool BasicHashtable<F>::check_rehash_table(int count) {
+  assert(table_size() != 0, "underflow");
+  if (count > (((double)number_of_entries()/(double)table_size())*rehash_multiple)) {
+    // Set a flag for the next safepoint, which should be at some guaranteed
+    // safepoint interval.
+    return true;
+  }
+  return false;
+}
+
+template <class T, MEMFLAGS F> jint Hashtable<T, F>::_seed = 0;
+
+template <class T, MEMFLAGS F> unsigned int Hashtable<T, F>::new_hash(Symbol* sym) {
+  ResourceMark rm;
+  // Use alternate hashing algorithm on this symbol.
+  return AltHashing::murmur3_32(seed(), (const jbyte*)sym->as_C_string(), sym->utf8_length());
+}
+
+template <class T, MEMFLAGS F> unsigned int Hashtable<T, F>::new_hash(oop string) {
+  ResourceMark rm;
+  int length;
+  jchar* chars = java_lang_String::as_unicode_string(string, length);
+  // Use alternate hashing algorithm on the string
+  return AltHashing::murmur3_32(seed(), chars, length);
+}
+
+// Create a new table and using alternate hash code, populate the new table
+// with the existing elements.   This can be used to change the hash code
+// and could in the future change the size of the table.
+
+template <class T, MEMFLAGS F> void Hashtable<T, F>::move_to(Hashtable<T, F>* new_table) {
+
+  // Initialize the global seed for hashing.
+  _seed = AltHashing::compute_seed();
+  assert(seed() != 0, "shouldn't be zero");
+
+  int saved_entry_count = this->number_of_entries();
+
+  // Iterate through the table and create a new entry for the new table
+  for (int i = 0; i < new_table->table_size(); ++i) {
+    for (HashtableEntry<T, F>* p = bucket(i); p != NULL; ) {
+      HashtableEntry<T, F>* next = p->next();
+      T string = p->literal();
+      // Use alternate hashing algorithm on the symbol in the first table
+      unsigned int hashValue = new_hash(string);
+      // Get a new index relative to the new table (can also change size)
+      int index = new_table->hash_to_index(hashValue);
+      p->set_hash(hashValue);
+      // Keep the shared bit in the Hashtable entry to indicate that this entry
+      // can't be deleted.   The shared bit is the LSB in the _next field so
+      // walking the hashtable past these entries requires
+      // BasicHashtableEntry::make_ptr() call.
+      bool keep_shared = p->is_shared();
+      unlink_entry(p);
+      new_table->add_entry(index, p);
+      if (keep_shared) {
+        p->set_shared();
+      }
+      p = next;
+    }
+  }
+  // give the new table the free list as well
+  new_table->copy_freelist(this);
+  assert(new_table->number_of_entries() == saved_entry_count, "lost entry on dictionary copy?");
+
+  // Destroy memory used by the buckets in the hashtable.  The memory
+  // for the elements has been used in a new table and is not
+  // destroyed.  The memory reuse will benefit resizing the SystemDictionary
+  // to avoid a memory allocation spike at safepoint.
+  BasicHashtable<F>::free_buckets();
+}
+
+template <MEMFLAGS F> void BasicHashtable<F>::free_buckets() {
+  if (NULL != _buckets) {
+    // Don't delete the buckets in the shared space.  They aren't
+    // allocated by os::malloc
+    if (!UseSharedSpaces ||
+        !FileMapInfo::current_info()->is_in_shared_space(_buckets)) {
+       FREE_C_HEAP_ARRAY(HashtableBucket, _buckets, F);
+    }
+    _buckets = NULL;
+  }
+}
+
 
 // Reverse the order of elements in the hash buckets.
 
-void BasicHashtable::reverse() {
+template <MEMFLAGS F> void BasicHashtable<F>::reverse() {
 
   for (int i = 0; i < _table_size; ++i) {
-    BasicHashtableEntry* new_list = NULL;
-    BasicHashtableEntry* p = bucket(i);
+    BasicHashtableEntry<F>* new_list = NULL;
+    BasicHashtableEntry<F>* p = bucket(i);
     while (p != NULL) {
-      BasicHashtableEntry* next = p->next();
+      BasicHashtableEntry<F>* next = p->next();
       p->set_next(new_list);
       new_list = p;
       p = next;
@@ -106,7 +187,7 @@
 
 // Copy the table to the shared space.
 
-void BasicHashtable::copy_table(char** top, char* end) {
+template <MEMFLAGS F> void BasicHashtable<F>::copy_table(char** top, char* end) {
 
   // Dump the hash table entries.
 
@@ -115,13 +196,13 @@
 
   int i;
   for (i = 0; i < _table_size; ++i) {
-    for (BasicHashtableEntry** p = _buckets[i].entry_addr();
+    for (BasicHashtableEntry<F>** p = _buckets[i].entry_addr();
                               *p != NULL;
                                p = (*p)->next_addr()) {
       if (*top + entry_size() > end) {
         report_out_of_shared_space(SharedMiscData);
       }
-      *p = (BasicHashtableEntry*)memcpy(*top, *p, entry_size());
+      *p = (BasicHashtableEntry<F>*)memcpy(*top, *p, entry_size());
       *top += entry_size();
     }
   }
@@ -130,7 +211,7 @@
   // Set the shared bit.
 
   for (i = 0; i < _table_size; ++i) {
-    for (BasicHashtableEntry* p = bucket(i); p != NULL; p = p->next()) {
+    for (BasicHashtableEntry<F>* p = bucket(i); p != NULL; p = p->next()) {
       p->set_shared();
     }
   }
@@ -140,15 +221,15 @@
 
 // Reverse the order of elements in the hash buckets.
 
-template <class T> void Hashtable<T>::reverse(void* boundary) {
+template <class T, MEMFLAGS F> void Hashtable<T, F>::reverse(void* boundary) {
 
-  for (int i = 0; i < table_size(); ++i) {
-    HashtableEntry<T>* high_list = NULL;
-    HashtableEntry<T>* low_list = NULL;
-    HashtableEntry<T>* last_low_entry = NULL;
-    HashtableEntry<T>* p = bucket(i);
+  for (int i = 0; i < this->table_size(); ++i) {
+    HashtableEntry<T, F>* high_list = NULL;
+    HashtableEntry<T, F>* low_list = NULL;
+    HashtableEntry<T, F>* last_low_entry = NULL;
+    HashtableEntry<T, F>* p = bucket(i);
     while (p != NULL) {
-      HashtableEntry<T>* next = p->next();
+      HashtableEntry<T, F>* next = p->next();
       if ((void*)p->literal() >= boundary) {
         p->set_next(high_list);
         high_list = p;
@@ -173,8 +254,8 @@
 
 // Dump the hash table buckets.
 
-void BasicHashtable::copy_buckets(char** top, char* end) {
-  intptr_t len = _table_size * sizeof(HashtableBucket);
+template <MEMFLAGS F> void BasicHashtable<F>::copy_buckets(char** top, char* end) {
+  intptr_t len = _table_size * sizeof(HashtableBucket<F>);
   *(intptr_t*)(*top) = len;
   *top += sizeof(intptr_t);
 
@@ -184,18 +265,18 @@
   if (*top + len > end) {
     report_out_of_shared_space(SharedMiscData);
   }
-  _buckets = (HashtableBucket*)memcpy(*top, _buckets, len);
+  _buckets = (HashtableBucket<F>*)memcpy(*top, _buckets, len);
   *top += len;
 }
 
 
 #ifndef PRODUCT
 
-template <class T> void Hashtable<T>::print() {
+template <class T, MEMFLAGS F> void Hashtable<T, F>::print() {
   ResourceMark rm;
 
-  for (int i = 0; i < table_size(); i++) {
-    HashtableEntry<T>* entry = bucket(i);
+  for (int i = 0; i < BasicHashtable<F>::table_size(); i++) {
+    HashtableEntry<T, F>* entry = bucket(i);
     while(entry != NULL) {
       tty->print("%d : ", i);
       entry->literal()->print();
@@ -206,10 +287,10 @@
 }
 
 
-void BasicHashtable::verify() {
+template <MEMFLAGS F> void BasicHashtable<F>::verify() {
   int count = 0;
   for (int i = 0; i < table_size(); i++) {
-    for (BasicHashtableEntry* p = bucket(i); p != NULL; p = p->next()) {
+    for (BasicHashtableEntry<F>* p = bucket(i); p != NULL; p = p->next()) {
       ++count;
     }
   }
@@ -222,7 +303,7 @@
 
 #ifdef ASSERT
 
-void BasicHashtable::verify_lookup_length(double load) {
+template <MEMFLAGS F> void BasicHashtable<F>::verify_lookup_length(double load) {
   if ((double)_lookup_length / (double)_lookup_count > load * 2.0) {
     warning("Performance bug: SystemDictionary lookup_count=%d "
             "lookup_length=%d average=%lf load=%f",
@@ -232,10 +313,22 @@
 }
 
 #endif
-
 // Explicitly instantiate these types
-template class Hashtable<constantPoolOop>;
-template class Hashtable<Symbol*>;
-template class Hashtable<klassOop>;
-template class Hashtable<oop>;
-
+template class Hashtable<constantPoolOop, mtClass>;
+template class Hashtable<Symbol*, mtSymbol>;
+template class Hashtable<klassOop, mtClass>;
+template class Hashtable<oop, mtClass>;
+#ifdef SOLARIS
+template class Hashtable<oop, mtSymbol>;
+#endif
+template class Hashtable<oopDesc*, mtSymbol>;
+template class Hashtable<Symbol*, mtClass>;
+template class HashtableEntry<Symbol*, mtSymbol>;
+template class HashtableEntry<Symbol*, mtClass>;
+template class HashtableEntry<oop, mtSymbol>;
+template class BasicHashtableEntry<mtSymbol>;
+template class BasicHashtableEntry<mtCode>;
+template class BasicHashtable<mtClass>;
+template class BasicHashtable<mtSymbol>;
+template class BasicHashtable<mtCode>;
+template class BasicHashtable<mtInternal>;
--- a/src/share/vm/utilities/hashtable.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/hashtable.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -40,7 +40,7 @@
 
 
 
-class BasicHashtableEntry : public CHeapObj {
+template <MEMFLAGS F> class BasicHashtableEntry : public CHeapObj<F> {
   friend class VMStructs;
 private:
   unsigned int         _hash;           // 32-bit hash for item
@@ -52,7 +52,7 @@
   // shared entries will not change.  New entries will always be
   // unshared and since pointers are align, bit 0 will always remain 0
   // with no extra effort.
-  BasicHashtableEntry* _next;
+  BasicHashtableEntry<F>* _next;
 
   // Windows IA64 compiler requires subclasses to be able to access these
 protected:
@@ -69,19 +69,19 @@
   void set_hash(unsigned int hash)      { _hash = hash; }
   unsigned int* hash_addr()             { return &_hash; }
 
-  static BasicHashtableEntry* make_ptr(BasicHashtableEntry* p) {
+  static BasicHashtableEntry<F>* make_ptr(BasicHashtableEntry<F>* p) {
     return (BasicHashtableEntry*)((intptr_t)p & -2);
   }
 
-  BasicHashtableEntry* next() const {
+  BasicHashtableEntry<F>* next() const {
     return make_ptr(_next);
   }
 
-  void set_next(BasicHashtableEntry* next) {
+  void set_next(BasicHashtableEntry<F>* next) {
     _next = next;
   }
 
-  BasicHashtableEntry** next_addr() {
+  BasicHashtableEntry<F>** next_addr() {
     return &_next;
   }
 
@@ -90,13 +90,13 @@
   }
 
   void set_shared() {
-    _next = (BasicHashtableEntry*)((intptr_t)_next | 1);
+    _next = (BasicHashtableEntry<F>*)((intptr_t)_next | 1);
   }
 };
 
 
 
-template <class T> class HashtableEntry : public BasicHashtableEntry {
+template <class T, MEMFLAGS F> class HashtableEntry : public BasicHashtableEntry<F> {
   friend class VMStructs;
 private:
   T               _literal;          // ref to item in table.
@@ -108,20 +108,20 @@
   void set_literal(T s)               { _literal = s; }
 
   HashtableEntry* next() const {
-    return (HashtableEntry*)BasicHashtableEntry::next();
+    return (HashtableEntry*)BasicHashtableEntry<F>::next();
   }
   HashtableEntry** next_addr() {
-    return (HashtableEntry**)BasicHashtableEntry::next_addr();
+    return (HashtableEntry**)BasicHashtableEntry<F>::next_addr();
   }
 };
 
 
 
-class HashtableBucket : public CHeapObj {
+template <MEMFLAGS F> class HashtableBucket : public CHeapObj<F> {
   friend class VMStructs;
 private:
   // Instance variable
-  BasicHashtableEntry*       _entry;
+  BasicHashtableEntry<F>*       _entry;
 
 public:
   // Accessing
@@ -129,21 +129,21 @@
 
   // The following methods use order access methods to avoid race
   // conditions in multiprocessor systems.
-  BasicHashtableEntry* get_entry() const;
-  void set_entry(BasicHashtableEntry* l);
+  BasicHashtableEntry<F>* get_entry() const;
+  void set_entry(BasicHashtableEntry<F>* l);
 
   // The following method is not MT-safe and must be done under lock.
-  BasicHashtableEntry** entry_addr()  { return &_entry; }
+  BasicHashtableEntry<F>** entry_addr()  { return &_entry; }
 };
 
 
-class BasicHashtable : public CHeapObj {
+template <MEMFLAGS F> class BasicHashtable : public CHeapObj<F> {
   friend class VMStructs;
 
 public:
   BasicHashtable(int table_size, int entry_size);
   BasicHashtable(int table_size, int entry_size,
-                 HashtableBucket* buckets, int number_of_entries);
+                 HashtableBucket<F>* buckets, int number_of_entries);
 
   // Sharing support.
   void copy_buckets(char** top, char* end);
@@ -159,13 +159,11 @@
   // Reverse the order of elements in each of the buckets.
   void reverse();
 
-  static unsigned int hash_symbol(const char* s, int len);
-
 private:
   // Instance variables
   int               _table_size;
-  HashtableBucket*  _buckets;
-  BasicHashtableEntry* _free_list;
+  HashtableBucket<F>*     _buckets;
+  BasicHashtableEntry<F>* _free_list;
   char*             _first_free_entry;
   char*             _end_block;
   int               _entry_size;
@@ -179,27 +177,55 @@
   void verify_lookup_length(double load);
 #endif
 
+  enum {
+    rehash_count = 100,
+    rehash_multiple = 60
+  };
+
   void initialize(int table_size, int entry_size, int number_of_entries);
 
   // Accessor
   int entry_size() const { return _entry_size; }
 
   // The following method is MT-safe and may be used with caution.
-  BasicHashtableEntry* bucket(int i);
+  BasicHashtableEntry<F>* bucket(int i);
 
   // The following method is not MT-safe and must be done under lock.
-  BasicHashtableEntry** bucket_addr(int i) { return _buckets[i].entry_addr(); }
+  BasicHashtableEntry<F>** bucket_addr(int i) { return _buckets[i].entry_addr(); }
 
   // Table entry management
-  BasicHashtableEntry* new_entry(unsigned int hashValue);
+  BasicHashtableEntry<F>* new_entry(unsigned int hashValue);
+
+  // Check that the table is unbalanced
+  bool check_rehash_table(int count);
+
+  // Used when moving the entry to another table
+  // Clean up links, but do not add to free_list
+  void unlink_entry(BasicHashtableEntry<F>* entry) {
+    entry->set_next(NULL);
+    --_number_of_entries;
+  }
+
+  // Move over freelist and free block for allocation
+  void copy_freelist(BasicHashtable* src) {
+    _free_list = src->_free_list;
+    src->_free_list = NULL;
+    _first_free_entry = src->_first_free_entry;
+    src->_first_free_entry = NULL;
+    _end_block = src->_end_block;
+    src->_end_block = NULL;
+  }
+
+  // Free the buckets in this hashtable
+  void free_buckets();
 
 public:
   int table_size() { return _table_size; }
-  void set_entry(int index, BasicHashtableEntry* entry);
+  void set_entry(int index, BasicHashtableEntry<F>* entry);
 
-  void add_entry(int index, BasicHashtableEntry* entry);
+  void add_entry(int index, BasicHashtableEntry<F>* entry);
 
-  void free_entry(BasicHashtableEntry* entry);
+  void free_entry(BasicHashtableEntry<F>* entry);
 
   int number_of_entries() { return _number_of_entries; }
 
@@ -207,16 +233,16 @@
 };
 
 
-template <class T> class Hashtable : public BasicHashtable {
+template <class T, MEMFLAGS F> class Hashtable : public BasicHashtable<F> {
   friend class VMStructs;
 
 public:
   Hashtable(int table_size, int entry_size)
-    : BasicHashtable(table_size, entry_size) { }
+    : BasicHashtable<F>(table_size, entry_size) { }
 
   Hashtable(int table_size, int entry_size,
-                   HashtableBucket* buckets, int number_of_entries)
-    : BasicHashtable(table_size, entry_size, buckets, number_of_entries) { }
+                   HashtableBucket<F>* buckets, int number_of_entries)
+    : BasicHashtable<F>(table_size, entry_size, buckets, number_of_entries) { }
 
   // Debugging
   void print()               PRODUCT_RETURN;
@@ -238,31 +264,42 @@
   }
 
   // Table entry management
-  HashtableEntry<T>* new_entry(unsigned int hashValue, T obj);
+  HashtableEntry<T, F>* new_entry(unsigned int hashValue, T obj);
 
   // The following method is MT-safe and may be used with caution.
-  HashtableEntry<T>* bucket(int i) {
-    return (HashtableEntry<T>*)BasicHashtable::bucket(i);
+  HashtableEntry<T, F>* bucket(int i) {
+    return (HashtableEntry<T, F>*)BasicHashtable<F>::bucket(i);
   }
 
   // The following method is not MT-safe and must be done under lock.
-  HashtableEntry<T>** bucket_addr(int i) {
-    return (HashtableEntry<T>**)BasicHashtable::bucket_addr(i);
+  HashtableEntry<T, F>** bucket_addr(int i) {
+    return (HashtableEntry<T, F>**)BasicHashtable<F>::bucket_addr(i);
   }
+
+  // Function to move these elements into the new table.
+  void move_to(Hashtable<T, F>* new_table);
+  static bool use_alternate_hashcode()  { return _seed != 0; }
+  static jint seed()                    { return _seed; }
+
+ private:
+  static jint _seed;
+
+  unsigned int new_hash(Symbol* s);
+  unsigned int new_hash(oop string);
 };
 
 
 //  Verions of hashtable where two handles are used to compute the index.
 
-template <class T> class TwoOopHashtable : public Hashtable<T> {
+template <class T, MEMFLAGS F> class TwoOopHashtable : public Hashtable<T, F> {
   friend class VMStructs;
 protected:
   TwoOopHashtable(int table_size, int entry_size)
-    : Hashtable<T>(table_size, entry_size) {}
+    : Hashtable<T, F>(table_size, entry_size) {}
 
-  TwoOopHashtable(int table_size, int entry_size, HashtableBucket* t,
+  TwoOopHashtable(int table_size, int entry_size, HashtableBucket<F>* t,
                   int number_of_entries)
-    : Hashtable<T>(table_size, entry_size, t, number_of_entries) {}
+    : Hashtable<T, F>(table_size, entry_size, t, number_of_entries) {}
 
 public:
   unsigned int compute_hash(Symbol* name, Handle loader) {
--- a/src/share/vm/utilities/hashtable.inline.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/hashtable.inline.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,46 +27,26 @@
 
 #include "memory/allocation.inline.hpp"
 #include "utilities/hashtable.hpp"
+#include "utilities/dtrace.hpp"
 
 // Inline function definitions for hashtable.hpp.
 
-
-// --------------------------------------------------------------------------
-// Hash function
-
-// We originally used hashpjw, but hash P(31) gives just as good results
-// and is slighly faster. We would like a hash function that looks at every
-// character, since package names have large common prefixes, and also because
-// hash_or_fail does error checking while iterating.
-
-// hash P(31) from Kernighan & Ritchie
-
-inline unsigned int BasicHashtable::hash_symbol(const char* s, int len) {
-  unsigned int h = 0;
-  while (len-- > 0) {
-    h = 31*h + (unsigned) *s;
-    s++;
-  }
-  return h;
-}
-
-
 // --------------------------------------------------------------------------
 
 // Initialize a table.
 
-inline BasicHashtable::BasicHashtable(int table_size, int entry_size) {
+template <MEMFLAGS F> inline BasicHashtable<F>::BasicHashtable(int table_size, int entry_size) {
   // Called on startup, no locking needed
   initialize(table_size, entry_size, 0);
-  _buckets = NEW_C_HEAP_ARRAY(HashtableBucket, table_size);
+  _buckets = NEW_C_HEAP_ARRAY2(HashtableBucket<F>, table_size, F, CURRENT_PC);
   for (int index = 0; index < _table_size; index++) {
     _buckets[index].clear();
   }
 }
 
 
-inline BasicHashtable::BasicHashtable(int table_size, int entry_size,
-                                      HashtableBucket* buckets,
+template <MEMFLAGS F> inline BasicHashtable<F>::BasicHashtable(int table_size, int entry_size,
+                                      HashtableBucket<F>* buckets,
                                       int number_of_entries) {
   // Called on startup, no locking needed
   initialize(table_size, entry_size, number_of_entries);
@@ -74,7 +54,7 @@
 }
 
 
-inline void BasicHashtable::initialize(int table_size, int entry_size,
+template <MEMFLAGS F> inline void BasicHashtable<F>::initialize(int table_size, int entry_size,
                                        int number_of_entries) {
   // Called on startup, no locking needed
   _table_size = table_size;
@@ -91,12 +71,12 @@
 
 
 // The following method is MT-safe and may be used with caution.
-inline BasicHashtableEntry* BasicHashtable::bucket(int i) {
+template <MEMFLAGS F> inline BasicHashtableEntry<F>* BasicHashtable<F>::bucket(int i) {
   return _buckets[i].get_entry();
 }
 
 
-inline void HashtableBucket::set_entry(BasicHashtableEntry* l) {
+template <MEMFLAGS F> inline void HashtableBucket<F>::set_entry(BasicHashtableEntry<F>* l) {
   // Warning: Preserve store ordering.  The SystemDictionary is read
   //          without locks.  The new SystemDictionaryEntry must be
   //          complete before other threads can be allowed to see it
@@ -105,27 +85,27 @@
 }
 
 
-inline BasicHashtableEntry* HashtableBucket::get_entry() const {
+template <MEMFLAGS F> inline BasicHashtableEntry<F>* HashtableBucket<F>::get_entry() const {
   // Warning: Preserve load ordering.  The SystemDictionary is read
   //          without locks.  The new SystemDictionaryEntry must be
   //          complete before other threads can be allowed to see it
   //          via a store to _buckets[index].
-  return (BasicHashtableEntry*) OrderAccess::load_ptr_acquire(&_entry);
+  return (BasicHashtableEntry<F>*) OrderAccess::load_ptr_acquire(&_entry);
 }
 
 
-inline void BasicHashtable::set_entry(int index, BasicHashtableEntry* entry) {
+template <MEMFLAGS F> inline void BasicHashtable<F>::set_entry(int index, BasicHashtableEntry<F>* entry) {
   _buckets[index].set_entry(entry);
 }
 
 
-inline void BasicHashtable::add_entry(int index, BasicHashtableEntry* entry) {
+template <MEMFLAGS F> inline void BasicHashtable<F>::add_entry(int index, BasicHashtableEntry<F>* entry) {
   entry->set_next(bucket(index));
   _buckets[index].set_entry(entry);
   ++_number_of_entries;
 }
 
-inline void BasicHashtable::free_entry(BasicHashtableEntry* entry) {
+template <MEMFLAGS F> inline void BasicHashtable<F>::free_entry(BasicHashtableEntry<F>* entry) {
   entry->set_next(_free_list);
   _free_list = entry;
   --_number_of_entries;
--- a/src/share/vm/utilities/histogram.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/histogram.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -69,7 +69,7 @@
 
 Histogram::Histogram(const char* title,int estimatedCount) {
   _title = title;
-  _elements = new (ResourceObj::C_HEAP) GrowableArray<HistogramElement*>(estimatedCount,true);
+  _elements = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<HistogramElement*>(estimatedCount,true);
 }
 
 void Histogram::add_element(HistogramElement* element) {
--- a/src/share/vm/utilities/histogram.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/histogram.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -77,7 +77,7 @@
 
 #ifdef ASSERT
 
-class HistogramElement : public CHeapObj {
+class HistogramElement : public CHeapObj<mtInternal> {
  protected:
   jint _count;
   const char* _name;
@@ -91,7 +91,7 @@
   virtual int compare(HistogramElement* e1,HistogramElement* e2);
 };
 
-class Histogram : public CHeapObj {
+class Histogram : public CHeapObj<mtInternal> {
  protected:
   GrowableArray<HistogramElement*>* _elements;
   GrowableArray<HistogramElement*>* elements() { return _elements; }
--- a/src/share/vm/utilities/intHisto.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/intHisto.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -27,7 +27,7 @@
 
 IntHistogram::IntHistogram(int est, int max) : _max(max), _tot(0) {
   assert(0 <= est && est <= max, "Preconditions");
-  _elements = new (ResourceObj::C_HEAP) GrowableArray<int>(est, true);
+  _elements = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<int>(est, true);
   guarantee(_elements != NULL, "alloc failure");
 }
 
--- a/src/share/vm/utilities/intHisto.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/intHisto.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -47,7 +47,7 @@
 // relation) to a count.
 
 
-class IntHistogram : public CHeapObj {
+class IntHistogram : public CHeapObj<mtInternal> {
  protected:
   int _max;
   int _tot;
--- a/src/share/vm/utilities/numberSeq.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/numberSeq.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -133,13 +133,13 @@
 
 TruncatedSeq::TruncatedSeq(int length, double alpha):
   AbsSeq(alpha), _length(length), _next(0) {
-  _sequence = NEW_C_HEAP_ARRAY(double, _length);
+  _sequence = NEW_C_HEAP_ARRAY(double, _length, mtInternal);
   for (int i = 0; i < _length; ++i)
     _sequence[i] = 0.0;
 }
 
 TruncatedSeq::~TruncatedSeq() {
-  FREE_C_HEAP_ARRAY(double, _sequence);
+  FREE_C_HEAP_ARRAY(double, _sequence, mtGC);
 }
 
 void TruncatedSeq::add(double val) {
--- a/src/share/vm/utilities/numberSeq.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/numberSeq.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -25,6 +25,8 @@
 #ifndef SHARE_VM_UTILITIES_NUMBERSEQ_HPP
 #define SHARE_VM_UTILITIES_NUMBERSEQ_HPP
 
+#include "memory/allocation.hpp"
+
 /**
  **  This file contains a few classes that represent number sequence,
  **  x1, x2, x3, ..., xN, and can calculate their avg, max, and sd.
@@ -40,7 +42,7 @@
 
 #define DEFAULT_ALPHA_VALUE 0.7
 
-class AbsSeq {
+class AbsSeq: public CHeapObj<mtInternal> {
 private:
   void init(double alpha);
 
--- a/src/share/vm/utilities/ostream.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/ostream.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -384,7 +384,7 @@
   if (_file != NULL) {
     if (_need_close) fclose(_file);
     _file      = NULL;
-    FREE_C_HEAP_ARRAY(char, _file_name);
+    FREE_C_HEAP_ARRAY(char, _file_name, mtInternal);
     _file_name = NULL;
   }
 }
@@ -392,7 +392,7 @@
 rotatingFileStream::rotatingFileStream(const char* file_name) {
   _cur_file_num = 0;
   _bytes_writen = 0L;
-  _file_name = NEW_C_HEAP_ARRAY(char, strlen(file_name)+10);
+  _file_name = NEW_C_HEAP_ARRAY(char, strlen(file_name)+10, mtInternal);
   jio_snprintf(_file_name, strlen(file_name)+10, "%s.%d", file_name, _cur_file_num);
   _file = fopen(_file_name, "w");
   _need_close = true;
@@ -401,7 +401,7 @@
 rotatingFileStream::rotatingFileStream(const char* file_name, const char* opentype) {
   _cur_file_num = 0;
   _bytes_writen = 0L;
-  _file_name = NEW_C_HEAP_ARRAY(char, strlen(file_name)+10);
+  _file_name = NEW_C_HEAP_ARRAY(char, strlen(file_name)+10, mtInternal);
   jio_snprintf(_file_name, strlen(file_name)+10, "%s.%d", file_name, _cur_file_num);
   _file = fopen(_file_name, opentype);
   _need_close = true;
@@ -524,7 +524,7 @@
   }
 
   // Create big enough buffer.
-  char *buf = NEW_C_HEAP_ARRAY(char, buffer_length);
+  char *buf = NEW_C_HEAP_ARRAY(char, buffer_length, mtInternal);
 
   strcpy(buf, "");
   if (force_directory != NULL) {
@@ -549,7 +549,7 @@
   // %%% Need a MutexLocker?
   const char* log_name = LogFile != NULL ? LogFile : "hotspot.log";
   const char* try_name = make_log_name(log_name, NULL);
-  fileStream* file = new(ResourceObj::C_HEAP) fileStream(try_name);
+  fileStream* file = new(ResourceObj::C_HEAP, mtInternal) fileStream(try_name);
   if (!file->is_open()) {
     // Try again to open the file.
     char warnbuf[O_BUFLEN*2];
@@ -557,18 +557,18 @@
                  "Warning:  Cannot open log file: %s\n", try_name);
     // Note:  This feature is for maintainer use only.  No need for L10N.
     jio_print(warnbuf);
-    FREE_C_HEAP_ARRAY(char, try_name);
+    FREE_C_HEAP_ARRAY(char, try_name, mtInternal);
     try_name = make_log_name("hs_pid%p.log", os::get_temp_directory());
     jio_snprintf(warnbuf, sizeof(warnbuf),
                  "Warning:  Forcing option -XX:LogFile=%s\n", try_name);
     jio_print(warnbuf);
     delete file;
-    file = new(ResourceObj::C_HEAP) fileStream(try_name);
-    FREE_C_HEAP_ARRAY(char, try_name);
+    file = new(ResourceObj::C_HEAP, mtInternal) fileStream(try_name);
+    FREE_C_HEAP_ARRAY(char, try_name, mtInternal);
   }
   if (file->is_open()) {
     _log_file = file;
-    xmlStream* xs = new(ResourceObj::C_HEAP) xmlStream(file);
+    xmlStream* xs = new(ResourceObj::C_HEAP, mtInternal) xmlStream(file);
     _outer_xmlStream = xs;
     if (this == tty)  xtty = xs;
     // Write XML header.
@@ -815,7 +815,7 @@
 
 void ostream_init() {
   if (defaultStream::instance == NULL) {
-    defaultStream::instance = new(ResourceObj::C_HEAP) defaultStream();
+    defaultStream::instance = new(ResourceObj::C_HEAP, mtInternal) defaultStream();
     tty = defaultStream::instance;
 
     // We want to ensure that time stamps in GC logs consider time 0
@@ -833,9 +833,9 @@
   gclog_or_tty = tty; // default to tty
   if (Arguments::gc_log_filename() != NULL) {
     fileStream * gclog  = UseGCLogFileRotation ?
-                          new(ResourceObj::C_HEAP)
+                          new(ResourceObj::C_HEAP, mtInternal)
                              rotatingFileStream(Arguments::gc_log_filename()) :
-                          new(ResourceObj::C_HEAP)
+                          new(ResourceObj::C_HEAP, mtInternal)
                              fileStream(Arguments::gc_log_filename());
     if (gclog->is_open()) {
       // now we update the time stamp of the GC log to be synced up
@@ -940,7 +940,7 @@
 
 bufferedStream::bufferedStream(size_t initial_size, size_t bufmax) : outputStream() {
   buffer_length = initial_size;
-  buffer        = NEW_C_HEAP_ARRAY(char, buffer_length);
+  buffer        = NEW_C_HEAP_ARRAY(char, buffer_length, mtInternal);
   buffer_pos    = 0;
   buffer_fixed  = false;
   buffer_max    = bufmax;
@@ -971,7 +971,7 @@
       if (end < buffer_length * 2) {
         end = buffer_length * 2;
       }
-      buffer = REALLOC_C_HEAP_ARRAY(char, buffer, end);
+      buffer = REALLOC_C_HEAP_ARRAY(char, buffer, end, mtInternal);
       buffer_length = end;
     }
   }
@@ -989,7 +989,7 @@
 
 bufferedStream::~bufferedStream() {
   if (!buffer_fixed) {
-    FREE_C_HEAP_ARRAY(char, buffer);
+    FREE_C_HEAP_ARRAY(char, buffer, mtInternal);
   }
 }
 
--- a/src/share/vm/utilities/stack.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/stack.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -25,6 +25,7 @@
 #ifndef SHARE_VM_UTILITIES_STACK_HPP
 #define SHARE_VM_UTILITIES_STACK_HPP
 
+#include "memory/allocation.hpp"
 #include "memory/allocation.inline.hpp"
 
 // Class Stack (below) grows and shrinks by linking together "segments" which
@@ -51,11 +52,11 @@
 // implementation in class Stack assumes that alloc() will terminate the process
 // if the allocation fails.
 
-template <class E> class StackIterator;
+template <class E, MEMFLAGS F> class StackIterator;
 
 // StackBase holds common data/methods that don't depend on the element type,
 // factored out to reduce template code duplication.
-class StackBase
+template <MEMFLAGS F> class StackBase
 {
 public:
   size_t segment_size()   const { return _seg_size; } // Elements per segment.
@@ -89,11 +90,11 @@
 #define inline
 #endif // __GNUC__
 
-template <class E>
-class Stack:  public StackBase
+template <class E, MEMFLAGS F>
+class Stack:  public StackBase<F>
 {
 public:
-  friend class StackIterator<E>;
+  friend class StackIterator<E, F>;
 
   // segment_size:    number of items per segment
   // max_cache_size:  maxmium number of *segments* to cache
@@ -103,15 +104,15 @@
                size_t max_cache_size = 4, size_t max_size = 0);
   inline ~Stack() { clear(true); }
 
-  inline bool is_empty() const { return _cur_seg == NULL; }
-  inline bool is_full()  const { return _full_seg_size >= max_size(); }
+  inline bool is_empty() const { return this->_cur_seg == NULL; }
+  inline bool is_full()  const { return this->_full_seg_size >= this->max_size(); }
 
   // Performance sensitive code should use is_empty() instead of size() == 0 and
   // is_full() instead of size() == max_size().  Using a conditional here allows
   // just one var to be updated when pushing/popping elements instead of two;
   // _full_seg_size is updated only when pushing/popping segments.
   inline size_t size() const {
-    return is_empty() ? 0 : _full_seg_size + _cur_seg_size;
+    return is_empty() ? 0 : this->_full_seg_size + this->_cur_seg_size;
   }
 
   inline void push(E elem);
@@ -161,18 +162,18 @@
   E* _cache;      // Segment cache to avoid ping-ponging.
 };
 
-template <class E> class ResourceStack:  public Stack<E>, public ResourceObj
+template <class E, MEMFLAGS F> class ResourceStack:  public Stack<E, F>, public ResourceObj
 {
 public:
   // If this class becomes widely used, it may make sense to save the Thread
   // and use it when allocating segments.
-  ResourceStack(size_t segment_size = Stack<E>::default_segment_size()):
-    Stack<E>(segment_size, max_uintx)
+//  ResourceStack(size_t segment_size = Stack<E, F>::default_segment_size()):
+  ResourceStack(size_t segment_size): Stack<E, F>(segment_size, max_uintx)
     { }
 
   // Set the segment pointers to NULL so the parent dtor does not free them;
   // that must be done by the ResourceMark code.
-  ~ResourceStack() { Stack<E>::reset(true); }
+  ~ResourceStack() { Stack<E, F>::reset(true); }
 
 protected:
   virtual E*   alloc(size_t bytes);
@@ -182,13 +183,13 @@
   void clear(bool clear_cache = false);
 };
 
-template <class E>
+template <class E, MEMFLAGS F>
 class StackIterator: public StackObj
 {
 public:
-  StackIterator(Stack<E>& stack): _stack(stack) { sync(); }
+  StackIterator(Stack<E, F>& stack): _stack(stack) { sync(); }
 
-  Stack<E>& stack() const { return _stack; }
+  Stack<E, F>& stack() const { return _stack; }
 
   bool is_empty() const { return _cur_seg == NULL; }
 
@@ -198,7 +199,7 @@
   void sync(); // Sync the iterator's state to the stack's current state.
 
 private:
-  Stack<E>& _stack;
+  Stack<E, F>& _stack;
   size_t    _cur_seg_size;
   E*        _cur_seg;
   size_t    _full_seg_size;
--- a/src/share/vm/utilities/stack.inline.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/stack.inline.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -27,7 +27,7 @@
 
 #include "utilities/stack.hpp"
 
-StackBase::StackBase(size_t segment_size, size_t max_cache_size,
+template <MEMFLAGS F> StackBase<F>::StackBase(size_t segment_size, size_t max_cache_size,
                      size_t max_size):
   _seg_size(segment_size),
   _max_cache_size(max_cache_size),
@@ -36,7 +36,7 @@
   assert(_max_size % _seg_size == 0, "not a multiple");
 }
 
-size_t StackBase::adjust_max_size(size_t max_size, size_t seg_size)
+template <MEMFLAGS F> size_t StackBase<F>::adjust_max_size(size_t max_size, size_t seg_size)
 {
   assert(seg_size > 0, "cannot be 0");
   assert(max_size >= seg_size || max_size == 0, "max_size too small");
@@ -47,54 +47,54 @@
   return (max_size + seg_size - 1) / seg_size * seg_size;
 }
 
-template <class E>
-Stack<E>::Stack(size_t segment_size, size_t max_cache_size, size_t max_size):
-  StackBase(adjust_segment_size(segment_size), max_cache_size, max_size)
+template <class E, MEMFLAGS F>
+Stack<E, F>::Stack(size_t segment_size, size_t max_cache_size, size_t max_size):
+  StackBase<F>(adjust_segment_size(segment_size), max_cache_size, max_size)
 {
   reset(true);
 }
 
-template <class E>
-void Stack<E>::push(E item)
+template <class E, MEMFLAGS F>
+void Stack<E, F>::push(E item)
 {
   assert(!is_full(), "pushing onto a full stack");
-  if (_cur_seg_size == _seg_size) {
+  if (this->_cur_seg_size == this->_seg_size) {
     push_segment();
   }
-  _cur_seg[_cur_seg_size] = item;
-  ++_cur_seg_size;
+  this->_cur_seg[this->_cur_seg_size] = item;
+  ++this->_cur_seg_size;
 }
 
-template <class E>
-E Stack<E>::pop()
+template <class E, MEMFLAGS F>
+E Stack<E, F>::pop()
 {
   assert(!is_empty(), "popping from an empty stack");
-  if (_cur_seg_size == 1) {
-    E tmp = _cur_seg[--_cur_seg_size];
+  if (this->_cur_seg_size == 1) {
+    E tmp = _cur_seg[--this->_cur_seg_size];
     pop_segment();
     return tmp;
   }
-  return _cur_seg[--_cur_seg_size];
+  return this->_cur_seg[--this->_cur_seg_size];
 }
 
-template <class E>
-void Stack<E>::clear(bool clear_cache)
+template <class E, MEMFLAGS F>
+void Stack<E, F>::clear(bool clear_cache)
 {
   free_segments(_cur_seg);
   if (clear_cache) free_segments(_cache);
   reset(clear_cache);
 }
 
-template <class E>
-size_t Stack<E>::default_segment_size()
+template <class E, MEMFLAGS F>
+size_t Stack<E, F>::default_segment_size()
 {
   // Number of elements that fit in 4K bytes minus the size of two pointers
   // (link field and malloc header).
   return (4096 - 2 * sizeof(E*)) / sizeof(E);
 }
 
-template <class E>
-size_t Stack<E>::adjust_segment_size(size_t seg_size)
+template <class E, MEMFLAGS F>
+size_t Stack<E, F>::adjust_segment_size(size_t seg_size)
 {
   const size_t elem_sz = sizeof(E);
   const size_t ptr_sz = sizeof(E*);
@@ -105,93 +105,93 @@
   return seg_size;
 }
 
-template <class E>
-size_t Stack<E>::link_offset() const
+template <class E, MEMFLAGS F>
+size_t Stack<E, F>::link_offset() const
 {
-  return align_size_up(_seg_size * sizeof(E), sizeof(E*));
+  return align_size_up(this->_seg_size * sizeof(E), sizeof(E*));
 }
 
-template <class E>
-size_t Stack<E>::segment_bytes() const
+template <class E, MEMFLAGS F>
+size_t Stack<E, F>::segment_bytes() const
 {
   return link_offset() + sizeof(E*);
 }
 
-template <class E>
-E** Stack<E>::link_addr(E* seg) const
+template <class E, MEMFLAGS F>
+E** Stack<E, F>::link_addr(E* seg) const
 {
   return (E**) ((char*)seg + link_offset());
 }
 
-template <class E>
-E* Stack<E>::get_link(E* seg) const
+template <class E, MEMFLAGS F>
+E* Stack<E, F>::get_link(E* seg) const
 {
   return *link_addr(seg);
 }
 
-template <class E>
-E* Stack<E>::set_link(E* new_seg, E* old_seg)
+template <class E, MEMFLAGS F>
+E* Stack<E, F>::set_link(E* new_seg, E* old_seg)
 {
   *link_addr(new_seg) = old_seg;
   return new_seg;
 }
 
-template <class E>
-E* Stack<E>::alloc(size_t bytes)
+template <class E, MEMFLAGS F>
+E* Stack<E, F>::alloc(size_t bytes)
 {
-  return (E*) NEW_C_HEAP_ARRAY(char, bytes);
+  return (E*) NEW_C_HEAP_ARRAY(char, bytes, F);
 }
 
-template <class E>
-void Stack<E>::free(E* addr, size_t bytes)
+template <class E, MEMFLAGS F>
+void Stack<E, F>::free(E* addr, size_t bytes)
 {
-  FREE_C_HEAP_ARRAY(char, (char*) addr);
+  FREE_C_HEAP_ARRAY(char, (char*) addr, F);
 }
 
-template <class E>
-void Stack<E>::push_segment()
+template <class E, MEMFLAGS F>
+void Stack<E, F>::push_segment()
 {
-  assert(_cur_seg_size == _seg_size, "current segment is not full");
+  assert(this->_cur_seg_size == this->_seg_size, "current segment is not full");
   E* next;
-  if (_cache_size > 0) {
+  if (this->_cache_size > 0) {
     // Use a cached segment.
     next = _cache;
     _cache = get_link(_cache);
-    --_cache_size;
+    --this->_cache_size;
   } else {
     next = alloc(segment_bytes());
     DEBUG_ONLY(zap_segment(next, true);)
   }
   const bool at_empty_transition = is_empty();
-  _cur_seg = set_link(next, _cur_seg);
-  _cur_seg_size = 0;
-  _full_seg_size += at_empty_transition ? 0 : _seg_size;
+  this->_cur_seg = set_link(next, _cur_seg);
+  this->_cur_seg_size = 0;
+  this->_full_seg_size += at_empty_transition ? 0 : this->_seg_size;
   DEBUG_ONLY(verify(at_empty_transition);)
 }
 
-template <class E>
-void Stack<E>::pop_segment()
+template <class E, MEMFLAGS F>
+void Stack<E, F>::pop_segment()
 {
-  assert(_cur_seg_size == 0, "current segment is not empty");
+  assert(this->_cur_seg_size == 0, "current segment is not empty");
   E* const prev = get_link(_cur_seg);
-  if (_cache_size < _max_cache_size) {
+  if (this->_cache_size < this->_max_cache_size) {
     // Add the current segment to the cache.
     DEBUG_ONLY(zap_segment(_cur_seg, false);)
     _cache = set_link(_cur_seg, _cache);
-    ++_cache_size;
+    ++this->_cache_size;
   } else {
     DEBUG_ONLY(zap_segment(_cur_seg, true);)
     free(_cur_seg, segment_bytes());
   }
   const bool at_empty_transition = prev == NULL;
-  _cur_seg = prev;
-  _cur_seg_size = _seg_size;
-  _full_seg_size -= at_empty_transition ? 0 : _seg_size;
+  this->_cur_seg = prev;
+  this->_cur_seg_size = this->_seg_size;
+  this->_full_seg_size -= at_empty_transition ? 0 : this->_seg_size;
   DEBUG_ONLY(verify(at_empty_transition);)
 }
 
-template <class E>
-void Stack<E>::free_segments(E* seg)
+template <class E, MEMFLAGS F>
+void Stack<E, F>::free_segments(E* seg)
 {
   const size_t bytes = segment_bytes();
   while (seg != NULL) {
@@ -201,37 +201,37 @@
   }
 }
 
-template <class E>
-void Stack<E>::reset(bool reset_cache)
+template <class E, MEMFLAGS F>
+void Stack<E, F>::reset(bool reset_cache)
 {
-  _cur_seg_size = _seg_size; // So push() will alloc a new segment.
-  _full_seg_size = 0;
+  this->_cur_seg_size = this->_seg_size; // So push() will alloc a new segment.
+  this->_full_seg_size = 0;
   _cur_seg = NULL;
   if (reset_cache) {
-    _cache_size = 0;
+    this->_cache_size = 0;
     _cache = NULL;
   }
 }
 
 #ifdef ASSERT
-template <class E>
-void Stack<E>::verify(bool at_empty_transition) const
+template <class E, MEMFLAGS F>
+void Stack<E, F>::verify(bool at_empty_transition) const
 {
-  assert(size() <= max_size(), "stack exceeded bounds");
-  assert(cache_size() <= max_cache_size(), "cache exceeded bounds");
-  assert(_cur_seg_size <= segment_size(), "segment index exceeded bounds");
+  assert(size() <= this->max_size(), "stack exceeded bounds");
+  assert(this->cache_size() <= this->max_cache_size(), "cache exceeded bounds");
+  assert(this->_cur_seg_size <= this->segment_size(), "segment index exceeded bounds");
 
-  assert(_full_seg_size % _seg_size == 0, "not a multiple");
+  assert(this->_full_seg_size % this->_seg_size == 0, "not a multiple");
   assert(at_empty_transition || is_empty() == (size() == 0), "mismatch");
-  assert((_cache == NULL) == (cache_size() == 0), "mismatch");
+  assert((_cache == NULL) == (this->cache_size() == 0), "mismatch");
 
   if (is_empty()) {
-    assert(_cur_seg_size == segment_size(), "sanity");
+    assert(this->_cur_seg_size == this->segment_size(), "sanity");
   }
 }
 
-template <class E>
-void Stack<E>::zap_segment(E* seg, bool zap_link_field) const
+template <class E, MEMFLAGS F>
+void Stack<E, F>::zap_segment(E* seg, bool zap_link_field) const
 {
   if (!ZapStackSegments) return;
   const size_t zap_bytes = segment_bytes() - (zap_link_field ? 0 : sizeof(E*));
@@ -243,28 +243,28 @@
 }
 #endif
 
-template <class E>
-E* ResourceStack<E>::alloc(size_t bytes)
+template <class E, MEMFLAGS F>
+E* ResourceStack<E, F>::alloc(size_t bytes)
 {
   return (E*) resource_allocate_bytes(bytes);
 }
 
-template <class E>
-void ResourceStack<E>::free(E* addr, size_t bytes)
+template <class E, MEMFLAGS F>
+void ResourceStack<E, F>::free(E* addr, size_t bytes)
 {
   resource_free_bytes((char*) addr, bytes);
 }
 
-template <class E>
-void StackIterator<E>::sync()
+template <class E, MEMFLAGS F>
+void StackIterator<E, F>::sync()
 {
   _full_seg_size = _stack._full_seg_size;
   _cur_seg_size = _stack._cur_seg_size;
   _cur_seg = _stack._cur_seg;
 }
 
-template <class E>
-E* StackIterator<E>::next_addr()
+template <class E, MEMFLAGS F>
+E* StackIterator<E, F>::next_addr()
 {
   assert(!is_empty(), "no items left");
   if (_cur_seg_size == 1) {
--- a/src/share/vm/utilities/taskqueue.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/taskqueue.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -132,8 +132,8 @@
 }
 #endif // TASKQUEUE_STATS
 
-template <unsigned int N>
-class TaskQueueSuper: public CHeapObj {
+template <unsigned int N, MEMFLAGS F>
+class TaskQueueSuper: public CHeapObj<F> {
 protected:
   // Internal type for indexing the queue; also used for the tag.
   typedef NOT_LP64(uint16_t) LP64_ONLY(uint32_t) idx_t;
@@ -249,22 +249,27 @@
   TASKQUEUE_STATS_ONLY(TaskQueueStats stats;)
 };
 
-template<class E, unsigned int N = TASKQUEUE_SIZE>
-class GenericTaskQueue: public TaskQueueSuper<N> {
-protected:
-  typedef typename TaskQueueSuper<N>::Age Age;
-  typedef typename TaskQueueSuper<N>::idx_t idx_t;
+
 
-  using TaskQueueSuper<N>::_bottom;
-  using TaskQueueSuper<N>::_age;
-  using TaskQueueSuper<N>::increment_index;
-  using TaskQueueSuper<N>::decrement_index;
-  using TaskQueueSuper<N>::dirty_size;
+template <class E, MEMFLAGS F, unsigned int N = TASKQUEUE_SIZE>
+class GenericTaskQueue: public TaskQueueSuper<N, F> {
+protected:
+  typedef typename TaskQueueSuper<N, F>::Age Age;
+  typedef typename TaskQueueSuper<N, F>::idx_t idx_t;
+
+  using TaskQueueSuper<N, F>::_bottom;
+  using TaskQueueSuper<N, F>::_age;
+  using TaskQueueSuper<N, F>::increment_index;
+  using TaskQueueSuper<N, F>::decrement_index;
+  using TaskQueueSuper<N, F>::dirty_size;
 
 public:
-  using TaskQueueSuper<N>::max_elems;
-  using TaskQueueSuper<N>::size;
-  TASKQUEUE_STATS_ONLY(using TaskQueueSuper<N>::stats;)
+  using TaskQueueSuper<N, F>::max_elems;
+  using TaskQueueSuper<N, F>::size;
+
+#if  TASKQUEUE_STATS
+  using TaskQueueSuper<N, F>::stats;
+#endif
 
 private:
   // Slow paths for push, pop_local.  (pop_global has no fast path.)
@@ -302,18 +307,18 @@
   volatile E* _elems;
 };
 
-template<class E, unsigned int N>
-GenericTaskQueue<E, N>::GenericTaskQueue() {
+template<class E, MEMFLAGS F, unsigned int N>
+GenericTaskQueue<E, F, N>::GenericTaskQueue() {
   assert(sizeof(Age) == sizeof(size_t), "Depends on this.");
 }
 
-template<class E, unsigned int N>
-void GenericTaskQueue<E, N>::initialize() {
-  _elems = NEW_C_HEAP_ARRAY(E, N);
+template<class E, MEMFLAGS F, unsigned int N>
+void GenericTaskQueue<E, F, N>::initialize() {
+  _elems = NEW_C_HEAP_ARRAY(E, N, F);
 }
 
-template<class E, unsigned int N>
-void GenericTaskQueue<E, N>::oops_do(OopClosure* f) {
+template<class E, MEMFLAGS F, unsigned int N>
+void GenericTaskQueue<E, F, N>::oops_do(OopClosure* f) {
   // tty->print_cr("START OopTaskQueue::oops_do");
   uint iters = size();
   uint index = _bottom;
@@ -329,8 +334,8 @@
   // tty->print_cr("END OopTaskQueue::oops_do");
 }
 
-template<class E, unsigned int N>
-bool GenericTaskQueue<E, N>::push_slow(E t, uint dirty_n_elems) {
+template<class E, MEMFLAGS F, unsigned int N>
+bool GenericTaskQueue<E, F, N>::push_slow(E t, uint dirty_n_elems) {
   if (dirty_n_elems == N - 1) {
     // Actually means 0, so do the push.
     uint localBot = _bottom;
@@ -349,8 +354,8 @@
 // whenever the queue goes empty which it will do here if this thread
 // gets the last task or in pop_global() if the queue wraps (top == 0
 // and pop_global() succeeds, see pop_global()).
-template<class E, unsigned int N>
-bool GenericTaskQueue<E, N>::pop_local_slow(uint localBot, Age oldAge) {
+template<class E, MEMFLAGS F, unsigned int N>
+bool GenericTaskQueue<E, F, N>::pop_local_slow(uint localBot, Age oldAge) {
   // This queue was observed to contain exactly one element; either this
   // thread will claim it, or a competing "pop_global".  In either case,
   // the queue will be logically empty afterwards.  Create a new Age value
@@ -382,8 +387,8 @@
   return false;
 }
 
-template<class E, unsigned int N>
-bool GenericTaskQueue<E, N>::pop_global(E& t) {
+template<class E, MEMFLAGS F, unsigned int N>
+bool GenericTaskQueue<E, F, N>::pop_global(E& t) {
   Age oldAge = _age.get();
   uint localBot = _bottom;
   uint n_elems = size(localBot, oldAge.top());
@@ -402,9 +407,9 @@
   return resAge == oldAge;
 }
 
-template<class E, unsigned int N>
-GenericTaskQueue<E, N>::~GenericTaskQueue() {
-  FREE_C_HEAP_ARRAY(E, _elems);
+template<class E, MEMFLAGS F, unsigned int N>
+GenericTaskQueue<E, F, N>::~GenericTaskQueue() {
+  FREE_C_HEAP_ARRAY(E, _elems, F);
 }
 
 // OverflowTaskQueue is a TaskQueue that also includes an overflow stack for
@@ -418,12 +423,12 @@
 // Note that size() is not hidden--it returns the number of elements in the
 // TaskQueue, and does not include the size of the overflow stack.  This
 // simplifies replacement of GenericTaskQueues with OverflowTaskQueues.
-template<class E, unsigned int N = TASKQUEUE_SIZE>
-class OverflowTaskQueue: public GenericTaskQueue<E, N>
+template<class E, MEMFLAGS F, unsigned int N = TASKQUEUE_SIZE>
+class OverflowTaskQueue: public GenericTaskQueue<E, F, N>
 {
 public:
-  typedef Stack<E>               overflow_t;
-  typedef GenericTaskQueue<E, N> taskqueue_t;
+  typedef Stack<E, F>               overflow_t;
+  typedef GenericTaskQueue<E, F, N> taskqueue_t;
 
   TASKQUEUE_STATS_ONLY(using taskqueue_t::stats;)
 
@@ -445,8 +450,8 @@
   overflow_t _overflow_stack;
 };
 
-template <class E, unsigned int N>
-bool OverflowTaskQueue<E, N>::push(E t)
+template <class E, MEMFLAGS F, unsigned int N>
+bool OverflowTaskQueue<E, F, N>::push(E t)
 {
   if (!taskqueue_t::push(t)) {
     overflow_stack()->push(t);
@@ -455,15 +460,15 @@
   return true;
 }
 
-template <class E, unsigned int N>
-bool OverflowTaskQueue<E, N>::pop_overflow(E& t)
+template <class E, MEMFLAGS F, unsigned int N>
+bool OverflowTaskQueue<E, F, N>::pop_overflow(E& t)
 {
   if (overflow_empty()) return false;
   t = overflow_stack()->pop();
   return true;
 }
 
-class TaskQueueSetSuper: public CHeapObj {
+class TaskQueueSetSuper {
 protected:
   static int randomParkAndMiller(int* seed0);
 public:
@@ -471,8 +476,11 @@
   virtual bool peek() = 0;
 };
 
-template<class T>
-class GenericTaskQueueSet: public TaskQueueSetSuper {
+template <MEMFLAGS F> class TaskQueueSetSuperImpl: public CHeapObj<F>, public TaskQueueSetSuper {
+};
+
+template<class T, MEMFLAGS F>
+class GenericTaskQueueSet: public TaskQueueSetSuperImpl<F> {
 private:
   uint _n;
   T** _queues;
@@ -482,7 +490,7 @@
 
   GenericTaskQueueSet(int n) : _n(n) {
     typedef T* GenericTaskQueuePtr;
-    _queues = NEW_C_HEAP_ARRAY(GenericTaskQueuePtr, n);
+    _queues = NEW_C_HEAP_ARRAY(GenericTaskQueuePtr, n, F);
     for (int i = 0; i < n; i++) {
       _queues[i] = NULL;
     }
@@ -506,19 +514,19 @@
   bool peek();
 };
 
-template<class T> void
-GenericTaskQueueSet<T>::register_queue(uint i, T* q) {
+template<class T, MEMFLAGS F> void
+GenericTaskQueueSet<T, F>::register_queue(uint i, T* q) {
   assert(i < _n, "index out of range.");
   _queues[i] = q;
 }
 
-template<class T> T*
-GenericTaskQueueSet<T>::queue(uint i) {
+template<class T, MEMFLAGS F> T*
+GenericTaskQueueSet<T, F>::queue(uint i) {
   return _queues[i];
 }
 
-template<class T> bool
-GenericTaskQueueSet<T>::steal(uint queue_num, int* seed, E& t) {
+template<class T, MEMFLAGS F> bool
+GenericTaskQueueSet<T, F>::steal(uint queue_num, int* seed, E& t) {
   for (uint i = 0; i < 2 * _n; i++) {
     if (steal_best_of_2(queue_num, seed, t)) {
       TASKQUEUE_STATS_ONLY(queue(queue_num)->stats.record_steal(true));
@@ -529,8 +537,8 @@
   return false;
 }
 
-template<class T> bool
-GenericTaskQueueSet<T>::steal_best_of_all(uint queue_num, int* seed, E& t) {
+template<class T, MEMFLAGS F> bool
+GenericTaskQueueSet<T, F>::steal_best_of_all(uint queue_num, int* seed, E& t) {
   if (_n > 2) {
     int best_k;
     uint best_sz = 0;
@@ -553,11 +561,11 @@
   }
 }
 
-template<class T> bool
-GenericTaskQueueSet<T>::steal_1_random(uint queue_num, int* seed, E& t) {
+template<class T, MEMFLAGS F> bool
+GenericTaskQueueSet<T, F>::steal_1_random(uint queue_num, int* seed, E& t) {
   if (_n > 2) {
     uint k = queue_num;
-    while (k == queue_num) k = randomParkAndMiller(seed) % _n;
+    while (k == queue_num) k = TaskQueueSetSuper::randomParkAndMiller(seed) % _n;
     return _queues[2]->pop_global(t);
   } else if (_n == 2) {
     // Just try the other one.
@@ -569,13 +577,13 @@
   }
 }
 
-template<class T> bool
-GenericTaskQueueSet<T>::steal_best_of_2(uint queue_num, int* seed, E& t) {
+template<class T, MEMFLAGS F> bool
+GenericTaskQueueSet<T, F>::steal_best_of_2(uint queue_num, int* seed, E& t) {
   if (_n > 2) {
     uint k1 = queue_num;
-    while (k1 == queue_num) k1 = randomParkAndMiller(seed) % _n;
+    while (k1 == queue_num) k1 = TaskQueueSetSuper::randomParkAndMiller(seed) % _n;
     uint k2 = queue_num;
-    while (k2 == queue_num || k2 == k1) k2 = randomParkAndMiller(seed) % _n;
+    while (k2 == queue_num || k2 == k1) k2 = TaskQueueSetSuper::randomParkAndMiller(seed) % _n;
     // Sample both and try the larger.
     uint sz1 = _queues[k1]->size();
     uint sz2 = _queues[k2]->size();
@@ -591,8 +599,8 @@
   }
 }
 
-template<class T>
-bool GenericTaskQueueSet<T>::peek() {
+template<class T, MEMFLAGS F>
+bool GenericTaskQueueSet<T, F>::peek() {
   // Try all the queues.
   for (uint j = 0; j < _n; j++) {
     if (_queues[j]->peek())
@@ -602,7 +610,7 @@
 }
 
 // When to terminate from the termination protocol.
-class TerminatorTerminator: public CHeapObj {
+class TerminatorTerminator: public CHeapObj<mtInternal> {
 public:
   virtual bool should_exit_termination() = 0;
 };
@@ -665,8 +673,8 @@
 #endif
 };
 
-template<class E, unsigned int N> inline bool
-GenericTaskQueue<E, N>::push(E t) {
+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.");
   idx_t top = _age.top();
@@ -683,8 +691,8 @@
   }
 }
 
-template<class E, unsigned int N> inline bool
-GenericTaskQueue<E, N>::pop_local(E& t) {
+template<class E, MEMFLAGS F, unsigned int N> inline bool
+GenericTaskQueue<E, F, N>::pop_local(E& t) {
   uint localBot = _bottom;
   // This value cannot be N-1.  That can only occur as a result of
   // the assignment to bottom in this method.  If it does, this method
@@ -715,8 +723,8 @@
   }
 }
 
-typedef GenericTaskQueue<oop>             OopTaskQueue;
-typedef GenericTaskQueueSet<OopTaskQueue> OopTaskQueueSet;
+typedef GenericTaskQueue<oop, mtGC>             OopTaskQueue;
+typedef GenericTaskQueueSet<OopTaskQueue, mtGC> OopTaskQueueSet;
 
 #ifdef _MSC_VER
 #pragma warning(push)
@@ -796,11 +804,11 @@
 #pragma warning(pop)
 #endif
 
-typedef OverflowTaskQueue<StarTask>           OopStarTaskQueue;
-typedef GenericTaskQueueSet<OopStarTaskQueue> OopStarTaskQueueSet;
+typedef OverflowTaskQueue<StarTask, mtClass>           OopStarTaskQueue;
+typedef GenericTaskQueueSet<OopStarTaskQueue, mtClass> OopStarTaskQueueSet;
 
-typedef OverflowTaskQueue<size_t>             RegionTaskQueue;
-typedef GenericTaskQueueSet<RegionTaskQueue>  RegionTaskQueueSet;
+typedef OverflowTaskQueue<size_t, mtInternal>             RegionTaskQueue;
+typedef GenericTaskQueueSet<RegionTaskQueue, mtClass>     RegionTaskQueueSet;
 
 
 #endif // SHARE_VM_UTILITIES_TASKQUEUE_HPP
--- a/src/share/vm/utilities/vmError.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/vmError.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -33,6 +33,7 @@
 #include "runtime/thread.hpp"
 #include "runtime/vmThread.hpp"
 #include "runtime/vm_operations.hpp"
+#include "services/memTracker.hpp"
 #include "utilities/debug.hpp"
 #include "utilities/decoder.hpp"
 #include "utilities/defaultStream.hpp"
@@ -451,7 +452,9 @@
      // VM version
      st->print_cr("#");
      JDK_Version::current().to_string(buf, sizeof(buf));
-     st->print_cr("# JRE version: %s", buf);
+     const char* runtime_name = JDK_Version::runtime_name() != NULL ?
+                                  JDK_Version::runtime_name() : "";
+     st->print_cr("# JRE version: %s (%s)", runtime_name, buf);
      st->print_cr("# Java VM: %s (%s %s %s %s)",
                    Abstract_VM_Version::vm_name(),
                    Abstract_VM_Version::vm_release(),
@@ -826,6 +829,9 @@
   static bool transmit_report_done = false; // done error reporting
   static fdStream log;                  // error log
 
+  // disble NMT to avoid further exception
+  MemTracker::shutdown(MemTracker::NMT_error_reporting);
+
   if (SuppressFatalErrorMessage) {
       os::abort();
   }
--- a/src/share/vm/utilities/workgroup.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/workgroup.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -77,7 +77,7 @@
                   name(),
                   total_workers());
   }
-  _gang_workers = NEW_C_HEAP_ARRAY(GangWorker*, total_workers());
+  _gang_workers = NEW_C_HEAP_ARRAY(GangWorker*, total_workers(), mtInternal);
   if (gang_workers() == NULL) {
     vm_exit_out_of_memory(0, "Cannot create GangWorker array.");
     return false;
@@ -241,6 +241,7 @@
 
 void GangWorker::initialize() {
   this->initialize_thread_local_storage();
+  this->record_stack_base_and_size();
   assert(_gang != NULL, "No gang to run in");
   os::set_priority(this, NearMaxPriority);
   if (TraceWorkGang) {
@@ -421,7 +422,7 @@
 
 SubTasksDone::SubTasksDone(uint n) :
   _n_tasks(n), _n_threads(1), _tasks(NULL) {
-  _tasks = NEW_C_HEAP_ARRAY(uint, n);
+  _tasks = NEW_C_HEAP_ARRAY(uint, n, mtInternal);
   guarantee(_tasks != NULL, "alloc failure");
   clear();
 }
@@ -476,7 +477,7 @@
 
 
 SubTasksDone::~SubTasksDone() {
-  if (_tasks != NULL) FREE_C_HEAP_ARRAY(jint, _tasks);
+  if (_tasks != NULL) FREE_C_HEAP_ARRAY(jint, _tasks, mtInternal);
 }
 
 // *** SequentialSubTasksDone
--- a/src/share/vm/utilities/workgroup.hpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/workgroup.hpp	Fri Aug 03 20:23:25 2012 +0100
@@ -123,7 +123,7 @@
 // Class AbstractWorkGang:
 // An abstract class representing a gang of workers.
 // You subclass this to supply an implementation of run_task().
-class AbstractWorkGang: public CHeapObj {
+class AbstractWorkGang: public CHeapObj<mtInternal> {
   // Here's the public interface to this class.
 public:
   // Constructor and destructor.
@@ -402,7 +402,7 @@
 // subtasks will be identified by integer indices, usually elements of an
 // enumeration type.
 
-class SubTasksDone : public CHeapObj {
+class SubTasksDone: public CHeapObj<mtInternal> {
   uint* _tasks;
   uint _n_tasks;
   // _n_threads is used to determine when a sub task is done.
--- a/src/share/vm/utilities/xmlstream.cpp	Thu Aug 02 17:00:18 2012 +0100
+++ b/src/share/vm/utilities/xmlstream.cpp	Fri Aug 03 20:23:25 2012 +0100
@@ -43,7 +43,7 @@
 #ifdef ASSERT
   _element_depth = 0;
   int   init_len = 100;
-  char* init_buf = NEW_C_HEAP_ARRAY(char, init_len);
+  char* init_buf = NEW_C_HEAP_ARRAY(char, init_len, mtInternal);
   _element_close_stack_low  = init_buf;
   _element_close_stack_high = init_buf + init_len;
   _element_close_stack_ptr  = init_buf + init_len - 1;
@@ -58,7 +58,7 @@
 
 #ifdef ASSERT
 xmlStream::~xmlStream() {
-  FREE_C_HEAP_ARRAY(char, _element_close_stack_low);
+  FREE_C_HEAP_ARRAY(char, _element_close_stack_low, mtInternal);
 }
 #endif
 
@@ -155,14 +155,14 @@
     int old_len = _element_close_stack_high - old_ptr;
     int new_len = old_len * 2;
     if (new_len < 100)  new_len = 100;
-    char* new_low  = NEW_C_HEAP_ARRAY(char, new_len);
+    char* new_low  = NEW_C_HEAP_ARRAY(char, new_len, mtInternal);
     char* new_high = new_low + new_len;
     char* new_ptr  = new_high - old_len;
     memcpy(new_ptr, old_ptr, old_len);
     _element_close_stack_high = new_high;
     _element_close_stack_low  = new_low;
     _element_close_stack_ptr  = new_ptr;
-    FREE_C_HEAP_ARRAY(char, old_low);
+    FREE_C_HEAP_ARRAY(char, old_low, mtInternal);
     push_ptr = new_ptr - (tag_len+1);
   }
   assert(push_ptr >= _element_close_stack_low, "in range");
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestBooleanVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,952 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestBooleanVect
+ */
+
+public class TestBooleanVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Boolean vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    boolean[] a1 = new boolean[ARRLEN];
+    boolean[] a2 = new boolean[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1);
+      test_vi(a2, true);
+      test_cp(a1, a2);
+      test_2ci(a1, a2);
+      test_2vi(a1, a2, true, true);
+      test_ci_neg(a1);
+      test_vi_neg(a2, true);
+      test_cp_neg(a1, a2);
+      test_2ci_neg(a1, a2);
+      test_2vi_neg(a1, a2, true, true);
+      test_ci_oppos(a1);
+      test_vi_oppos(a2, true);
+      test_cp_oppos(a1, a2);
+      test_2ci_oppos(a1, a2);
+      test_2vi_oppos(a1, a2, true, true);
+      test_ci_off(a1);
+      test_vi_off(a2, true);
+      test_cp_off(a1, a2);
+      test_2ci_off(a1, a2);
+      test_2vi_off(a1, a2, true, true);
+      test_ci_inv(a1, OFFSET);
+      test_vi_inv(a2, true, OFFSET);
+      test_cp_inv(a1, a2, OFFSET);
+      test_2ci_inv(a1, a2, OFFSET);
+      test_2vi_inv(a1, a2, true, true, OFFSET);
+      test_ci_scl(a1);
+      test_vi_scl(a2, true);
+      test_cp_scl(a1, a2);
+      test_2ci_scl(a1, a2);
+      test_2vi_scl(a1, a2, true, true);
+      test_cp_alndst(a1, a2);
+      test_cp_alnsrc(a1, a2);
+      test_2ci_aln(a1, a2);
+      test_2vi_aln(a1, a2, true, true);
+      test_cp_unalndst(a1, a2);
+      test_cp_unalnsrc(a1, a2);
+      test_2ci_unaln(a1, a2);
+      test_2vi_unaln(a1, a2, true, true);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = false;
+      a2[i] = false;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], false);
+      }
+      test_vi(a2, true);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], true);
+      }
+      test_cp(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], true);
+      }
+      test_2ci(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci: a1", i, a1[i], false);
+        errn += verify("test_2ci: a2", i, a2[i], false);
+      }
+      test_2vi(a1, a2, true, true);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi: a1", i, a1[i], true);
+        errn += verify("test_2vi: a2", i, a2[i], true);
+      }
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = false;
+        a2[i] = false;
+      }
+      test_ci_neg(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], false);
+      }
+      test_vi_neg(a2, true);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], true);
+      }
+      test_cp_neg(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], true);
+      }
+      test_2ci_neg(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci_neg: a1", i, a1[i], false);
+        errn += verify("test_2ci_neg: a2", i, a2[i], false);
+      }
+      test_2vi_neg(a1, a2, true, true);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi_neg: a1", i, a1[i], true);
+        errn += verify("test_2vi_neg: a2", i, a2[i], true);
+      }
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = false;
+        a2[i] = false;
+      }
+      test_ci_oppos(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], false);
+      }
+      test_vi_oppos(a2, true);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], true);
+      }
+      test_cp_oppos(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], true);
+      }
+      test_2ci_oppos(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci_oppos: a1", i, a1[i], false);
+        errn += verify("test_2ci_oppos: a2", i, a2[i], false);
+      }
+      test_2vi_oppos(a1, a2, true, true);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi_oppos: a1", i, a1[i], true);
+        errn += verify("test_2vi_oppos: a2", i, a2[i], true);
+      }
+      // Reset for indexing with offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = false;
+        a2[i] = false;
+      }
+      test_ci_off(a1);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_ci_off: a1", i, a1[i], false);
+      }
+      test_vi_off(a2, true);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_vi_off: a2", i, a2[i], true);
+      }
+      test_cp_off(a1, a2);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_cp_off: a1", i, a1[i], true);
+      }
+      test_2ci_off(a1, a2);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2ci_off: a1", i, a1[i], false);
+        errn += verify("test_2ci_off: a2", i, a2[i], false);
+      }
+      test_2vi_off(a1, a2, true, true);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2vi_off: a1", i, a1[i], true);
+        errn += verify("test_2vi_off: a2", i, a2[i], true);
+      }
+      for (int i=0; i<OFFSET; i++) {
+        errn += verify("test_2vi_off: a1", i, a1[i], false);
+        errn += verify("test_2vi_off: a2", i, a2[i], false);
+      }
+      // Reset for indexing with invariant offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = false;
+        a2[i] = false;
+      }
+      test_ci_inv(a1, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_ci_inv: a1", i, a1[i], false);
+      }
+      test_vi_inv(a2, true, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_vi_inv: a2", i, a2[i], true);
+      }
+      test_cp_inv(a1, a2, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_cp_inv: a1", i, a1[i], true);
+      }
+      test_2ci_inv(a1, a2, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2ci_inv: a1", i, a1[i], false);
+        errn += verify("test_2ci_inv: a2", i, a2[i], false);
+      }
+      test_2vi_inv(a1, a2, true, true, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2vi_inv: a1", i, a1[i], true);
+        errn += verify("test_2vi_inv: a2", i, a2[i], true);
+      }
+      for (int i=0; i<OFFSET; i++) {
+        errn += verify("test_2vi_inv: a1", i, a1[i], false);
+        errn += verify("test_2vi_inv: a2", i, a2[i], false);
+      }
+      // Reset for indexing with scale
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = true;
+        a2[i] = false;
+      }
+      test_ci_scl(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        boolean val = (i%SCALE != 0);
+        errn += verify("test_ci_scl: a1", i, a1[i], val);
+      }
+      test_vi_scl(a2, true);
+      for (int i=0; i<ARRLEN; i++) {
+        boolean val = (i%SCALE == 0);
+        errn += verify("test_vi_scl: a2", i, a2[i], val);
+      }
+      test_cp_scl(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_scl: a1", i, a1[i], true);
+      }
+      test_2ci_scl(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        if (i%SCALE != 0) {
+          errn += verify("test_2ci_scl: a1", i, a1[i], true);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2ci_scl: a1", i*SCALE, a1[i*SCALE], false);
+        }
+        if (i%SCALE != 0) {
+          errn += verify("test_2ci_scl: a2", i, a2[i], false);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2ci_scl: a2", i*SCALE, a2[i*SCALE], false);
+        }
+      }
+      test_2vi_scl(a1, a2, false, true);
+      for (int i=0; i<ARRLEN; i++) {
+        if (i%SCALE != 0) {
+          errn += verify("test_2vi_scl: a1", i, a1[i], true);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2vi_scl: a1", i*SCALE, a1[i*SCALE], false);
+        }
+        if (i%SCALE != 0) {
+          errn += verify("test_2vi_scl: a2", i, a2[i], false);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2vi_scl: a2", i*SCALE, a2[i*SCALE], true);
+        }
+      }
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = false;
+        a2[i] = false;
+      }
+      test_vi(a2, true);
+      test_cp_alndst(a1, a2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], false);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], true);
+      }
+      test_vi(a2, false);
+      test_cp_alnsrc(a1, a2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], false);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], true);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = false;
+        a2[i] = false;
+      }
+      test_2ci_aln(a1, a2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln: a1", i, a1[i], false);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln: a1", i, a1[i], false);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln: a2", i, a2[i], false);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln: a2", i, a2[i], false);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = false;
+        a2[i] = false;
+      }
+      test_2vi_aln(a1, a2, true, true);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln: a1", i, a1[i], true);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln: a1", i, a1[i], false);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln: a2", i, a2[i], false);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln: a2", i, a2[i], true);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = false;
+        a2[i] = false;
+      }
+      test_vi(a2, true);
+      test_cp_unalndst(a1, a2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], false);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], true);
+      }
+      test_vi(a2, false);
+      test_cp_unalnsrc(a1, a2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], false);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], true);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = false;
+        a2[i] = false;
+      }
+      test_2ci_unaln(a1, a2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln: a1", i, a1[i], false);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln: a1", i, a1[i], false);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln: a2", i, a2[i], false);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln: a2", i, a2[i], false);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = false;
+        a2[i] = false;
+      }
+      test_2vi_unaln(a1, a2, true, true);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln: a1", i, a1[i], true);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln: a1", i, a1[i], false);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln: a2", i, a2[i], false);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln: a2", i, a2[i], true);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (i > 0);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = false;
+      }
+      test_cp_alndst(a1, a1);
+      for (int i=0; i<ARRLEN; i++) {
+        boolean v = (i%ALIGN_OFF > 0);
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = false;
+      }
+      test_cp_alnsrc(a1, a1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], false);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        boolean v = (i%ALIGN_OFF > 0);
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], v);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = false;
+      }
+      test_2ci_aln(a1, a1);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln_overlap: a1", i, a1[i], false);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln_overlap: a1", i, a1[i], false);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = false;
+      }
+      test_2vi_aln(a1, a1, true, true);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln_overlap: a1", i, a1[i], true);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln_overlap: a1", i, a1[i], true);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (i > 0);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = false;
+      }
+      test_cp_unalndst(a1, a1);
+      for (int i=0; i<ARRLEN; i++) {
+        boolean v = (i%UNALIGN_OFF > 0);
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = false;
+      }
+      test_cp_unalnsrc(a1, a1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], false);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        boolean v = (i%UNALIGN_OFF > 0);
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], v);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = false;
+      }
+      test_2ci_unaln(a1, a1);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], false);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], false);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = false;
+      }
+      test_2vi_unaln(a1, a1, true, true);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], true);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], true);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, true);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi(a1, a2, true, true);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a2, true);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_neg(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_neg(a1, a2, true, true);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_neg: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a2, true);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_oppos(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_oppos(a1, a2, true, true);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_oppos: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_off(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_off(a2, true);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_off(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_off(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_off(a1, a2, true, true);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_off: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_inv(a1, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_inv(a2, true, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_inv(a1, a2, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_inv(a1, a2, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_inv(a1, a2, true, true, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_inv: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_scl(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_scl(a2, true);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_scl(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_scl(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_scl(a1, a2, true, true);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_scl: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_aln(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_aln(a1, a2, true, true);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_aln: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_unaln(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_unaln(a1, a2, true, true);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_unaln: " + (end - start));
+
+    return errn;
+  }
+
+  static void test_ci(boolean[] a) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = false;
+    }
+  }
+  static void test_vi(boolean[] a, boolean b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b;
+    }
+  }
+  static void test_cp(boolean[] a, boolean[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+    }
+  }
+  static void test_2ci(boolean[] a, boolean[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = false;
+      b[i] = false;
+    }
+  }
+  static void test_2vi(boolean[] a, boolean[] b, boolean c, boolean d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_ci_neg(boolean[] a) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = false;
+    }
+  }
+  static void test_vi_neg(boolean[] a, boolean b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b;
+    }
+  }
+  static void test_cp_neg(boolean[] a, boolean[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+    }
+  }
+  static void test_2ci_neg(boolean[] a, boolean[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = false;
+      b[i] = false;
+    }
+  }
+  static void test_2vi_neg(boolean[] a, boolean[] b, boolean c, boolean d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_ci_oppos(boolean[] a) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = false;
+    }
+  }
+  static void test_vi_oppos(boolean[] a, boolean b) {
+    int limit = a.length-1;
+    for (int i = limit; i >= 0; i-=1) {
+      a[limit-i] = b;
+    }
+  }
+  static void test_cp_oppos(boolean[] a, boolean[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+    }
+  }
+  static void test_2ci_oppos(boolean[] a, boolean[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = false;
+      b[i] = false;
+    }
+  }
+  static void test_2vi_oppos(boolean[] a, boolean[] b, boolean c, boolean d) {
+    int limit = a.length-1;
+    for (int i = limit; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_ci_off(boolean[] a) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = false;
+    }
+  }
+  static void test_vi_off(boolean[] a, boolean b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = b;
+    }
+  }
+  static void test_cp_off(boolean[] a, boolean[] b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = b[i+OFFSET];
+    }
+  }
+  static void test_2ci_off(boolean[] a, boolean[] b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = false;
+      b[i+OFFSET] = false;
+    }
+  }
+  static void test_2vi_off(boolean[] a, boolean[] b, boolean c, boolean d) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = c;
+      b[i+OFFSET] = d;
+    }
+  }
+  static void test_ci_inv(boolean[] a, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = false;
+    }
+  }
+  static void test_vi_inv(boolean[] a, boolean b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = b;
+    }
+  }
+  static void test_cp_inv(boolean[] a, boolean[] b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = b[i+k];
+    }
+  }
+  static void test_2ci_inv(boolean[] a, boolean[] b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = false;
+      b[i+k] = false;
+    }
+  }
+  static void test_2vi_inv(boolean[] a, boolean[] b, boolean c, boolean d, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = c;
+      b[i+k] = d;
+    }
+  }
+  static void test_ci_scl(boolean[] a) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = false;
+    }
+  }
+  static void test_vi_scl(boolean[] a, boolean b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = b;
+    }
+  }
+  static void test_cp_scl(boolean[] a, boolean[] b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = b[i*SCALE];
+    }
+  }
+  static void test_2ci_scl(boolean[] a, boolean[] b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = false;
+      b[i*SCALE] = false;
+    }
+  }
+  static void test_2vi_scl(boolean[] a, boolean[] b, boolean c, boolean d) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = c;
+      b[i*SCALE] = d;
+    }
+  }
+  static void test_cp_alndst(boolean[] a, boolean[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+    }
+  }
+  static void test_cp_alnsrc(boolean[] a, boolean[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+    }
+  }
+  static void test_2ci_aln(boolean[] a, boolean[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = false;
+      b[i] = false;
+    }
+  }
+  static void test_2vi_aln(boolean[] a, boolean[] b, boolean c, boolean d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(boolean[] a, boolean[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+    }
+  }
+  static void test_cp_unalnsrc(boolean[] a, boolean[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+    }
+  }
+  static void test_2ci_unaln(boolean[] a, boolean[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = false;
+      b[i] = false;
+    }
+  }
+  static void test_2vi_unaln(boolean[] a, boolean[] b, boolean c, boolean d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+
+  static int verify(String text, int i, boolean elem, boolean val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestByteDoubleVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestByteDoubleVect
+ */
+
+public class TestByteDoubleVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Byte + Double vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    byte[] a1 = new byte[ARRLEN];
+    byte[] a2 = new byte[ARRLEN];
+    double[] b1 = new double[ARRLEN];
+    double[] b2 = new double[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+      test_vi(a2, b2, (byte)123, 103.);
+      test_cp(a1, a2, b1, b2);
+      test_ci_neg(a1, b1);
+      test_vi_neg(a1, b1, (byte)123, 103.);
+      test_cp_neg(a1, a2, b1, b2);
+      test_ci_oppos(a1, b1);
+      test_vi_oppos(a1, b1, (byte)123, 103.);
+      test_cp_oppos(a1, a2, b1, b2);
+      test_ci_aln(a1, b1);
+      test_vi_aln(a1, b1, (byte)123, 103.);
+      test_cp_alndst(a1, a2, b1, b2);
+      test_cp_alnsrc(a1, a2, b1, b2);
+      test_ci_unaln(a1, b1);
+      test_vi_unaln(a1, b1, (byte)123, 103.);
+      test_cp_unalndst(a1, a2, b1, b2);
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+      b1[i] = -1.;
+      b2[i] = -1.;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (byte)-123);
+        errn += verify("test_ci: b1", i, b1[i], -103.);
+      }
+      test_vi(a2, b2, (byte)123, 103.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (byte)123);
+        errn += verify("test_vi: b2", i, b2[i], 103.);
+      }
+      test_cp(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp: b1", i, b1[i], 103.);
+      }
+
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1.;
+        b2[i] = -1.;
+      }
+      test_ci_neg(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (byte)-123);
+        errn += verify("test_ci_neg: b1", i, b1[i], -103.);
+      }
+      test_vi_neg(a2, b2, (byte)123, 103.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (byte)123);
+        errn += verify("test_vi_neg: b2", i, b2[i], 103.);
+      }
+      test_cp_neg(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_neg: b1", i, b1[i], 103.);
+      }
+
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1.;
+        b2[i] = -1.;
+      }
+      test_ci_oppos(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (byte)-123);
+        errn += verify("test_ci_oppos: b1", i, b1[i], -103.);
+      }
+      test_vi_oppos(a2, b2, (byte)123, 103.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (byte)123);
+        errn += verify("test_vi_oppos: b2", i, b2[i], 103.);
+      }
+      test_cp_oppos(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_oppos: b1", i, b1[i], 103.);
+      }
+
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1.;
+        b2[i] = 123.;
+      }
+      test_cp_alndst(a1, a2, b1, b2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_alndst: b1", i, b1[i], -1.);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_alndst: b1", i, b1[i], 123.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123.;
+      }
+      test_cp_alnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)-123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], -123.);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], 123.);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_ci_aln(a1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (byte)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], -103.);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], -1.);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_vi_aln(a1, b1, (byte)123, 103.);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (byte)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], -1.);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], 103.);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1.;
+        b2[i] = 123.;
+      }
+      test_cp_unalndst(a1, a2, b1, b2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], -1.);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], 123.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123.;
+      }
+      test_cp_unalnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)-123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], -123.);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], 123.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_unaln(a1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], -103.);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], -1.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_unaln(a1, b1, (byte)123, 103.);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (byte)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], -1.);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], 103.);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (byte)i;
+        b1[i] = (double)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_cp_alndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (double)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+        b1[i+ALIGN_OFF] = -1.;
+      }
+      test_cp_alnsrc(a1, a1, b1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], -1.);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (double)v);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (byte)i;
+        b1[i] = (double)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_cp_unalndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (double)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+        b1[i+UNALIGN_OFF] = -1.;
+      }
+      test_cp_unalnsrc(a1, a1, b1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], -1.);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (double)v);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, b2, (byte)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a1, b1, (byte)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a1, b1, (byte)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_aln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_aln(a1, b1, (byte)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_unaln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_unaln(a1, b1, (byte)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    return errn;
+  }
+
+  static void test_ci(byte[] a, double[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi(byte[] a, double[] b, byte c, double d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp(byte[] a, byte[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_neg(byte[] a, double[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_neg(byte[] a, double[] b, byte c, double d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp_neg(byte[] a, byte[] b, double[] c, double[] d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_oppos(byte[] a, double[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_oppos(byte[] a, double[] b, byte c, double d) {
+    int limit = a.length-1;
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_cp_oppos(byte[] a, byte[] b, double[] c, double[] d) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+      c[limit-i] = d[i];
+    }
+  }
+  static void test_ci_aln(byte[] a, double[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_aln(byte[] a, double[] b, byte c, double d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_alndst(byte[] a, byte[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+      c[i+ALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_alnsrc(byte[] a, byte[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+      c[i] = d[i+ALIGN_OFF];
+    }
+  }
+  static void test_ci_unaln(byte[] a, double[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_unaln(byte[] a, double[] b, byte c, double d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(byte[] a, byte[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+      c[i+UNALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_unalnsrc(byte[] a, byte[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+      c[i] = d[i+UNALIGN_OFF];
+    }
+  }
+
+  static int verify(String text, int i, byte elem, byte val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+  static int verify(String text, int i, double elem, double val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestByteFloatVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestByteFloatVect
+ */
+
+public class TestByteFloatVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Byte + Float vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    byte[] a1 = new byte[ARRLEN];
+    byte[] a2 = new byte[ARRLEN];
+    float[] b1 = new float[ARRLEN];
+    float[] b2 = new float[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+      test_vi(a2, b2, (byte)123, 103.f);
+      test_cp(a1, a2, b1, b2);
+      test_ci_neg(a1, b1);
+      test_vi_neg(a1, b1, (byte)123, 103.f);
+      test_cp_neg(a1, a2, b1, b2);
+      test_ci_oppos(a1, b1);
+      test_vi_oppos(a1, b1, (byte)123, 103.f);
+      test_cp_oppos(a1, a2, b1, b2);
+      test_ci_aln(a1, b1);
+      test_vi_aln(a1, b1, (byte)123, 103.f);
+      test_cp_alndst(a1, a2, b1, b2);
+      test_cp_alnsrc(a1, a2, b1, b2);
+      test_ci_unaln(a1, b1);
+      test_vi_unaln(a1, b1, (byte)123, 103.f);
+      test_cp_unalndst(a1, a2, b1, b2);
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+      b1[i] = -1.f;
+      b2[i] = -1.f;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (byte)-123);
+        errn += verify("test_ci: b1", i, b1[i], -103.f);
+      }
+      test_vi(a2, b2, (byte)123, 103.f);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (byte)123);
+        errn += verify("test_vi: b2", i, b2[i], 103.f);
+      }
+      test_cp(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1.f;
+        b2[i] = -1.f;
+      }
+      test_ci_neg(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (byte)-123);
+        errn += verify("test_ci_neg: b1", i, b1[i], -103.f);
+      }
+      test_vi_neg(a2, b2, (byte)123, 103.f);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (byte)123);
+        errn += verify("test_vi_neg: b2", i, b2[i], 103.f);
+      }
+      test_cp_neg(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_neg: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1.f;
+        b2[i] = -1.f;
+      }
+      test_ci_oppos(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (byte)-123);
+        errn += verify("test_ci_oppos: b1", i, b1[i], -103.f);
+      }
+      test_vi_oppos(a2, b2, (byte)123, 103.f);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (byte)123);
+        errn += verify("test_vi_oppos: b2", i, b2[i], 103.f);
+      }
+      test_cp_oppos(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_oppos: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1.f;
+        b2[i] = 123.f;
+      }
+      test_cp_alndst(a1, a2, b1, b2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_alndst: b1", i, b1[i], -1.f);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_alndst: b1", i, b1[i], 123.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123.f;
+      }
+      test_cp_alnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)-123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], -123.f);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], 123.f);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.f;
+      }
+      test_ci_aln(a1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (byte)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], -103.f);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], -1.f);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.f;
+      }
+      test_vi_aln(a1, b1, (byte)123, 103.f);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (byte)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], -1.f);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1.f;
+        b2[i] = 123.f;
+      }
+      test_cp_unalndst(a1, a2, b1, b2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], -1.f);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], 123.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123.f;
+      }
+      test_cp_unalnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)-123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], -123.f);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], 123.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_unaln(a1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], -103.f);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], -1.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_unaln(a1, b1, (byte)123, 103.f);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (byte)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], -1.f);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (byte)i;
+        b1[i] = (float)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.f;
+      }
+      test_cp_alndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (float)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+        b1[i+ALIGN_OFF] = -1.f;
+      }
+      test_cp_alnsrc(a1, a1, b1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], -1.f);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (float)v);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (byte)i;
+        b1[i] = (float)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.f;
+      }
+      test_cp_unalndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (float)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+        b1[i+UNALIGN_OFF] = -1.f;
+      }
+      test_cp_unalnsrc(a1, a1, b1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], -1.f);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (float)v);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, b2, (byte)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a1, b1, (byte)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a1, b1, (byte)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_aln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_aln(a1, b1, (byte)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_unaln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_unaln(a1, b1, (byte)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    return errn;
+  }
+
+  static void test_ci(byte[] a, float[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi(byte[] a, float[] b, byte c, float d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp(byte[] a, byte[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_neg(byte[] a, float[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi_neg(byte[] a, float[] b, byte c, float d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp_neg(byte[] a, byte[] b, float[] c, float[] d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_oppos(byte[] a, float[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi_oppos(byte[] a, float[] b, byte c, float d) {
+    int limit = a.length-1;
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_cp_oppos(byte[] a, byte[] b, float[] c, float[] d) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+      c[limit-i] = d[i];
+    }
+  }
+  static void test_ci_aln(byte[] a, float[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi_aln(byte[] a, float[] b, byte c, float d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_alndst(byte[] a, byte[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+      c[i+ALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_alnsrc(byte[] a, byte[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+      c[i] = d[i+ALIGN_OFF];
+    }
+  }
+  static void test_ci_unaln(byte[] a, float[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi_unaln(byte[] a, float[] b, byte c, float d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(byte[] a, byte[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+      c[i+UNALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_unalnsrc(byte[] a, byte[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+      c[i] = d[i+UNALIGN_OFF];
+    }
+  }
+
+  static int verify(String text, int i, byte elem, byte val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+  static int verify(String text, int i, float elem, float val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestByteIntVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestByteIntVect
+ */
+
+public class TestByteIntVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Byte + Integer vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    byte[] a1 = new byte[ARRLEN];
+    byte[] a2 = new byte[ARRLEN];
+    int[] b1 = new int[ARRLEN];
+    int[] b2 = new int[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+      test_vi(a2, b2, (byte)123, (int)103);
+      test_cp(a1, a2, b1, b2);
+      test_ci_neg(a1, b1);
+      test_vi_neg(a1, b1, (byte)123, (int)103);
+      test_cp_neg(a1, a2, b1, b2);
+      test_ci_oppos(a1, b1);
+      test_vi_oppos(a1, b1, (byte)123, (int)103);
+      test_cp_oppos(a1, a2, b1, b2);
+      test_ci_aln(a1, b1);
+      test_vi_aln(a1, b1, (byte)123, (int)103);
+      test_cp_alndst(a1, a2, b1, b2);
+      test_cp_alnsrc(a1, a2, b1, b2);
+      test_ci_unaln(a1, b1);
+      test_vi_unaln(a1, b1, (byte)123, (int)103);
+      test_cp_unalndst(a1, a2, b1, b2);
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+      b1[i] = -1;
+      b2[i] = -1;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (byte)-123);
+        errn += verify("test_ci: b1", i, b1[i], (int)-103);
+      }
+      test_vi(a2, b2, (byte)123, (int)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (byte)123);
+        errn += verify("test_vi: b2", i, b2[i], (int)103);
+      }
+      test_cp(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp: b1", i, b1[i], (int)103);
+      }
+
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1;
+        b2[i] = -1;
+      }
+      test_ci_neg(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (byte)-123);
+        errn += verify("test_ci_neg: b1", i, b1[i], (int)-103);
+      }
+      test_vi_neg(a2, b2, (byte)123, (int)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (byte)123);
+        errn += verify("test_vi_neg: b2", i, b2[i], (int)103);
+      }
+      test_cp_neg(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_neg: b1", i, b1[i], (int)103);
+      }
+
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1;
+        b2[i] = -1;
+      }
+      test_ci_oppos(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (byte)-123);
+        errn += verify("test_ci_oppos: b1", i, b1[i], (int)-103);
+      }
+      test_vi_oppos(a2, b2, (byte)123, (int)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (byte)123);
+        errn += verify("test_vi_oppos: b2", i, b2[i], (int)103);
+      }
+      test_cp_oppos(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_oppos: b1", i, b1[i], (int)103);
+      }
+
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1;
+        b2[i] = 123;
+      }
+      test_cp_alndst(a1, a2, b1, b2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_alndst: b1", i, b1[i], (int)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_alndst: b1", i, b1[i], (int)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123;
+      }
+      test_cp_alnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)-123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], (int)-123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], (int)123);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_aln(a1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (byte)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], (int)-103);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], (int)-1);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_aln(a1, b1, (byte)123, (int)103);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (byte)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], (int)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], (int)103);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1;
+        b2[i] = 123;
+      }
+      test_cp_unalndst(a1, a2, b1, b2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], (int)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], (int)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123;
+      }
+      test_cp_unalnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)-123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], (int)-123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], (int)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_unaln(a1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], (int)-103);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], (int)-1);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_unaln(a1, b1, (byte)123, (int)103);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (byte)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], (int)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], (int)103);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (byte)i;
+        b1[i] = (int)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_cp_alndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (int)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+        b1[i+ALIGN_OFF] = -1;
+      }
+      test_cp_alnsrc(a1, a1, b1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (int)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (int)v);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (byte)i;
+        b1[i] = (int)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_cp_unalndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (int)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+        b1[i+UNALIGN_OFF] = -1;
+      }
+      test_cp_unalnsrc(a1, a1, b1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (int)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (int)v);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, b2, (byte)123, (int)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a1, b1, (byte)123, (int)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a1, b1, (byte)123, (int)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_aln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_aln(a1, b1, (byte)123, (int)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_unaln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_unaln(a1, b1, (byte)123, (int)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    return errn;
+  }
+
+  static void test_ci(byte[] a, int[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi(byte[] a, int[] b, byte c, int d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp(byte[] a, byte[] b, int[] c, int[] d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_neg(byte[] a, int[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_neg(byte[] a, int[] b, byte c, int d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp_neg(byte[] a, byte[] b, int[] c, int[] d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_oppos(byte[] a, int[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_oppos(byte[] a, int[] b, byte c, int d) {
+    int limit = a.length-1;
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_cp_oppos(byte[] a, byte[] b, int[] c, int[] d) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+      c[limit-i] = d[i];
+    }
+  }
+  static void test_ci_aln(byte[] a, int[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_aln(byte[] a, int[] b, byte c, int d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_alndst(byte[] a, byte[] b, int[] c, int[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+      c[i+ALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_alnsrc(byte[] a, byte[] b, int[] c, int[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+      c[i] = d[i+ALIGN_OFF];
+    }
+  }
+  static void test_ci_unaln(byte[] a, int[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_unaln(byte[] a, int[] b, byte c, int d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(byte[] a, byte[] b, int[] c, int[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+      c[i+UNALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_unalnsrc(byte[] a, byte[] b, int[] c, int[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+      c[i] = d[i+UNALIGN_OFF];
+    }
+  }
+
+  static int verify(String text, int i, byte elem, byte val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+  static int verify(String text, int i, int elem, int val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestByteLongVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestByteLongVect
+ */
+
+public class TestByteLongVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Byte + Long vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    byte[] a1 = new byte[ARRLEN];
+    byte[] a2 = new byte[ARRLEN];
+    long[] b1 = new long[ARRLEN];
+    long[] b2 = new long[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+      test_vi(a2, b2, (byte)123, (long)103);
+      test_cp(a1, a2, b1, b2);
+      test_ci_neg(a1, b1);
+      test_vi_neg(a1, b1, (byte)123, (long)103);
+      test_cp_neg(a1, a2, b1, b2);
+      test_ci_oppos(a1, b1);
+      test_vi_oppos(a1, b1, (byte)123, (long)103);
+      test_cp_oppos(a1, a2, b1, b2);
+      test_ci_aln(a1, b1);
+      test_vi_aln(a1, b1, (byte)123, (long)103);
+      test_cp_alndst(a1, a2, b1, b2);
+      test_cp_alnsrc(a1, a2, b1, b2);
+      test_ci_unaln(a1, b1);
+      test_vi_unaln(a1, b1, (byte)123, (long)103);
+      test_cp_unalndst(a1, a2, b1, b2);
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+      b1[i] = -1;
+      b2[i] = -1;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (byte)-123);
+        errn += verify("test_ci: b1", i, b1[i], (long)-103);
+      }
+      test_vi(a2, b2, (byte)123, (long)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (byte)123);
+        errn += verify("test_vi: b2", i, b2[i], (long)103);
+      }
+      test_cp(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp: b1", i, b1[i], (long)103);
+      }
+
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1;
+        b2[i] = -1;
+      }
+      test_ci_neg(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (byte)-123);
+        errn += verify("test_ci_neg: b1", i, b1[i], (long)-103);
+      }
+      test_vi_neg(a2, b2, (byte)123, (long)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (byte)123);
+        errn += verify("test_vi_neg: b2", i, b2[i], (long)103);
+      }
+      test_cp_neg(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_neg: b1", i, b1[i], (long)103);
+      }
+
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1;
+        b2[i] = -1;
+      }
+      test_ci_oppos(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (byte)-123);
+        errn += verify("test_ci_oppos: b1", i, b1[i], (long)-103);
+      }
+      test_vi_oppos(a2, b2, (byte)123, (long)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (byte)123);
+        errn += verify("test_vi_oppos: b2", i, b2[i], (long)103);
+      }
+      test_cp_oppos(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_oppos: b1", i, b1[i], (long)103);
+      }
+
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1;
+        b2[i] = 123;
+      }
+      test_cp_alndst(a1, a2, b1, b2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_alndst: b1", i, b1[i], (long)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_alndst: b1", i, b1[i], (long)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123;
+      }
+      test_cp_alnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)-123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], (long)-123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], (long)123);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_aln(a1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (byte)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], (long)-103);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], (long)-1);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_aln(a1, b1, (byte)123, (long)103);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (byte)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], (long)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], (long)103);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1;
+        b2[i] = 123;
+      }
+      test_cp_unalndst(a1, a2, b1, b2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], (long)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], (long)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123;
+      }
+      test_cp_unalnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)-123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], (long)-123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], (long)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_unaln(a1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], (long)-103);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], (long)-1);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_unaln(a1, b1, (byte)123, (long)103);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (byte)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], (long)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], (long)103);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (byte)i;
+        b1[i] = (long)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_cp_alndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (long)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+        b1[i+ALIGN_OFF] = -1;
+      }
+      test_cp_alnsrc(a1, a1, b1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (long)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (long)v);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (byte)i;
+        b1[i] = (long)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_cp_unalndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (long)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+        b1[i+UNALIGN_OFF] = -1;
+      }
+      test_cp_unalnsrc(a1, a1, b1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (long)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (long)v);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, b2, (byte)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a1, b1, (byte)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a1, b1, (byte)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_aln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_aln(a1, b1, (byte)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_unaln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_unaln(a1, b1, (byte)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    return errn;
+  }
+
+  static void test_ci(byte[] a, long[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi(byte[] a, long[] b, byte c, long d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp(byte[] a, byte[] b, long[] c, long[] d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_neg(byte[] a, long[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_neg(byte[] a, long[] b, byte c, long d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp_neg(byte[] a, byte[] b, long[] c, long[] d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_oppos(byte[] a, long[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_oppos(byte[] a, long[] b, byte c, long d) {
+    int limit = a.length-1;
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_cp_oppos(byte[] a, byte[] b, long[] c, long[] d) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+      c[limit-i] = d[i];
+    }
+  }
+  static void test_ci_aln(byte[] a, long[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_aln(byte[] a, long[] b, byte c, long d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_alndst(byte[] a, byte[] b, long[] c, long[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+      c[i+ALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_alnsrc(byte[] a, byte[] b, long[] c, long[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+      c[i] = d[i+ALIGN_OFF];
+    }
+  }
+  static void test_ci_unaln(byte[] a, long[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_unaln(byte[] a, long[] b, byte c, long d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(byte[] a, byte[] b, long[] c, long[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+      c[i+UNALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_unalnsrc(byte[] a, byte[] b, long[] c, long[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+      c[i] = d[i+UNALIGN_OFF];
+    }
+  }
+
+  static int verify(String text, int i, byte elem, byte val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+  static int verify(String text, int i, long elem, long val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestByteShortVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestByteShortVect
+ */
+
+public class TestByteShortVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Byte + Short vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    byte[] a1 = new byte[ARRLEN];
+    byte[] a2 = new byte[ARRLEN];
+    short[] b1 = new short[ARRLEN];
+    short[] b2 = new short[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+      test_vi(a2, b2, (byte)123, (short)103);
+      test_cp(a1, a2, b1, b2);
+      test_ci_neg(a1, b1);
+      test_vi_neg(a1, b1, (byte)123, (short)103);
+      test_cp_neg(a1, a2, b1, b2);
+      test_ci_oppos(a1, b1);
+      test_vi_oppos(a1, b1, (byte)123, (short)103);
+      test_cp_oppos(a1, a2, b1, b2);
+      test_ci_aln(a1, b1);
+      test_vi_aln(a1, b1, (byte)123, (short)103);
+      test_cp_alndst(a1, a2, b1, b2);
+      test_cp_alnsrc(a1, a2, b1, b2);
+      test_ci_unaln(a1, b1);
+      test_vi_unaln(a1, b1, (byte)123, (short)103);
+      test_cp_unalndst(a1, a2, b1, b2);
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+      b1[i] = -1;
+      b2[i] = -1;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (byte)-123);
+        errn += verify("test_ci: b1", i, b1[i], (short)-103);
+      }
+      test_vi(a2, b2, (byte)123, (short)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (byte)123);
+        errn += verify("test_vi: b2", i, b2[i], (short)103);
+      }
+      test_cp(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp: b1", i, b1[i], (short)103);
+      }
+
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1;
+        b2[i] = -1;
+      }
+      test_ci_neg(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (byte)-123);
+        errn += verify("test_ci_neg: b1", i, b1[i], (short)-103);
+      }
+      test_vi_neg(a2, b2, (byte)123, (short)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (byte)123);
+        errn += verify("test_vi_neg: b2", i, b2[i], (short)103);
+      }
+      test_cp_neg(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_neg: b1", i, b1[i], (short)103);
+      }
+
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1;
+        b2[i] = -1;
+      }
+      test_ci_oppos(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (byte)-123);
+        errn += verify("test_ci_oppos: b1", i, b1[i], (short)-103);
+      }
+      test_vi_oppos(a2, b2, (byte)123, (short)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (byte)123);
+        errn += verify("test_vi_oppos: b2", i, b2[i], (short)103);
+      }
+      test_cp_oppos(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_oppos: b1", i, b1[i], (short)103);
+      }
+
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1;
+        b2[i] = 123;
+      }
+      test_cp_alndst(a1, a2, b1, b2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_alndst: b1", i, b1[i], (short)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_alndst: b1", i, b1[i], (short)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123;
+      }
+      test_cp_alnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)-123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], (short)-123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], (short)123);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_aln(a1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (byte)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], (short)-103);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], (short)-1);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_aln(a1, b1, (byte)123, (short)103);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (byte)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], (short)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], (short)103);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1;
+        b2[i] = 123;
+      }
+      test_cp_unalndst(a1, a2, b1, b2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], (short)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], (short)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123;
+      }
+      test_cp_unalnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)-123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], (short)-123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], (short)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_unaln(a1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], (short)-103);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], (short)-1);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_unaln(a1, b1, (byte)123, (short)103);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (byte)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], (short)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], (short)103);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (byte)i;
+        b1[i] = (short)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_cp_alndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (short)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+        b1[i+ALIGN_OFF] = -1;
+      }
+      test_cp_alnsrc(a1, a1, b1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (short)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (short)v);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (byte)i;
+        b1[i] = (short)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_cp_unalndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (short)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+        b1[i+UNALIGN_OFF] = -1;
+      }
+      test_cp_unalnsrc(a1, a1, b1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)-1);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (short)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)v);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (short)v);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, b2, (byte)123, (short)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a1, b1, (byte)123, (short)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a1, b1, (byte)123, (short)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_aln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_aln(a1, b1, (byte)123, (short)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_unaln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_unaln(a1, b1, (byte)123, (short)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    return errn;
+  }
+
+  static void test_ci(byte[] a, short[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi(byte[] a, short[] b, byte c, short d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp(byte[] a, byte[] b, short[] c, short[] d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_neg(byte[] a, short[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_neg(byte[] a, short[] b, byte c, short d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp_neg(byte[] a, byte[] b, short[] c, short[] d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_oppos(byte[] a, short[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_oppos(byte[] a, short[] b, byte c, short d) {
+    int limit = a.length-1;
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_cp_oppos(byte[] a, byte[] b, short[] c, short[] d) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+      c[limit-i] = d[i];
+    }
+  }
+  static void test_ci_aln(byte[] a, short[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_aln(byte[] a, short[] b, byte c, short d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_alndst(byte[] a, byte[] b, short[] c, short[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+      c[i+ALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_alnsrc(byte[] a, byte[] b, short[] c, short[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+      c[i] = d[i+ALIGN_OFF];
+    }
+  }
+  static void test_ci_unaln(byte[] a, short[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_unaln(byte[] a, short[] b, byte c, short d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(byte[] a, byte[] b, short[] c, short[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+      c[i+UNALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_unalnsrc(byte[] a, byte[] b, short[] c, short[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+      c[i] = d[i+UNALIGN_OFF];
+    }
+  }
+
+  static int verify(String text, int i, byte elem, byte val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+  static int verify(String text, int i, short elem, short val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestByteVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,953 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestByteVect
+ */
+
+public class TestByteVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Byte vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    byte[] a1 = new byte[ARRLEN];
+    byte[] a2 = new byte[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1);
+      test_vi(a2, (byte)123);
+      test_cp(a1, a2);
+      test_2ci(a1, a2);
+      test_2vi(a1, a2, (byte)123, (byte)103);
+      test_ci_neg(a1);
+      test_vi_neg(a2, (byte)123);
+      test_cp_neg(a1, a2);
+      test_2ci_neg(a1, a2);
+      test_2vi_neg(a1, a2, (byte)123, (byte)103);
+      test_ci_oppos(a1);
+      test_vi_oppos(a2, (byte)123);
+      test_cp_oppos(a1, a2);
+      test_2ci_oppos(a1, a2);
+      test_2vi_oppos(a1, a2, (byte)123, (byte)103);
+      test_ci_off(a1);
+      test_vi_off(a2, (byte)123);
+      test_cp_off(a1, a2);
+      test_2ci_off(a1, a2);
+      test_2vi_off(a1, a2, (byte)123, (byte)103);
+      test_ci_inv(a1, OFFSET);
+      test_vi_inv(a2, (byte)123, OFFSET);
+      test_cp_inv(a1, a2, OFFSET);
+      test_2ci_inv(a1, a2, OFFSET);
+      test_2vi_inv(a1, a2, (byte)123, (byte)103, OFFSET);
+      test_ci_scl(a1);
+      test_vi_scl(a2, (byte)123);
+      test_cp_scl(a1, a2);
+      test_2ci_scl(a1, a2);
+      test_2vi_scl(a1, a2, (byte)123, (byte)103);
+      test_cp_alndst(a1, a2);
+      test_cp_alnsrc(a1, a2);
+      test_2ci_aln(a1, a2);
+      test_2vi_aln(a1, a2, (byte)123, (byte)103);
+      test_cp_unalndst(a1, a2);
+      test_cp_unalnsrc(a1, a2);
+      test_2ci_unaln(a1, a2);
+      test_2vi_unaln(a1, a2, (byte)123, (byte)103);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (byte)-123);
+      }
+      test_vi(a2, (byte)123);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (byte)123);
+      }
+      test_cp(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (byte)123);
+      }
+      test_2ci(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci: a1", i, a1[i], (byte)-123);
+        errn += verify("test_2ci: a2", i, a2[i], (byte)-103);
+      }
+      test_2vi(a1, a2, (byte)123, (byte)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi: a1", i, a1[i], (byte)123);
+        errn += verify("test_2vi: a2", i, a2[i], (byte)103);
+      }
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_neg(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (byte)-123);
+      }
+      test_vi_neg(a2, (byte)123);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (byte)123);
+      }
+      test_cp_neg(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (byte)123);
+      }
+      test_2ci_neg(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci_neg: a1", i, a1[i], (byte)-123);
+        errn += verify("test_2ci_neg: a2", i, a2[i], (byte)-103);
+      }
+      test_2vi_neg(a1, a2, (byte)123, (byte)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi_neg: a1", i, a1[i], (byte)123);
+        errn += verify("test_2vi_neg: a2", i, a2[i], (byte)103);
+      }
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_oppos(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (byte)-123);
+      }
+      test_vi_oppos(a2, (byte)123);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (byte)123);
+      }
+      test_cp_oppos(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (byte)123);
+      }
+      test_2ci_oppos(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci_oppos: a1", i, a1[i], (byte)-123);
+        errn += verify("test_2ci_oppos: a2", i, a2[i], (byte)-103);
+      }
+      test_2vi_oppos(a1, a2, (byte)123, (byte)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi_oppos: a1", i, a1[i], (byte)123);
+        errn += verify("test_2vi_oppos: a2", i, a2[i], (byte)103);
+      }
+      // Reset for indexing with offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_off(a1);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_ci_off: a1", i, a1[i], (byte)-123);
+      }
+      test_vi_off(a2, (byte)123);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_vi_off: a2", i, a2[i], (byte)123);
+      }
+      test_cp_off(a1, a2);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_cp_off: a1", i, a1[i], (byte)123);
+      }
+      test_2ci_off(a1, a2);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2ci_off: a1", i, a1[i], (byte)-123);
+        errn += verify("test_2ci_off: a2", i, a2[i], (byte)-103);
+      }
+      test_2vi_off(a1, a2, (byte)123, (byte)103);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2vi_off: a1", i, a1[i], (byte)123);
+        errn += verify("test_2vi_off: a2", i, a2[i], (byte)103);
+      }
+      for (int i=0; i<OFFSET; i++) {
+        errn += verify("test_2vi_off: a1", i, a1[i], (byte)-1);
+        errn += verify("test_2vi_off: a2", i, a2[i], (byte)-1);
+      }
+      // Reset for indexing with invariant offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_inv(a1, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_ci_inv: a1", i, a1[i], (byte)-123);
+      }
+      test_vi_inv(a2, (byte)123, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_vi_inv: a2", i, a2[i], (byte)123);
+      }
+      test_cp_inv(a1, a2, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_cp_inv: a1", i, a1[i], (byte)123);
+      }
+      test_2ci_inv(a1, a2, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2ci_inv: a1", i, a1[i], (byte)-123);
+        errn += verify("test_2ci_inv: a2", i, a2[i], (byte)-103);
+      }
+      test_2vi_inv(a1, a2, (byte)123, (byte)103, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2vi_inv: a1", i, a1[i], (byte)123);
+        errn += verify("test_2vi_inv: a2", i, a2[i], (byte)103);
+      }
+      for (int i=0; i<OFFSET; i++) {
+        errn += verify("test_2vi_inv: a1", i, a1[i], (byte)-1);
+        errn += verify("test_2vi_inv: a2", i, a2[i], (byte)-1);
+      }
+      // Reset for indexing with scale
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_scl(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : -123;
+        errn += verify("test_ci_scl: a1", i, a1[i], (byte)val);
+      }
+      test_vi_scl(a2, (byte)123);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : 123;
+        errn += verify("test_vi_scl: a2", i, a2[i], (byte)val);
+      }
+      test_cp_scl(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : 123;
+        errn += verify("test_cp_scl: a1", i, a1[i], (byte)val);
+      }
+      test_2ci_scl(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        if (i%SCALE != 0) {
+          errn += verify("test_2ci_scl: a1", i, a1[i], (byte)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2ci_scl: a1", i*SCALE, a1[i*SCALE], (byte)-123);
+        }
+        if (i%SCALE != 0) {
+          errn += verify("test_2ci_scl: a2", i, a2[i], (byte)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2ci_scl: a2", i*SCALE, a2[i*SCALE], (byte)-103);
+        }
+      }
+      test_2vi_scl(a1, a2, (byte)123, (byte)103);
+      for (int i=0; i<ARRLEN; i++) {
+        if (i%SCALE != 0) {
+          errn += verify("test_2vi_scl: a1", i, a1[i], (byte)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2vi_scl: a1", i*SCALE, a1[i*SCALE], (byte)123);
+        }
+        if (i%SCALE != 0) {
+          errn += verify("test_2vi_scl: a2", i, a2[i], (byte)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2vi_scl: a2", i*SCALE, a2[i*SCALE], (byte)103);
+        }
+      }
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_vi(a2, (byte)123);
+      test_cp_alndst(a1, a2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (byte)123);
+      }
+      test_vi(a2, (byte)-123);
+      test_cp_alnsrc(a1, a2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)-123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2ci_aln(a1, a2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln: a1", i, a1[i], (byte)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln: a2", i, a2[i], (byte)-103);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln: a2", i, a2[i], (byte)-1);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2vi_aln(a1, a2, (byte)123, (byte)103);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln: a1", i, a1[i], (byte)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln: a2", i, a2[i], (byte)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln: a2", i, a2[i], (byte)103);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_vi(a2, (byte)123);
+      test_cp_unalndst(a1, a2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)123);
+      }
+      test_vi(a2, (byte)-123);
+      test_cp_unalnsrc(a1, a2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)-123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2ci_unaln(a1, a2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln: a1", i, a1[i], (byte)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln: a2", i, a2[i], (byte)-103);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln: a2", i, a2[i], (byte)-1);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2vi_unaln(a1, a2, (byte)123, (byte)103);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln: a1", i, a1[i], (byte)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln: a2", i, a2[i], (byte)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln: a2", i, a2[i], (byte)103);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (byte)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_cp_alndst(a1, a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (byte)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+      }
+      test_cp_alnsrc(a1, a1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)v);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2ci_aln(a1, a1);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (byte)-103);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (byte)-123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2vi_aln(a1, a1, (byte)123, (byte)103);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (byte)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (byte)103);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (byte)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_cp_unalndst(a1, a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (byte)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+      }
+      test_cp_unalnsrc(a1, a1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)v);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2ci_unaln(a1, a1);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (byte)-103);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (byte)-123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2vi_unaln(a1, a1, (byte)123, (byte)103);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (byte)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (byte)103);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, (byte)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi(a1, a2, (byte)123, (byte)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a2, (byte)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_neg(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_neg(a1, a2, (byte)123, (byte)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_neg: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a2, (byte)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_oppos(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_oppos(a1, a2, (byte)123, (byte)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_oppos: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_off(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_off(a2, (byte)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_off(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_off(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_off(a1, a2, (byte)123, (byte)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_off: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_inv(a1, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_inv(a2, (byte)123, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_inv(a1, a2, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_inv(a1, a2, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_inv(a1, a2, (byte)123, (byte)103, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_inv: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_scl(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_scl(a2, (byte)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_scl(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_scl(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_scl(a1, a2, (byte)123, (byte)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_scl: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_aln(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_aln(a1, a2, (byte)123, (byte)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_aln: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_unaln(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_unaln(a1, a2, (byte)123, (byte)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_unaln: " + (end - start));
+
+    return errn;
+  }
+
+  static void test_ci(byte[] a) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+    }
+  }
+  static void test_vi(byte[] a, byte b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b;
+    }
+  }
+  static void test_cp(byte[] a, byte[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+    }
+  }
+  static void test_2ci(byte[] a, byte[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi(byte[] a, byte[] b, byte c, byte d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_ci_neg(byte[] a) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+    }
+  }
+  static void test_vi_neg(byte[] a, byte b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b;
+    }
+  }
+  static void test_cp_neg(byte[] a, byte[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+    }
+  }
+  static void test_2ci_neg(byte[] a, byte[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi_neg(byte[] a, byte[] b, byte c, byte d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_ci_oppos(byte[] a) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+    }
+  }
+  static void test_vi_oppos(byte[] a, byte b) {
+    int limit = a.length-1;
+    for (int i = limit; i >= 0; i-=1) {
+      a[limit-i] = b;
+    }
+  }
+  static void test_cp_oppos(byte[] a, byte[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+    }
+  }
+  static void test_2ci_oppos(byte[] a, byte[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi_oppos(byte[] a, byte[] b, byte c, byte d) {
+    int limit = a.length-1;
+    for (int i = limit; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_ci_off(byte[] a) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = -123;
+    }
+  }
+  static void test_vi_off(byte[] a, byte b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = b;
+    }
+  }
+  static void test_cp_off(byte[] a, byte[] b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = b[i+OFFSET];
+    }
+  }
+  static void test_2ci_off(byte[] a, byte[] b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = -123;
+      b[i+OFFSET] = -103;
+    }
+  }
+  static void test_2vi_off(byte[] a, byte[] b, byte c, byte d) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = c;
+      b[i+OFFSET] = d;
+    }
+  }
+  static void test_ci_inv(byte[] a, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = -123;
+    }
+  }
+  static void test_vi_inv(byte[] a, byte b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = b;
+    }
+  }
+  static void test_cp_inv(byte[] a, byte[] b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = b[i+k];
+    }
+  }
+  static void test_2ci_inv(byte[] a, byte[] b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = -123;
+      b[i+k] = -103;
+    }
+  }
+  static void test_2vi_inv(byte[] a, byte[] b, byte c, byte d, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = c;
+      b[i+k] = d;
+    }
+  }
+  static void test_ci_scl(byte[] a) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = -123;
+    }
+  }
+  static void test_vi_scl(byte[] a, byte b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = b;
+    }
+  }
+  static void test_cp_scl(byte[] a, byte[] b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = b[i*SCALE];
+    }
+  }
+  static void test_2ci_scl(byte[] a, byte[] b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = -123;
+      b[i*SCALE] = -103;
+    }
+  }
+  static void test_2vi_scl(byte[] a, byte[] b, byte c, byte d) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = c;
+      b[i*SCALE] = d;
+    }
+  }
+  static void test_cp_alndst(byte[] a, byte[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+    }
+  }
+  static void test_cp_alnsrc(byte[] a, byte[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+    }
+  }
+  static void test_2ci_aln(byte[] a, byte[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi_aln(byte[] a, byte[] b, byte c, byte d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(byte[] a, byte[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+    }
+  }
+  static void test_cp_unalnsrc(byte[] a, byte[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+    }
+  }
+  static void test_2ci_unaln(byte[] a, byte[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi_unaln(byte[] a, byte[] b, byte c, byte d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+
+  static int verify(String text, int i, byte elem, byte val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestCharShortVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestCharShortVect
+ */
+
+public class TestCharShortVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Char + Short vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    char[] a1 = new char[ARRLEN];
+    char[] a2 = new char[ARRLEN];
+    short[] b1 = new short[ARRLEN];
+    short[] b2 = new short[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+      test_vi(a2, b2, (char)123, (short)103);
+      test_cp(a1, a2, b1, b2);
+      test_ci_neg(a1, b1);
+      test_vi_neg(a1, b1, (char)123, (short)103);
+      test_cp_neg(a1, a2, b1, b2);
+      test_ci_oppos(a1, b1);
+      test_vi_oppos(a1, b1, (char)123, (short)103);
+      test_cp_oppos(a1, a2, b1, b2);
+      test_ci_aln(a1, b1);
+      test_vi_aln(a1, b1, (char)123, (short)103);
+      test_cp_alndst(a1, a2, b1, b2);
+      test_cp_alnsrc(a1, a2, b1, b2);
+      test_ci_unaln(a1, b1);
+      test_vi_unaln(a1, b1, (char)123, (short)103);
+      test_cp_unalndst(a1, a2, b1, b2);
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = (char)-1;
+      a2[i] = (char)-1;
+      b1[i] = (short)-1;
+      b2[i] = (short)-1;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (char)-123);
+        errn += verify("test_ci: b1", i, b1[i], (short)-103);
+      }
+      test_vi(a2, b2, (char)123, (short)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (char)123);
+        errn += verify("test_vi: b2", i, b2[i], (short)103);
+      }
+      test_cp(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (char)123);
+        errn += verify("test_cp: b1", i, b1[i], (short)103);
+      }
+
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        a2[i] = (char)-1;
+        b1[i] = (short)-1;
+        b2[i] = (short)-1;
+      }
+      test_ci_neg(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (char)-123);
+        errn += verify("test_ci_neg: b1", i, b1[i], (short)-103);
+      }
+      test_vi_neg(a2, b2, (char)123, (short)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (char)123);
+        errn += verify("test_vi_neg: b2", i, b2[i], (short)103);
+      }
+      test_cp_neg(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (char)123);
+        errn += verify("test_cp_neg: b1", i, b1[i], (short)103);
+      }
+
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        a2[i] = (char)-1;
+        b1[i] = (short)-1;
+        b2[i] = (short)-1;
+      }
+      test_ci_oppos(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (char)-123);
+        errn += verify("test_ci_oppos: b1", i, b1[i], (short)-103);
+      }
+      test_vi_oppos(a2, b2, (char)123, (short)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (char)123);
+        errn += verify("test_vi_oppos: b2", i, b2[i], (short)103);
+      }
+      test_cp_oppos(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (char)123);
+        errn += verify("test_cp_oppos: b1", i, b1[i], (short)103);
+      }
+
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        a2[i] = (char)123;
+        b1[i] = (short)-1;
+        b2[i] = (short)123;
+      }
+      test_cp_alndst(a1, a2, b1, b2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (char)-1);
+        errn += verify("test_cp_alndst: b1", i, b1[i], (short)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (char)123);
+        errn += verify("test_cp_alndst: b1", i, b1[i], (short)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = (char)-123;
+        b2[i] = (short)-123;
+      }
+      test_cp_alnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (char)-123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], (short)-123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (char)123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], (short)123);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        b1[i] = (short)-1;
+      }
+      test_ci_aln(a1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (char)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (char)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], (short)-103);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], (short)-1);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        b1[i] = (short)-1;
+      }
+      test_vi_aln(a1, b1, (char)123, (short)103);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (char)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (char)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], (short)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], (short)103);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        a2[i] = (char)123;
+        b1[i] = (short)-1;
+        b2[i] = (short)123;
+      }
+      test_cp_unalndst(a1, a2, b1, b2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (char)-1);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], (short)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (char)123);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], (short)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = (char)-123;
+        b2[i] = (short)-123;
+      }
+      test_cp_unalnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (char)-123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], (short)-123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (char)123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], (short)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        b1[i] = (short)-1;
+      }
+      test_ci_unaln(a1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (char)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (char)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], (short)-103);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], (short)-1);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        b1[i] = (short)-1;
+      }
+      test_vi_unaln(a1, b1, (char)123, (short)103);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (char)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (char)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], (short)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], (short)103);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (char)i;
+        b1[i] = (short)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        b1[i] = (short)-1;
+      }
+      test_cp_alndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (char)v);
+        errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (short)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = (char)-1;
+        b1[i+ALIGN_OFF] = (short)-1;
+      }
+      test_cp_alnsrc(a1, a1, b1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (char)-1);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (short)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (char)v);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (short)v);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (char)i;
+        b1[i] = (short)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        b1[i] = (short)-1;
+      }
+      test_cp_unalndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (char)v);
+        errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (short)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = (char)-1;
+        b1[i+UNALIGN_OFF] = (short)-1;
+      }
+      test_cp_unalnsrc(a1, a1, b1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (char)-1);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (short)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (char)v);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (short)v);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, b2, (char)123, (short)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a1, b1, (char)123, (short)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a1, b1, (char)123, (short)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_aln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_aln(a1, b1, (char)123, (short)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_unaln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_unaln(a1, b1, (char)123, (short)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    return errn;
+  }
+
+  static void test_ci(char[] a, short[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = (char)-123;
+      b[i] = (short)-103;
+    }
+  }
+  static void test_vi(char[] a, short[] b, char c, short d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp(char[] a, char[] b, short[] c, short[] d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_neg(char[] a, short[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = (char)-123;
+      b[i] = (short)-103;
+    }
+  }
+  static void test_vi_neg(char[] a, short[] b, char c, short d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp_neg(char[] a, char[] b, short[] c, short[] d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_oppos(char[] a, short[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = (char)-123;
+      b[i] = (short)-103;
+    }
+  }
+  static void test_vi_oppos(char[] a, short[] b, char c, short d) {
+    int limit = a.length-1;
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_cp_oppos(char[] a, char[] b, short[] c, short[] d) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+      c[limit-i] = d[i];
+    }
+  }
+  static void test_ci_aln(char[] a, short[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = (char)-123;
+      b[i] = (short)-103;
+    }
+  }
+  static void test_vi_aln(char[] a, short[] b, char c, short d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_alndst(char[] a, char[] b, short[] c, short[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+      c[i+ALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_alnsrc(char[] a, char[] b, short[] c, short[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+      c[i] = d[i+ALIGN_OFF];
+    }
+  }
+  static void test_ci_unaln(char[] a, short[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = (char)-123;
+      b[i] = (short)-103;
+    }
+  }
+  static void test_vi_unaln(char[] a, short[] b, char c, short d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(char[] a, char[] b, short[] c, short[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+      c[i+UNALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_unalnsrc(char[] a, char[] b, short[] c, short[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+      c[i] = d[i+UNALIGN_OFF];
+    }
+  }
+
+  static int verify(String text, int i, char elem, char val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+  static int verify(String text, int i, short elem, short val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestCharVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,953 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestCharVect
+ */
+
+public class TestCharVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Char vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    char[] a1 = new char[ARRLEN];
+    char[] a2 = new char[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1);
+      test_vi(a2, (char)123);
+      test_cp(a1, a2);
+      test_2ci(a1, a2);
+      test_2vi(a1, a2, (char)123, (char)103);
+      test_ci_neg(a1);
+      test_vi_neg(a2, (char)123);
+      test_cp_neg(a1, a2);
+      test_2ci_neg(a1, a2);
+      test_2vi_neg(a1, a2, (char)123, (char)103);
+      test_ci_oppos(a1);
+      test_vi_oppos(a2, (char)123);
+      test_cp_oppos(a1, a2);
+      test_2ci_oppos(a1, a2);
+      test_2vi_oppos(a1, a2, (char)123, (char)103);
+      test_ci_off(a1);
+      test_vi_off(a2, (char)123);
+      test_cp_off(a1, a2);
+      test_2ci_off(a1, a2);
+      test_2vi_off(a1, a2, (char)123, (char)103);
+      test_ci_inv(a1, OFFSET);
+      test_vi_inv(a2, (char)123, OFFSET);
+      test_cp_inv(a1, a2, OFFSET);
+      test_2ci_inv(a1, a2, OFFSET);
+      test_2vi_inv(a1, a2, (char)123, (char)103, OFFSET);
+      test_ci_scl(a1);
+      test_vi_scl(a2, (char)123);
+      test_cp_scl(a1, a2);
+      test_2ci_scl(a1, a2);
+      test_2vi_scl(a1, a2, (char)123, (char)103);
+      test_cp_alndst(a1, a2);
+      test_cp_alnsrc(a1, a2);
+      test_2ci_aln(a1, a2);
+      test_2vi_aln(a1, a2, (char)123, (char)103);
+      test_cp_unalndst(a1, a2);
+      test_cp_unalnsrc(a1, a2);
+      test_2ci_unaln(a1, a2);
+      test_2vi_unaln(a1, a2, (char)123, (char)103);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = (char)-1;
+      a2[i] = (char)-1;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (char)-123);
+      }
+      test_vi(a2, (char)123);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (char)123);
+      }
+      test_cp(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (char)123);
+      }
+      test_2ci(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci: a1", i, a1[i], (char)-123);
+        errn += verify("test_2ci: a2", i, a2[i], (char)-103);
+      }
+      test_2vi(a1, a2, (char)123, (char)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi: a1", i, a1[i], (char)123);
+        errn += verify("test_2vi: a2", i, a2[i], (char)103);
+      }
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        a2[i] = (char)-1;
+      }
+      test_ci_neg(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (char)-123);
+      }
+      test_vi_neg(a2, (char)123);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (char)123);
+      }
+      test_cp_neg(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (char)123);
+      }
+      test_2ci_neg(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci_neg: a1", i, a1[i], (char)-123);
+        errn += verify("test_2ci_neg: a2", i, a2[i], (char)-103);
+      }
+      test_2vi_neg(a1, a2, (char)123, (char)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi_neg: a1", i, a1[i], (char)123);
+        errn += verify("test_2vi_neg: a2", i, a2[i], (char)103);
+      }
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        a2[i] = (char)-1;
+      }
+      test_ci_oppos(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (char)-123);
+      }
+      test_vi_oppos(a2, (char)123);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (char)123);
+      }
+      test_cp_oppos(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (char)123);
+      }
+      test_2ci_oppos(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci_oppos: a1", i, a1[i], (char)-123);
+        errn += verify("test_2ci_oppos: a2", i, a2[i], (char)-103);
+      }
+      test_2vi_oppos(a1, a2, (char)123, (char)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi_oppos: a1", i, a1[i], (char)123);
+        errn += verify("test_2vi_oppos: a2", i, a2[i], (char)103);
+      }
+      // Reset for indexing with offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        a2[i] = (char)-1;
+      }
+      test_ci_off(a1);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_ci_off: a1", i, a1[i], (char)-123);
+      }
+      test_vi_off(a2, (char)123);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_vi_off: a2", i, a2[i], (char)123);
+      }
+      test_cp_off(a1, a2);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_cp_off: a1", i, a1[i], (char)123);
+      }
+      test_2ci_off(a1, a2);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2ci_off: a1", i, a1[i], (char)-123);
+        errn += verify("test_2ci_off: a2", i, a2[i], (char)-103);
+      }
+      test_2vi_off(a1, a2, (char)123, (char)103);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2vi_off: a1", i, a1[i], (char)123);
+        errn += verify("test_2vi_off: a2", i, a2[i], (char)103);
+      }
+      for (int i=0; i<OFFSET; i++) {
+        errn += verify("test_2vi_off: a1", i, a1[i], (char)-1);
+        errn += verify("test_2vi_off: a2", i, a2[i], (char)-1);
+      }
+      // Reset for indexing with invariant offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        a2[i] = (char)-1;
+      }
+      test_ci_inv(a1, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_ci_inv: a1", i, a1[i], (char)-123);
+      }
+      test_vi_inv(a2, (char)123, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_vi_inv: a2", i, a2[i], (char)123);
+      }
+      test_cp_inv(a1, a2, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_cp_inv: a1", i, a1[i], (char)123);
+      }
+      test_2ci_inv(a1, a2, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2ci_inv: a1", i, a1[i], (char)-123);
+        errn += verify("test_2ci_inv: a2", i, a2[i], (char)-103);
+      }
+      test_2vi_inv(a1, a2, (char)123, (char)103, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2vi_inv: a1", i, a1[i], (char)123);
+        errn += verify("test_2vi_inv: a2", i, a2[i], (char)103);
+      }
+      for (int i=0; i<OFFSET; i++) {
+        errn += verify("test_2vi_inv: a1", i, a1[i], (char)-1);
+        errn += verify("test_2vi_inv: a2", i, a2[i], (char)-1);
+      }
+      // Reset for indexing with scale
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        a2[i] = (char)-1;
+      }
+      test_ci_scl(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : -123;
+        errn += verify("test_ci_scl: a1", i, a1[i], (char)val);
+      }
+      test_vi_scl(a2, (char)123);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : 123;
+        errn += verify("test_vi_scl: a2", i, a2[i], (char)val);
+      }
+      test_cp_scl(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : 123;
+        errn += verify("test_cp_scl: a1", i, a1[i], (char)val);
+      }
+      test_2ci_scl(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        if (i%SCALE != 0) {
+          errn += verify("test_2ci_scl: a1", i, a1[i], (char)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2ci_scl: a1", i*SCALE, a1[i*SCALE], (char)-123);
+        }
+        if (i%SCALE != 0) {
+          errn += verify("test_2ci_scl: a2", i, a2[i], (char)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2ci_scl: a2", i*SCALE, a2[i*SCALE], (char)-103);
+        }
+      }
+      test_2vi_scl(a1, a2, (char)123, (char)103);
+      for (int i=0; i<ARRLEN; i++) {
+        if (i%SCALE != 0) {
+          errn += verify("test_2vi_scl: a1", i, a1[i], (char)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2vi_scl: a1", i*SCALE, a1[i*SCALE], (char)123);
+        }
+        if (i%SCALE != 0) {
+          errn += verify("test_2vi_scl: a2", i, a2[i], (char)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2vi_scl: a2", i*SCALE, a2[i*SCALE], (char)103);
+        }
+      }
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        a2[i] = (char)-1;
+      }
+      test_vi(a2, (char)123);
+      test_cp_alndst(a1, a2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (char)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (char)123);
+      }
+      test_vi(a2, (char)-123);
+      test_cp_alnsrc(a1, a2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (char)-123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (char)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        a2[i] = (char)-1;
+      }
+      test_2ci_aln(a1, a2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln: a1", i, a1[i], (char)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln: a1", i, a1[i], (char)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln: a2", i, a2[i], (char)-103);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln: a2", i, a2[i], (char)-1);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        a2[i] = (char)-1;
+      }
+      test_2vi_aln(a1, a2, (char)123, (char)103);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln: a1", i, a1[i], (char)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln: a1", i, a1[i], (char)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln: a2", i, a2[i], (char)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln: a2", i, a2[i], (char)103);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        a2[i] = (char)-1;
+      }
+      test_vi(a2, (char)123);
+      test_cp_unalndst(a1, a2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (char)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (char)123);
+      }
+      test_vi(a2, (char)-123);
+      test_cp_unalnsrc(a1, a2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (char)-123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (char)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        a2[i] = (char)-1;
+      }
+      test_2ci_unaln(a1, a2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln: a1", i, a1[i], (char)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln: a1", i, a1[i], (char)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln: a2", i, a2[i], (char)-103);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln: a2", i, a2[i], (char)-1);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+        a2[i] = (char)-1;
+      }
+      test_2vi_unaln(a1, a2, (char)123, (char)103);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln: a1", i, a1[i], (char)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln: a1", i, a1[i], (char)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln: a2", i, a2[i], (char)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln: a2", i, a2[i], (char)103);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (char)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+      }
+      test_cp_alndst(a1, a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (char)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = (char)-1;
+      }
+      test_cp_alnsrc(a1, a1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (char)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (char)v);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+      }
+      test_2ci_aln(a1, a1);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (char)-103);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (char)-123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+      }
+      test_2vi_aln(a1, a1, (char)123, (char)103);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (char)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (char)103);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (char)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+      }
+      test_cp_unalndst(a1, a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (char)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = (char)-1;
+      }
+      test_cp_unalnsrc(a1, a1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (char)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (char)v);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+      }
+      test_2ci_unaln(a1, a1);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (char)-103);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (char)-123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = (char)-1;
+      }
+      test_2vi_unaln(a1, a1, (char)123, (char)103);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (char)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (char)103);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, (char)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi(a1, a2, (char)123, (char)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a2, (char)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_neg(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_neg(a1, a2, (char)123, (char)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_neg: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a2, (char)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_oppos(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_oppos(a1, a2, (char)123, (char)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_oppos: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_off(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_off(a2, (char)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_off(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_off(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_off(a1, a2, (char)123, (char)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_off: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_inv(a1, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_inv(a2, (char)123, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_inv(a1, a2, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_inv(a1, a2, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_inv(a1, a2, (char)123, (char)103, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_inv: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_scl(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_scl(a2, (char)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_scl(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_scl(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_scl(a1, a2, (char)123, (char)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_scl: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_aln(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_aln(a1, a2, (char)123, (char)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_aln: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_unaln(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_unaln(a1, a2, (char)123, (char)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_unaln: " + (end - start));
+
+    return errn;
+  }
+
+  static void test_ci(char[] a) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = (char)-123;
+    }
+  }
+  static void test_vi(char[] a, char b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b;
+    }
+  }
+  static void test_cp(char[] a, char[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+    }
+  }
+  static void test_2ci(char[] a, char[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = (char)-123;
+      b[i] = (char)-103;
+    }
+  }
+  static void test_2vi(char[] a, char[] b, char c, char d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_ci_neg(char[] a) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = (char)-123;
+    }
+  }
+  static void test_vi_neg(char[] a, char b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b;
+    }
+  }
+  static void test_cp_neg(char[] a, char[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+    }
+  }
+  static void test_2ci_neg(char[] a, char[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = (char)-123;
+      b[i] = (char)-103;
+    }
+  }
+  static void test_2vi_neg(char[] a, char[] b, char c, char d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_ci_oppos(char[] a) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = (char)-123;
+    }
+  }
+  static void test_vi_oppos(char[] a, char b) {
+    int limit = a.length-1;
+    for (int i = limit; i >= 0; i-=1) {
+      a[limit-i] = b;
+    }
+  }
+  static void test_cp_oppos(char[] a, char[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+    }
+  }
+  static void test_2ci_oppos(char[] a, char[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = (char)-123;
+      b[i] = (char)-103;
+    }
+  }
+  static void test_2vi_oppos(char[] a, char[] b, char c, char d) {
+    int limit = a.length-1;
+    for (int i = limit; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_ci_off(char[] a) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = (char)-123;
+    }
+  }
+  static void test_vi_off(char[] a, char b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = b;
+    }
+  }
+  static void test_cp_off(char[] a, char[] b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = b[i+OFFSET];
+    }
+  }
+  static void test_2ci_off(char[] a, char[] b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = (char)-123;
+      b[i+OFFSET] = (char)-103;
+    }
+  }
+  static void test_2vi_off(char[] a, char[] b, char c, char d) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = c;
+      b[i+OFFSET] = d;
+    }
+  }
+  static void test_ci_inv(char[] a, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = (char)-123;
+    }
+  }
+  static void test_vi_inv(char[] a, char b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = b;
+    }
+  }
+  static void test_cp_inv(char[] a, char[] b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = b[i+k];
+    }
+  }
+  static void test_2ci_inv(char[] a, char[] b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = (char)-123;
+      b[i+k] = (char)-103;
+    }
+  }
+  static void test_2vi_inv(char[] a, char[] b, char c, char d, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = c;
+      b[i+k] = d;
+    }
+  }
+  static void test_ci_scl(char[] a) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = (char)-123;
+    }
+  }
+  static void test_vi_scl(char[] a, char b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = b;
+    }
+  }
+  static void test_cp_scl(char[] a, char[] b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = b[i*SCALE];
+    }
+  }
+  static void test_2ci_scl(char[] a, char[] b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = (char)-123;
+      b[i*SCALE] = (char)-103;
+    }
+  }
+  static void test_2vi_scl(char[] a, char[] b, char c, char d) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = c;
+      b[i*SCALE] = d;
+    }
+  }
+  static void test_cp_alndst(char[] a, char[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+    }
+  }
+  static void test_cp_alnsrc(char[] a, char[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+    }
+  }
+  static void test_2ci_aln(char[] a, char[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = (char)-123;
+      b[i] = (char)-103;
+    }
+  }
+  static void test_2vi_aln(char[] a, char[] b, char c, char d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(char[] a, char[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+    }
+  }
+  static void test_cp_unalnsrc(char[] a, char[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+    }
+  }
+  static void test_2ci_unaln(char[] a, char[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = (char)-123;
+      b[i] = (char)-103;
+    }
+  }
+  static void test_2vi_unaln(char[] a, char[] b, char c, char d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+
+  static int verify(String text, int i, char elem, char val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestDoubleVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,953 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestDoubleVect
+ */
+
+public class TestDoubleVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Double vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    double[] a1 = new double[ARRLEN];
+    double[] a2 = new double[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1);
+      test_vi(a2, 123.);
+      test_cp(a1, a2);
+      test_2ci(a1, a2);
+      test_2vi(a1, a2, 123., 103.);
+      test_ci_neg(a1);
+      test_vi_neg(a2, 123.);
+      test_cp_neg(a1, a2);
+      test_2ci_neg(a1, a2);
+      test_2vi_neg(a1, a2, 123., 103.);
+      test_ci_oppos(a1);
+      test_vi_oppos(a2, 123.);
+      test_cp_oppos(a1, a2);
+      test_2ci_oppos(a1, a2);
+      test_2vi_oppos(a1, a2, 123., 103.);
+      test_ci_off(a1);
+      test_vi_off(a2, 123.);
+      test_cp_off(a1, a2);
+      test_2ci_off(a1, a2);
+      test_2vi_off(a1, a2, 123., 103.);
+      test_ci_inv(a1, OFFSET);
+      test_vi_inv(a2, 123., OFFSET);
+      test_cp_inv(a1, a2, OFFSET);
+      test_2ci_inv(a1, a2, OFFSET);
+      test_2vi_inv(a1, a2, 123., 103., OFFSET);
+      test_ci_scl(a1);
+      test_vi_scl(a2, 123.);
+      test_cp_scl(a1, a2);
+      test_2ci_scl(a1, a2);
+      test_2vi_scl(a1, a2, 123., 103.);
+      test_cp_alndst(a1, a2);
+      test_cp_alnsrc(a1, a2);
+      test_2ci_aln(a1, a2);
+      test_2vi_aln(a1, a2, 123., 103.);
+      test_cp_unalndst(a1, a2);
+      test_cp_unalnsrc(a1, a2);
+      test_2ci_unaln(a1, a2);
+      test_2vi_unaln(a1, a2, 123., 103.);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], -123.);
+      }
+      test_vi(a2, 123.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], 123.);
+      }
+      test_cp(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], 123.);
+      }
+      test_2ci(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci: a1", i, a1[i], -123.);
+        errn += verify("test_2ci: a2", i, a2[i], -103.);
+      }
+      test_2vi(a1, a2, 123., 103.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi: a1", i, a1[i], 123.);
+        errn += verify("test_2vi: a2", i, a2[i], 103.);
+      }
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_neg(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], -123.);
+      }
+      test_vi_neg(a2, 123.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], 123.);
+      }
+      test_cp_neg(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], 123.);
+      }
+      test_2ci_neg(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci_neg: a1", i, a1[i], -123.);
+        errn += verify("test_2ci_neg: a2", i, a2[i], -103.);
+      }
+      test_2vi_neg(a1, a2, 123., 103.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi_neg: a1", i, a1[i], 123.);
+        errn += verify("test_2vi_neg: a2", i, a2[i], 103.);
+      }
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_oppos(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], -123.);
+      }
+      test_vi_oppos(a2, 123.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], 123.);
+      }
+      test_cp_oppos(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], 123.);
+      }
+      test_2ci_oppos(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci_oppos: a1", i, a1[i], -123.);
+        errn += verify("test_2ci_oppos: a2", i, a2[i], -103.);
+      }
+      test_2vi_oppos(a1, a2, 123., 103.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi_oppos: a1", i, a1[i], 123.);
+        errn += verify("test_2vi_oppos: a2", i, a2[i], 103.);
+      }
+      // Reset for indexing with offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_off(a1);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_ci_off: a1", i, a1[i], -123.);
+      }
+      test_vi_off(a2, 123.);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_vi_off: a2", i, a2[i], 123.);
+      }
+      test_cp_off(a1, a2);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_cp_off: a1", i, a1[i], 123.);
+      }
+      test_2ci_off(a1, a2);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2ci_off: a1", i, a1[i], -123.);
+        errn += verify("test_2ci_off: a2", i, a2[i], -103.);
+      }
+      test_2vi_off(a1, a2, 123., 103.);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2vi_off: a1", i, a1[i], 123.);
+        errn += verify("test_2vi_off: a2", i, a2[i], 103.);
+      }
+      for (int i=0; i<OFFSET; i++) {
+        errn += verify("test_2vi_off: a1", i, a1[i], -1.);
+        errn += verify("test_2vi_off: a2", i, a2[i], -1.);
+      }
+      // Reset for indexing with invariant offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_inv(a1, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_ci_inv: a1", i, a1[i], -123.);
+      }
+      test_vi_inv(a2, 123., OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_vi_inv: a2", i, a2[i], 123.);
+      }
+      test_cp_inv(a1, a2, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_cp_inv: a1", i, a1[i], 123.);
+      }
+      test_2ci_inv(a1, a2, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2ci_inv: a1", i, a1[i], -123.);
+        errn += verify("test_2ci_inv: a2", i, a2[i], -103.);
+      }
+      test_2vi_inv(a1, a2, 123., 103., OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2vi_inv: a1", i, a1[i], 123.);
+        errn += verify("test_2vi_inv: a2", i, a2[i], 103.);
+      }
+      for (int i=0; i<OFFSET; i++) {
+        errn += verify("test_2vi_inv: a1", i, a1[i], -1.);
+        errn += verify("test_2vi_inv: a2", i, a2[i], -1.);
+      }
+      // Reset for indexing with scale
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_scl(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : -123;
+        errn += verify("test_ci_scl: a1", i, a1[i], (double)val);
+      }
+      test_vi_scl(a2, 123.);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : 123;
+        errn += verify("test_vi_scl: a2", i, a2[i], (double)val);
+      }
+      test_cp_scl(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : 123;
+        errn += verify("test_cp_scl: a1", i, a1[i], (double)val);
+      }
+      test_2ci_scl(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        if (i%SCALE != 0) {
+          errn += verify("test_2ci_scl: a1", i, a1[i], -1.);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2ci_scl: a1", i*SCALE, a1[i*SCALE], -123.);
+        }
+        if (i%SCALE != 0) {
+          errn += verify("test_2ci_scl: a2", i, a2[i], -1.);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2ci_scl: a2", i*SCALE, a2[i*SCALE], -103.);
+        }
+      }
+      test_2vi_scl(a1, a2, 123., 103.);
+      for (int i=0; i<ARRLEN; i++) {
+        if (i%SCALE != 0) {
+          errn += verify("test_2vi_scl: a1", i, a1[i], -1.);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2vi_scl: a1", i*SCALE, a1[i*SCALE], 123.);
+        }
+        if (i%SCALE != 0) {
+          errn += verify("test_2vi_scl: a2", i, a2[i], -1.);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2vi_scl: a2", i*SCALE, a2[i*SCALE], 103.);
+        }
+      }
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_vi(a2, 123.);
+      test_cp_alndst(a1, a2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], -1.);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], 123.);
+      }
+      test_vi(a2, -123.);
+      test_cp_alnsrc(a1, a2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], -123.);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], 123.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2ci_aln(a1, a2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln: a1", i, a1[i], -1.);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln: a1", i, a1[i], -123.);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln: a2", i, a2[i], -103.);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln: a2", i, a2[i], -1.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2vi_aln(a1, a2, 123., 103.);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln: a1", i, a1[i], 123.);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln: a1", i, a1[i], -1.);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln: a2", i, a2[i], -1.);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln: a2", i, a2[i], 103.);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_vi(a2, 123.);
+      test_cp_unalndst(a1, a2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], -1.);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], 123.);
+      }
+      test_vi(a2, -123.);
+      test_cp_unalnsrc(a1, a2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], -123.);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], 123.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2ci_unaln(a1, a2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln: a1", i, a1[i], -1.);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln: a1", i, a1[i], -123.);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln: a2", i, a2[i], -103.);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln: a2", i, a2[i], -1.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2vi_unaln(a1, a2, 123., 103.);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln: a1", i, a1[i], 123.);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln: a1", i, a1[i], -1.);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln: a2", i, a2[i], -1.);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln: a2", i, a2[i], 103.);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (double)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_cp_alndst(a1, a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (double)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+      }
+      test_cp_alnsrc(a1, a1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], -1.);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (double)v);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2ci_aln(a1, a1);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln_overlap: a1", i, a1[i], -103.);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln_overlap: a1", i, a1[i], -123.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2vi_aln(a1, a1, 123., 103.);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln_overlap: a1", i, a1[i], 123.);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln_overlap: a1", i, a1[i], 103.);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (double)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_cp_unalndst(a1, a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (double)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+      }
+      test_cp_unalnsrc(a1, a1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], -1.);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (double)v);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2ci_unaln(a1, a1);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], -103.);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], -123.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2vi_unaln(a1, a1, 123., 103.);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], 123.);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], 103.);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, 123.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi(a1, a2, 123., 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a2, 123.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_neg(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_neg(a1, a2, 123., 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_neg: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a2, 123.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_oppos(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_oppos(a1, a2, 123., 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_oppos: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_off(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_off(a2, 123.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_off(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_off(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_off(a1, a2, 123., 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_off: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_inv(a1, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_inv(a2, 123., OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_inv(a1, a2, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_inv(a1, a2, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_inv(a1, a2, 123., 103., OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_inv: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_scl(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_scl(a2, 123.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_scl(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_scl(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_scl(a1, a2, 123., 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_scl: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_aln(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_aln(a1, a2, 123., 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_aln: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_unaln(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_unaln(a1, a2, 123., 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_unaln: " + (end - start));
+
+    return errn;
+  }
+
+  static void test_ci(double[] a) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123.;
+    }
+  }
+  static void test_vi(double[] a, double b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b;
+    }
+  }
+  static void test_cp(double[] a, double[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+    }
+  }
+  static void test_2ci(double[] a, double[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123.;
+      b[i] = -103.;
+    }
+  }
+  static void test_2vi(double[] a, double[] b, double c, double d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_ci_neg(double[] a) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123.;
+    }
+  }
+  static void test_vi_neg(double[] a, double b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b;
+    }
+  }
+  static void test_cp_neg(double[] a, double[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+    }
+  }
+  static void test_2ci_neg(double[] a, double[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123.;
+      b[i] = -103.;
+    }
+  }
+  static void test_2vi_neg(double[] a, double[] b, double c, double d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_ci_oppos(double[] a) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123.;
+    }
+  }
+  static void test_vi_oppos(double[] a, double b) {
+    int limit = a.length-1;
+    for (int i = limit; i >= 0; i-=1) {
+      a[limit-i] = b;
+    }
+  }
+  static void test_cp_oppos(double[] a, double[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+    }
+  }
+  static void test_2ci_oppos(double[] a, double[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123.;
+      b[i] = -103.;
+    }
+  }
+  static void test_2vi_oppos(double[] a, double[] b, double c, double d) {
+    int limit = a.length-1;
+    for (int i = limit; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_ci_off(double[] a) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = -123.;
+    }
+  }
+  static void test_vi_off(double[] a, double b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = b;
+    }
+  }
+  static void test_cp_off(double[] a, double[] b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = b[i+OFFSET];
+    }
+  }
+  static void test_2ci_off(double[] a, double[] b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = -123.;
+      b[i+OFFSET] = -103.;
+    }
+  }
+  static void test_2vi_off(double[] a, double[] b, double c, double d) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = c;
+      b[i+OFFSET] = d;
+    }
+  }
+  static void test_ci_inv(double[] a, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = -123.;
+    }
+  }
+  static void test_vi_inv(double[] a, double b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = b;
+    }
+  }
+  static void test_cp_inv(double[] a, double[] b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = b[i+k];
+    }
+  }
+  static void test_2ci_inv(double[] a, double[] b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = -123.;
+      b[i+k] = -103.;
+    }
+  }
+  static void test_2vi_inv(double[] a, double[] b, double c, double d, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = c;
+      b[i+k] = d;
+    }
+  }
+  static void test_ci_scl(double[] a) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = -123.;
+    }
+  }
+  static void test_vi_scl(double[] a, double b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = b;
+    }
+  }
+  static void test_cp_scl(double[] a, double[] b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = b[i*SCALE];
+    }
+  }
+  static void test_2ci_scl(double[] a, double[] b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = -123.;
+      b[i*SCALE] = -103.;
+    }
+  }
+  static void test_2vi_scl(double[] a, double[] b, double c, double d) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = c;
+      b[i*SCALE] = d;
+    }
+  }
+  static void test_cp_alndst(double[] a, double[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+    }
+  }
+  static void test_cp_alnsrc(double[] a, double[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+    }
+  }
+  static void test_2ci_aln(double[] a, double[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123.;
+      b[i] = -103.;
+    }
+  }
+  static void test_2vi_aln(double[] a, double[] b, double c, double d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(double[] a, double[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+    }
+  }
+  static void test_cp_unalnsrc(double[] a, double[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+    }
+  }
+  static void test_2ci_unaln(double[] a, double[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123.;
+      b[i] = -103.;
+    }
+  }
+  static void test_2vi_unaln(double[] a, double[] b, double c, double d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+
+  static int verify(String text, int i, double elem, double val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestFloatDoubleVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestFloatDoubleVect
+ */
+
+public class TestFloatDoubleVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Float + Double vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    float[] a1 = new float[ARRLEN];
+    float[] a2 = new float[ARRLEN];
+    double[] b1 = new double[ARRLEN];
+    double[] b2 = new double[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+      test_vi(a2, b2, 123.f, 103.);
+      test_cp(a1, a2, b1, b2);
+      test_ci_neg(a1, b1);
+      test_vi_neg(a1, b1, 123.f, 103.);
+      test_cp_neg(a1, a2, b1, b2);
+      test_ci_oppos(a1, b1);
+      test_vi_oppos(a1, b1, 123.f, 103.);
+      test_cp_oppos(a1, a2, b1, b2);
+      test_ci_aln(a1, b1);
+      test_vi_aln(a1, b1, 123.f, 103.);
+      test_cp_alndst(a1, a2, b1, b2);
+      test_cp_alnsrc(a1, a2, b1, b2);
+      test_ci_unaln(a1, b1);
+      test_vi_unaln(a1, b1, 123.f, 103.);
+      test_cp_unalndst(a1, a2, b1, b2);
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+      b1[i] = -1.;
+      b2[i] = -1.;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], -123.f);
+        errn += verify("test_ci: b1", i, b1[i], -103.);
+      }
+      test_vi(a2, b2, 123.f, 103.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], 123.f);
+        errn += verify("test_vi: b2", i, b2[i], 103.);
+      }
+      test_cp(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], 123.f);
+        errn += verify("test_cp: b1", i, b1[i], 103.);
+      }
+
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1.;
+        b2[i] = -1.;
+      }
+      test_ci_neg(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], -123.f);
+        errn += verify("test_ci_neg: b1", i, b1[i], -103.);
+      }
+      test_vi_neg(a2, b2, 123.f, 103.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], 123.f);
+        errn += verify("test_vi_neg: b2", i, b2[i], 103.);
+      }
+      test_cp_neg(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], 123.f);
+        errn += verify("test_cp_neg: b1", i, b1[i], 103.);
+      }
+
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1.;
+        b2[i] = -1.;
+      }
+      test_ci_oppos(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], -123.f);
+        errn += verify("test_ci_oppos: b1", i, b1[i], -103.);
+      }
+      test_vi_oppos(a2, b2, 123.f, 103.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], 123.f);
+        errn += verify("test_vi_oppos: b2", i, b2[i], 103.);
+      }
+      test_cp_oppos(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], 123.f);
+        errn += verify("test_cp_oppos: b1", i, b1[i], 103.);
+      }
+
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1.;
+        b2[i] = 123.;
+      }
+      test_cp_alndst(a1, a2, b1, b2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], -1.f);
+        errn += verify("test_cp_alndst: b1", i, b1[i], -1.);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], 123.f);
+        errn += verify("test_cp_alndst: b1", i, b1[i], 123.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123.;
+      }
+      test_cp_alnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], -123.f);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], -123.);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], 123.f);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], 123.);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_ci_aln(a1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], -1.f);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], -123.f);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], -103.);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], -1.);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_vi_aln(a1, b1, 123.f, 103.);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], 123.f);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], -1.f);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], -1.);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], 103.);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1.;
+        b2[i] = 123.;
+      }
+      test_cp_unalndst(a1, a2, b1, b2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], -1.f);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], -1.);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], 123.f);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], 123.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123.;
+      }
+      test_cp_unalnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], -123.f);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], -123.);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], 123.f);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], 123.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_unaln(a1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], -1.f);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], -123.f);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], -103.);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], -1.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_unaln(a1, b1, 123.f, 103.);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], 123.f);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], -1.f);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], -1.);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], 103.);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (float)i;
+        b1[i] = (double)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_cp_alndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (float)v);
+        errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (double)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+        b1[i+ALIGN_OFF] = -1.;
+      }
+      test_cp_alnsrc(a1, a1, b1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], -1.f);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], -1.);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (float)v);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (double)v);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (float)i;
+        b1[i] = (double)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_cp_unalndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (float)v);
+        errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (double)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+        b1[i+UNALIGN_OFF] = -1.;
+      }
+      test_cp_unalnsrc(a1, a1, b1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], -1.f);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], -1.);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (float)v);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (double)v);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, b2, 123.f, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a1, b1, 123.f, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a1, b1, 123.f, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_aln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_aln(a1, b1, 123.f, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_unaln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_unaln(a1, b1, 123.f, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    return errn;
+  }
+
+  static void test_ci(float[] a, double[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123.f;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi(float[] a, double[] b, float c, double d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp(float[] a, float[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_neg(float[] a, double[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123.f;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_neg(float[] a, double[] b, float c, double d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp_neg(float[] a, float[] b, double[] c, double[] d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_oppos(float[] a, double[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123.f;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_oppos(float[] a, double[] b, float c, double d) {
+    int limit = a.length-1;
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_cp_oppos(float[] a, float[] b, double[] c, double[] d) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+      c[limit-i] = d[i];
+    }
+  }
+  static void test_ci_aln(float[] a, double[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123.f;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_aln(float[] a, double[] b, float c, double d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_alndst(float[] a, float[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+      c[i+ALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_alnsrc(float[] a, float[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+      c[i] = d[i+ALIGN_OFF];
+    }
+  }
+  static void test_ci_unaln(float[] a, double[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123.f;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_unaln(float[] a, double[] b, float c, double d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(float[] a, float[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+      c[i+UNALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_unalnsrc(float[] a, float[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+      c[i] = d[i+UNALIGN_OFF];
+    }
+  }
+
+  static int verify(String text, int i, float elem, float val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+  static int verify(String text, int i, double elem, double val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestFloatVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,953 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestFloatVect
+ */
+
+public class TestFloatVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Float vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    float[] a1 = new float[ARRLEN];
+    float[] a2 = new float[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1);
+      test_vi(a2, 123.f);
+      test_cp(a1, a2);
+      test_2ci(a1, a2);
+      test_2vi(a1, a2, 123.f, 103.f);
+      test_ci_neg(a1);
+      test_vi_neg(a2, 123.f);
+      test_cp_neg(a1, a2);
+      test_2ci_neg(a1, a2);
+      test_2vi_neg(a1, a2, 123.f, 103.f);
+      test_ci_oppos(a1);
+      test_vi_oppos(a2, 123.f);
+      test_cp_oppos(a1, a2);
+      test_2ci_oppos(a1, a2);
+      test_2vi_oppos(a1, a2, 123.f, 103.f);
+      test_ci_off(a1);
+      test_vi_off(a2, 123.f);
+      test_cp_off(a1, a2);
+      test_2ci_off(a1, a2);
+      test_2vi_off(a1, a2, 123.f, 103.f);
+      test_ci_inv(a1, OFFSET);
+      test_vi_inv(a2, 123.f, OFFSET);
+      test_cp_inv(a1, a2, OFFSET);
+      test_2ci_inv(a1, a2, OFFSET);
+      test_2vi_inv(a1, a2, 123.f, 103.f, OFFSET);
+      test_ci_scl(a1);
+      test_vi_scl(a2, 123.f);
+      test_cp_scl(a1, a2);
+      test_2ci_scl(a1, a2);
+      test_2vi_scl(a1, a2, 123.f, 103.f);
+      test_cp_alndst(a1, a2);
+      test_cp_alnsrc(a1, a2);
+      test_2ci_aln(a1, a2);
+      test_2vi_aln(a1, a2, 123.f, 103.f);
+      test_cp_unalndst(a1, a2);
+      test_cp_unalnsrc(a1, a2);
+      test_2ci_unaln(a1, a2);
+      test_2vi_unaln(a1, a2, 123.f, 103.f);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], -123.f);
+      }
+      test_vi(a2, 123.f);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], 123.f);
+      }
+      test_cp(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], 123.f);
+      }
+      test_2ci(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci: a1", i, a1[i], -123.f);
+        errn += verify("test_2ci: a2", i, a2[i], -103.f);
+      }
+      test_2vi(a1, a2, 123.f, 103.f);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi: a1", i, a1[i], 123.f);
+        errn += verify("test_2vi: a2", i, a2[i], 103.f);
+      }
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_neg(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], -123.f);
+      }
+      test_vi_neg(a2, 123.f);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], 123.f);
+      }
+      test_cp_neg(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], 123.f);
+      }
+      test_2ci_neg(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci_neg: a1", i, a1[i], -123.f);
+        errn += verify("test_2ci_neg: a2", i, a2[i], -103.f);
+      }
+      test_2vi_neg(a1, a2, 123.f, 103.f);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi_neg: a1", i, a1[i], 123.f);
+        errn += verify("test_2vi_neg: a2", i, a2[i], 103.f);
+      }
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_oppos(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], -123.f);
+      }
+      test_vi_oppos(a2, 123.f);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], 123.f);
+      }
+      test_cp_oppos(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], 123.f);
+      }
+      test_2ci_oppos(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci_oppos: a1", i, a1[i], -123.f);
+        errn += verify("test_2ci_oppos: a2", i, a2[i], -103.f);
+      }
+      test_2vi_oppos(a1, a2, 123.f, 103.f);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi_oppos: a1", i, a1[i], 123.f);
+        errn += verify("test_2vi_oppos: a2", i, a2[i], 103.f);
+      }
+      // Reset for indexing with offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_off(a1);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_ci_off: a1", i, a1[i], -123.f);
+      }
+      test_vi_off(a2, 123.f);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_vi_off: a2", i, a2[i], 123.f);
+      }
+      test_cp_off(a1, a2);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_cp_off: a1", i, a1[i], 123.f);
+      }
+      test_2ci_off(a1, a2);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2ci_off: a1", i, a1[i], -123.f);
+        errn += verify("test_2ci_off: a2", i, a2[i], -103.f);
+      }
+      test_2vi_off(a1, a2, 123.f, 103.f);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2vi_off: a1", i, a1[i], 123.f);
+        errn += verify("test_2vi_off: a2", i, a2[i], 103.f);
+      }
+      for (int i=0; i<OFFSET; i++) {
+        errn += verify("test_2vi_off: a1", i, a1[i], -1.f);
+        errn += verify("test_2vi_off: a2", i, a2[i], -1.f);
+      }
+      // Reset for indexing with invariant offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_inv(a1, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_ci_inv: a1", i, a1[i], -123.f);
+      }
+      test_vi_inv(a2, 123.f, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_vi_inv: a2", i, a2[i], 123.f);
+      }
+      test_cp_inv(a1, a2, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_cp_inv: a1", i, a1[i], 123.f);
+      }
+      test_2ci_inv(a1, a2, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2ci_inv: a1", i, a1[i], -123.f);
+        errn += verify("test_2ci_inv: a2", i, a2[i], -103.f);
+      }
+      test_2vi_inv(a1, a2, 123.f, 103.f, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2vi_inv: a1", i, a1[i], 123.f);
+        errn += verify("test_2vi_inv: a2", i, a2[i], 103.f);
+      }
+      for (int i=0; i<OFFSET; i++) {
+        errn += verify("test_2vi_inv: a1", i, a1[i], -1.f);
+        errn += verify("test_2vi_inv: a2", i, a2[i], -1.f);
+      }
+      // Reset for indexing with scale
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_scl(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : -123;
+        errn += verify("test_ci_scl: a1", i, a1[i], (float)val);
+      }
+      test_vi_scl(a2, 123.f);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : 123;
+        errn += verify("test_vi_scl: a2", i, a2[i], (float)val);
+      }
+      test_cp_scl(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : 123;
+        errn += verify("test_cp_scl: a1", i, a1[i], (float)val);
+      }
+      test_2ci_scl(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        if (i%SCALE != 0) {
+          errn += verify("test_2ci_scl: a1", i, a1[i], -1.f);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2ci_scl: a1", i*SCALE, a1[i*SCALE], -123.f);
+        }
+        if (i%SCALE != 0) {
+          errn += verify("test_2ci_scl: a2", i, a2[i], -1.f);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2ci_scl: a2", i*SCALE, a2[i*SCALE], -103.f);
+        }
+      }
+      test_2vi_scl(a1, a2, 123.f, 103.f);
+      for (int i=0; i<ARRLEN; i++) {
+        if (i%SCALE != 0) {
+          errn += verify("test_2vi_scl: a1", i, a1[i], -1.f);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2vi_scl: a1", i*SCALE, a1[i*SCALE], 123.f);
+        }
+        if (i%SCALE != 0) {
+          errn += verify("test_2vi_scl: a2", i, a2[i], -1.f);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2vi_scl: a2", i*SCALE, a2[i*SCALE], 103.f);
+        }
+      }
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_vi(a2, 123.f);
+      test_cp_alndst(a1, a2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], -1.f);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], 123.f);
+      }
+      test_vi(a2, -123.f);
+      test_cp_alnsrc(a1, a2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], -123.f);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], 123.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2ci_aln(a1, a2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln: a1", i, a1[i], -1.f);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln: a1", i, a1[i], -123.f);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln: a2", i, a2[i], -103.f);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln: a2", i, a2[i], -1.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2vi_aln(a1, a2, 123.f, 103.f);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln: a1", i, a1[i], 123.f);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln: a1", i, a1[i], -1.f);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln: a2", i, a2[i], -1.f);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln: a2", i, a2[i], 103.f);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_vi(a2, 123.f);
+      test_cp_unalndst(a1, a2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], -1.f);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], 123.f);
+      }
+      test_vi(a2, -123.f);
+      test_cp_unalnsrc(a1, a2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], -123.f);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], 123.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2ci_unaln(a1, a2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln: a1", i, a1[i], -1.f);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln: a1", i, a1[i], -123.f);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln: a2", i, a2[i], -103.f);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln: a2", i, a2[i], -1.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2vi_unaln(a1, a2, 123.f, 103.f);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln: a1", i, a1[i], 123.f);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln: a1", i, a1[i], -1.f);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln: a2", i, a2[i], -1.f);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln: a2", i, a2[i], 103.f);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (float)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_cp_alndst(a1, a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (float)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+      }
+      test_cp_alnsrc(a1, a1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], -1.f);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (float)v);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2ci_aln(a1, a1);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln_overlap: a1", i, a1[i], -103.f);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln_overlap: a1", i, a1[i], -123.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2vi_aln(a1, a1, 123.f, 103.f);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln_overlap: a1", i, a1[i], 123.f);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln_overlap: a1", i, a1[i], 103.f);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (float)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_cp_unalndst(a1, a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (float)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+      }
+      test_cp_unalnsrc(a1, a1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], -1.f);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (float)v);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2ci_unaln(a1, a1);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], -103.f);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], -123.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2vi_unaln(a1, a1, 123.f, 103.f);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], 123.f);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], 103.f);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, 123.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi(a1, a2, 123.f, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a2, 123.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_neg(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_neg(a1, a2, 123.f, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_neg: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a2, 123.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_oppos(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_oppos(a1, a2, 123.f, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_oppos: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_off(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_off(a2, 123.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_off(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_off(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_off(a1, a2, 123.f, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_off: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_inv(a1, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_inv(a2, 123.f, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_inv(a1, a2, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_inv(a1, a2, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_inv(a1, a2, 123.f, 103.f, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_inv: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_scl(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_scl(a2, 123.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_scl(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_scl(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_scl(a1, a2, 123.f, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_scl: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_aln(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_aln(a1, a2, 123.f, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_aln: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_unaln(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_unaln(a1, a2, 123.f, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_unaln: " + (end - start));
+
+    return errn;
+  }
+
+  static void test_ci(float[] a) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123.f;
+    }
+  }
+  static void test_vi(float[] a, float b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b;
+    }
+  }
+  static void test_cp(float[] a, float[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+    }
+  }
+  static void test_2ci(float[] a, float[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123.f;
+      b[i] = -103.f;
+    }
+  }
+  static void test_2vi(float[] a, float[] b, float c, float d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_ci_neg(float[] a) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123.f;
+    }
+  }
+  static void test_vi_neg(float[] a, float b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b;
+    }
+  }
+  static void test_cp_neg(float[] a, float[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+    }
+  }
+  static void test_2ci_neg(float[] a, float[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123.f;
+      b[i] = -103.f;
+    }
+  }
+  static void test_2vi_neg(float[] a, float[] b, float c, float d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_ci_oppos(float[] a) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123.f;
+    }
+  }
+  static void test_vi_oppos(float[] a, float b) {
+    int limit = a.length-1;
+    for (int i = limit; i >= 0; i-=1) {
+      a[limit-i] = b;
+    }
+  }
+  static void test_cp_oppos(float[] a, float[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+    }
+  }
+  static void test_2ci_oppos(float[] a, float[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123.f;
+      b[i] = -103.f;
+    }
+  }
+  static void test_2vi_oppos(float[] a, float[] b, float c, float d) {
+    int limit = a.length-1;
+    for (int i = limit; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_ci_off(float[] a) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = -123.f;
+    }
+  }
+  static void test_vi_off(float[] a, float b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = b;
+    }
+  }
+  static void test_cp_off(float[] a, float[] b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = b[i+OFFSET];
+    }
+  }
+  static void test_2ci_off(float[] a, float[] b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = -123.f;
+      b[i+OFFSET] = -103.f;
+    }
+  }
+  static void test_2vi_off(float[] a, float[] b, float c, float d) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = c;
+      b[i+OFFSET] = d;
+    }
+  }
+  static void test_ci_inv(float[] a, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = -123.f;
+    }
+  }
+  static void test_vi_inv(float[] a, float b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = b;
+    }
+  }
+  static void test_cp_inv(float[] a, float[] b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = b[i+k];
+    }
+  }
+  static void test_2ci_inv(float[] a, float[] b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = -123.f;
+      b[i+k] = -103.f;
+    }
+  }
+  static void test_2vi_inv(float[] a, float[] b, float c, float d, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = c;
+      b[i+k] = d;
+    }
+  }
+  static void test_ci_scl(float[] a) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = -123.f;
+    }
+  }
+  static void test_vi_scl(float[] a, float b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = b;
+    }
+  }
+  static void test_cp_scl(float[] a, float[] b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = b[i*SCALE];
+    }
+  }
+  static void test_2ci_scl(float[] a, float[] b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = -123.f;
+      b[i*SCALE] = -103.f;
+    }
+  }
+  static void test_2vi_scl(float[] a, float[] b, float c, float d) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = c;
+      b[i*SCALE] = d;
+    }
+  }
+  static void test_cp_alndst(float[] a, float[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+    }
+  }
+  static void test_cp_alnsrc(float[] a, float[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+    }
+  }
+  static void test_2ci_aln(float[] a, float[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123.f;
+      b[i] = -103.f;
+    }
+  }
+  static void test_2vi_aln(float[] a, float[] b, float c, float d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(float[] a, float[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+    }
+  }
+  static void test_cp_unalnsrc(float[] a, float[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+    }
+  }
+  static void test_2ci_unaln(float[] a, float[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123.f;
+      b[i] = -103.f;
+    }
+  }
+  static void test_2vi_unaln(float[] a, float[] b, float c, float d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+
+  static int verify(String text, int i, float elem, float val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestIntDoubleVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestIntDoubleVect
+ */
+
+public class TestIntDoubleVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Integer + Double vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    int[] a1 = new int[ARRLEN];
+    int[] a2 = new int[ARRLEN];
+    double[] b1 = new double[ARRLEN];
+    double[] b2 = new double[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+      test_vi(a2, b2, (int)123, 103.);
+      test_cp(a1, a2, b1, b2);
+      test_ci_neg(a1, b1);
+      test_vi_neg(a1, b1, (int)123, 103.);
+      test_cp_neg(a1, a2, b1, b2);
+      test_ci_oppos(a1, b1);
+      test_vi_oppos(a1, b1, (int)123, 103.);
+      test_cp_oppos(a1, a2, b1, b2);
+      test_ci_aln(a1, b1);
+      test_vi_aln(a1, b1, (int)123, 103.);
+      test_cp_alndst(a1, a2, b1, b2);
+      test_cp_alnsrc(a1, a2, b1, b2);
+      test_ci_unaln(a1, b1);
+      test_vi_unaln(a1, b1, (int)123, 103.);
+      test_cp_unalndst(a1, a2, b1, b2);
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+      b1[i] = -1.;
+      b2[i] = -1.;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (int)-123);
+        errn += verify("test_ci: b1", i, b1[i], -103.);
+      }
+      test_vi(a2, b2, (int)123, 103.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (int)123);
+        errn += verify("test_vi: b2", i, b2[i], 103.);
+      }
+      test_cp(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (int)123);
+        errn += verify("test_cp: b1", i, b1[i], 103.);
+      }
+
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1.;
+        b2[i] = -1.;
+      }
+      test_ci_neg(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (int)-123);
+        errn += verify("test_ci_neg: b1", i, b1[i], -103.);
+      }
+      test_vi_neg(a2, b2, (int)123, 103.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (int)123);
+        errn += verify("test_vi_neg: b2", i, b2[i], 103.);
+      }
+      test_cp_neg(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (int)123);
+        errn += verify("test_cp_neg: b1", i, b1[i], 103.);
+      }
+
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1.;
+        b2[i] = -1.;
+      }
+      test_ci_oppos(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (int)-123);
+        errn += verify("test_ci_oppos: b1", i, b1[i], -103.);
+      }
+      test_vi_oppos(a2, b2, (int)123, 103.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (int)123);
+        errn += verify("test_vi_oppos: b2", i, b2[i], 103.);
+      }
+      test_cp_oppos(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (int)123);
+        errn += verify("test_cp_oppos: b1", i, b1[i], 103.);
+      }
+
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1.;
+        b2[i] = 123.;
+      }
+      test_cp_alndst(a1, a2, b1, b2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (int)-1);
+        errn += verify("test_cp_alndst: b1", i, b1[i], -1.);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (int)123);
+        errn += verify("test_cp_alndst: b1", i, b1[i], 123.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123.;
+      }
+      test_cp_alnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (int)-123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], -123.);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (int)123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], 123.);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_ci_aln(a1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (int)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (int)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], -103.);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], -1.);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_vi_aln(a1, b1, (int)123, 103.);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (int)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (int)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], -1.);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], 103.);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1.;
+        b2[i] = 123.;
+      }
+      test_cp_unalndst(a1, a2, b1, b2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (int)-1);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], -1.);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (int)123);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], 123.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123.;
+      }
+      test_cp_unalnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (int)-123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], -123.);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (int)123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], 123.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_unaln(a1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (int)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (int)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], -103.);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], -1.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_unaln(a1, b1, (int)123, 103.);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (int)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (int)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], -1.);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], 103.);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (int)i;
+        b1[i] = (double)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_cp_alndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (int)v);
+        errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (double)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+        b1[i+ALIGN_OFF] = -1.;
+      }
+      test_cp_alnsrc(a1, a1, b1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (int)-1);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], -1.);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (int)v);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (double)v);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (int)i;
+        b1[i] = (double)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_cp_unalndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (int)v);
+        errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (double)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+        b1[i+UNALIGN_OFF] = -1.;
+      }
+      test_cp_unalnsrc(a1, a1, b1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (int)-1);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], -1.);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (int)v);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (double)v);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, b2, (int)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a1, b1, (int)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a1, b1, (int)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_aln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_aln(a1, b1, (int)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_unaln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_unaln(a1, b1, (int)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    return errn;
+  }
+
+  static void test_ci(int[] a, double[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi(int[] a, double[] b, int c, double d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp(int[] a, int[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_neg(int[] a, double[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_neg(int[] a, double[] b, int c, double d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp_neg(int[] a, int[] b, double[] c, double[] d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_oppos(int[] a, double[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_oppos(int[] a, double[] b, int c, double d) {
+    int limit = a.length-1;
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_cp_oppos(int[] a, int[] b, double[] c, double[] d) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+      c[limit-i] = d[i];
+    }
+  }
+  static void test_ci_aln(int[] a, double[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_aln(int[] a, double[] b, int c, double d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_alndst(int[] a, int[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+      c[i+ALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_alnsrc(int[] a, int[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+      c[i] = d[i+ALIGN_OFF];
+    }
+  }
+  static void test_ci_unaln(int[] a, double[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_unaln(int[] a, double[] b, int c, double d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(int[] a, int[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+      c[i+UNALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_unalnsrc(int[] a, int[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+      c[i] = d[i+UNALIGN_OFF];
+    }
+  }
+
+  static int verify(String text, int i, int elem, int val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+  static int verify(String text, int i, double elem, double val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestIntFloatVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestIntFloatVect
+ */
+
+public class TestIntFloatVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Integer + Float vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    int[] a1 = new int[ARRLEN];
+    int[] a2 = new int[ARRLEN];
+    float[] b1 = new float[ARRLEN];
+    float[] b2 = new float[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+      test_vi(a2, b2, (int)123, 103.f);
+      test_cp(a1, a2, b1, b2);
+      test_ci_neg(a1, b1);
+      test_vi_neg(a1, b1, (int)123, 103.f);
+      test_cp_neg(a1, a2, b1, b2);
+      test_ci_oppos(a1, b1);
+      test_vi_oppos(a1, b1, (int)123, 103.f);
+      test_cp_oppos(a1, a2, b1, b2);
+      test_ci_aln(a1, b1);
+      test_vi_aln(a1, b1, (int)123, 103.f);
+      test_cp_alndst(a1, a2, b1, b2);
+      test_cp_alnsrc(a1, a2, b1, b2);
+      test_ci_unaln(a1, b1);
+      test_vi_unaln(a1, b1, (int)123, 103.f);
+      test_cp_unalndst(a1, a2, b1, b2);
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+      b1[i] = -1.f;
+      b2[i] = -1.f;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (int)-123);
+        errn += verify("test_ci: b1", i, b1[i], -103.f);
+      }
+      test_vi(a2, b2, (int)123, 103.f);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (int)123);
+        errn += verify("test_vi: b2", i, b2[i], 103.f);
+      }
+      test_cp(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (int)123);
+        errn += verify("test_cp: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1.f;
+        b2[i] = -1.f;
+      }
+      test_ci_neg(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (int)-123);
+        errn += verify("test_ci_neg: b1", i, b1[i], -103.f);
+      }
+      test_vi_neg(a2, b2, (int)123, 103.f);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (int)123);
+        errn += verify("test_vi_neg: b2", i, b2[i], 103.f);
+      }
+      test_cp_neg(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (int)123);
+        errn += verify("test_cp_neg: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1.f;
+        b2[i] = -1.f;
+      }
+      test_ci_oppos(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (int)-123);
+        errn += verify("test_ci_oppos: b1", i, b1[i], -103.f);
+      }
+      test_vi_oppos(a2, b2, (int)123, 103.f);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (int)123);
+        errn += verify("test_vi_oppos: b2", i, b2[i], 103.f);
+      }
+      test_cp_oppos(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (int)123);
+        errn += verify("test_cp_oppos: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1.f;
+        b2[i] = 123.f;
+      }
+      test_cp_alndst(a1, a2, b1, b2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (int)-1);
+        errn += verify("test_cp_alndst: b1", i, b1[i], -1.f);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (int)123);
+        errn += verify("test_cp_alndst: b1", i, b1[i], 123.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123.f;
+      }
+      test_cp_alnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (int)-123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], -123.f);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (int)123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], 123.f);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.f;
+      }
+      test_ci_aln(a1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (int)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (int)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], -103.f);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], -1.f);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.f;
+      }
+      test_vi_aln(a1, b1, (int)123, 103.f);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (int)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (int)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], -1.f);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1.f;
+        b2[i] = 123.f;
+      }
+      test_cp_unalndst(a1, a2, b1, b2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (int)-1);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], -1.f);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (int)123);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], 123.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123.f;
+      }
+      test_cp_unalnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (int)-123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], -123.f);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (int)123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], 123.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_unaln(a1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (int)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (int)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], -103.f);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], -1.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_unaln(a1, b1, (int)123, 103.f);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (int)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (int)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], -1.f);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (int)i;
+        b1[i] = (float)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.f;
+      }
+      test_cp_alndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (int)v);
+        errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (float)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+        b1[i+ALIGN_OFF] = -1.f;
+      }
+      test_cp_alnsrc(a1, a1, b1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (int)-1);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], -1.f);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (int)v);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (float)v);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (int)i;
+        b1[i] = (float)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.f;
+      }
+      test_cp_unalndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (int)v);
+        errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (float)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+        b1[i+UNALIGN_OFF] = -1.f;
+      }
+      test_cp_unalnsrc(a1, a1, b1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (int)-1);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], -1.f);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (int)v);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (float)v);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, b2, (int)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a1, b1, (int)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a1, b1, (int)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_aln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_aln(a1, b1, (int)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_unaln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_unaln(a1, b1, (int)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    return errn;
+  }
+
+  static void test_ci(int[] a, float[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi(int[] a, float[] b, int c, float d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp(int[] a, int[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_neg(int[] a, float[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi_neg(int[] a, float[] b, int c, float d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp_neg(int[] a, int[] b, float[] c, float[] d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_oppos(int[] a, float[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi_oppos(int[] a, float[] b, int c, float d) {
+    int limit = a.length-1;
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_cp_oppos(int[] a, int[] b, float[] c, float[] d) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+      c[limit-i] = d[i];
+    }
+  }
+  static void test_ci_aln(int[] a, float[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi_aln(int[] a, float[] b, int c, float d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_alndst(int[] a, int[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+      c[i+ALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_alnsrc(int[] a, int[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+      c[i] = d[i+ALIGN_OFF];
+    }
+  }
+  static void test_ci_unaln(int[] a, float[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi_unaln(int[] a, float[] b, int c, float d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(int[] a, int[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+      c[i+UNALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_unalnsrc(int[] a, int[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+      c[i] = d[i+UNALIGN_OFF];
+    }
+  }
+
+  static int verify(String text, int i, int elem, int val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+  static int verify(String text, int i, float elem, float val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestIntLongVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestIntLongVect
+ */
+
+public class TestIntLongVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Integer + Long vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    int[] a1 = new int[ARRLEN];
+    int[] a2 = new int[ARRLEN];
+    long[] b1 = new long[ARRLEN];
+    long[] b2 = new long[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+      test_vi(a2, b2, (int)123, (long)103);
+      test_cp(a1, a2, b1, b2);
+      test_ci_neg(a1, b1);
+      test_vi_neg(a1, b1, (int)123, (long)103);
+      test_cp_neg(a1, a2, b1, b2);
+      test_ci_oppos(a1, b1);
+      test_vi_oppos(a1, b1, (int)123, (long)103);
+      test_cp_oppos(a1, a2, b1, b2);
+      test_ci_aln(a1, b1);
+      test_vi_aln(a1, b1, (int)123, (long)103);
+      test_cp_alndst(a1, a2, b1, b2);
+      test_cp_alnsrc(a1, a2, b1, b2);
+      test_ci_unaln(a1, b1);
+      test_vi_unaln(a1, b1, (int)123, (long)103);
+      test_cp_unalndst(a1, a2, b1, b2);
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+      b1[i] = -1;
+      b2[i] = -1;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (int)-123);
+        errn += verify("test_ci: b1", i, b1[i], (long)-103);
+      }
+      test_vi(a2, b2, (int)123, (long)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (int)123);
+        errn += verify("test_vi: b2", i, b2[i], (long)103);
+      }
+      test_cp(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (int)123);
+        errn += verify("test_cp: b1", i, b1[i], (long)103);
+      }
+
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1;
+        b2[i] = -1;
+      }
+      test_ci_neg(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (int)-123);
+        errn += verify("test_ci_neg: b1", i, b1[i], (long)-103);
+      }
+      test_vi_neg(a2, b2, (int)123, (long)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (int)123);
+        errn += verify("test_vi_neg: b2", i, b2[i], (long)103);
+      }
+      test_cp_neg(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (int)123);
+        errn += verify("test_cp_neg: b1", i, b1[i], (long)103);
+      }
+
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1;
+        b2[i] = -1;
+      }
+      test_ci_oppos(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (int)-123);
+        errn += verify("test_ci_oppos: b1", i, b1[i], (long)-103);
+      }
+      test_vi_oppos(a2, b2, (int)123, (long)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (int)123);
+        errn += verify("test_vi_oppos: b2", i, b2[i], (long)103);
+      }
+      test_cp_oppos(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (int)123);
+        errn += verify("test_cp_oppos: b1", i, b1[i], (long)103);
+      }
+
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1;
+        b2[i] = 123;
+      }
+      test_cp_alndst(a1, a2, b1, b2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (int)-1);
+        errn += verify("test_cp_alndst: b1", i, b1[i], (long)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (int)123);
+        errn += verify("test_cp_alndst: b1", i, b1[i], (long)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123;
+      }
+      test_cp_alnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (int)-123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], (long)-123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (int)123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], (long)123);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_aln(a1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (int)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (int)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], (long)-103);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], (long)-1);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_aln(a1, b1, (int)123, (long)103);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (int)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (int)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], (long)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], (long)103);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1;
+        b2[i] = 123;
+      }
+      test_cp_unalndst(a1, a2, b1, b2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (int)-1);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], (long)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (int)123);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], (long)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123;
+      }
+      test_cp_unalnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (int)-123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], (long)-123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (int)123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], (long)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_unaln(a1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (int)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (int)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], (long)-103);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], (long)-1);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_unaln(a1, b1, (int)123, (long)103);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (int)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (int)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], (long)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], (long)103);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (int)i;
+        b1[i] = (long)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_cp_alndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (int)v);
+        errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (long)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+        b1[i+ALIGN_OFF] = -1;
+      }
+      test_cp_alnsrc(a1, a1, b1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (int)-1);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (long)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (int)v);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (long)v);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (int)i;
+        b1[i] = (long)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_cp_unalndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (int)v);
+        errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (long)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+        b1[i+UNALIGN_OFF] = -1;
+      }
+      test_cp_unalnsrc(a1, a1, b1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (int)-1);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (long)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (int)v);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (long)v);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, b2, (int)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a1, b1, (int)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a1, b1, (int)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_aln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_aln(a1, b1, (int)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_unaln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_unaln(a1, b1, (int)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    return errn;
+  }
+
+  static void test_ci(int[] a, long[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi(int[] a, long[] b, int c, long d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp(int[] a, int[] b, long[] c, long[] d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_neg(int[] a, long[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_neg(int[] a, long[] b, int c, long d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp_neg(int[] a, int[] b, long[] c, long[] d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_oppos(int[] a, long[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_oppos(int[] a, long[] b, int c, long d) {
+    int limit = a.length-1;
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_cp_oppos(int[] a, int[] b, long[] c, long[] d) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+      c[limit-i] = d[i];
+    }
+  }
+  static void test_ci_aln(int[] a, long[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_aln(int[] a, long[] b, int c, long d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_alndst(int[] a, int[] b, long[] c, long[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+      c[i+ALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_alnsrc(int[] a, int[] b, long[] c, long[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+      c[i] = d[i+ALIGN_OFF];
+    }
+  }
+  static void test_ci_unaln(int[] a, long[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_unaln(int[] a, long[] b, int c, long d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(int[] a, int[] b, long[] c, long[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+      c[i+UNALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_unalnsrc(int[] a, int[] b, long[] c, long[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+      c[i] = d[i+UNALIGN_OFF];
+    }
+  }
+
+  static int verify(String text, int i, int elem, int val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+  static int verify(String text, int i, long elem, long val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestIntVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,953 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestIntVect
+ */
+
+public class TestIntVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Integer vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    int[] a1 = new int[ARRLEN];
+    int[] a2 = new int[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1);
+      test_vi(a2, (int)123);
+      test_cp(a1, a2);
+      test_2ci(a1, a2);
+      test_2vi(a1, a2, (int)123, (int)103);
+      test_ci_neg(a1);
+      test_vi_neg(a2, (int)123);
+      test_cp_neg(a1, a2);
+      test_2ci_neg(a1, a2);
+      test_2vi_neg(a1, a2, (int)123, (int)103);
+      test_ci_oppos(a1);
+      test_vi_oppos(a2, (int)123);
+      test_cp_oppos(a1, a2);
+      test_2ci_oppos(a1, a2);
+      test_2vi_oppos(a1, a2, (int)123, (int)103);
+      test_ci_off(a1);
+      test_vi_off(a2, (int)123);
+      test_cp_off(a1, a2);
+      test_2ci_off(a1, a2);
+      test_2vi_off(a1, a2, (int)123, (int)103);
+      test_ci_inv(a1, OFFSET);
+      test_vi_inv(a2, (int)123, OFFSET);
+      test_cp_inv(a1, a2, OFFSET);
+      test_2ci_inv(a1, a2, OFFSET);
+      test_2vi_inv(a1, a2, (int)123, (int)103, OFFSET);
+      test_ci_scl(a1);
+      test_vi_scl(a2, (int)123);
+      test_cp_scl(a1, a2);
+      test_2ci_scl(a1, a2);
+      test_2vi_scl(a1, a2, (int)123, (int)103);
+      test_cp_alndst(a1, a2);
+      test_cp_alnsrc(a1, a2);
+      test_2ci_aln(a1, a2);
+      test_2vi_aln(a1, a2, (int)123, (int)103);
+      test_cp_unalndst(a1, a2);
+      test_cp_unalnsrc(a1, a2);
+      test_2ci_unaln(a1, a2);
+      test_2vi_unaln(a1, a2, (int)123, (int)103);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (int)-123);
+      }
+      test_vi(a2, (int)123);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (int)123);
+      }
+      test_cp(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (int)123);
+      }
+      test_2ci(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci: a1", i, a1[i], (int)-123);
+        errn += verify("test_2ci: a2", i, a2[i], (int)-103);
+      }
+      test_2vi(a1, a2, (int)123, (int)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi: a1", i, a1[i], (int)123);
+        errn += verify("test_2vi: a2", i, a2[i], (int)103);
+      }
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_neg(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (int)-123);
+      }
+      test_vi_neg(a2, (int)123);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (int)123);
+      }
+      test_cp_neg(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (int)123);
+      }
+      test_2ci_neg(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci_neg: a1", i, a1[i], (int)-123);
+        errn += verify("test_2ci_neg: a2", i, a2[i], (int)-103);
+      }
+      test_2vi_neg(a1, a2, (int)123, (int)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi_neg: a1", i, a1[i], (int)123);
+        errn += verify("test_2vi_neg: a2", i, a2[i], (int)103);
+      }
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_oppos(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (int)-123);
+      }
+      test_vi_oppos(a2, (int)123);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (int)123);
+      }
+      test_cp_oppos(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (int)123);
+      }
+      test_2ci_oppos(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci_oppos: a1", i, a1[i], (int)-123);
+        errn += verify("test_2ci_oppos: a2", i, a2[i], (int)-103);
+      }
+      test_2vi_oppos(a1, a2, (int)123, (int)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi_oppos: a1", i, a1[i], (int)123);
+        errn += verify("test_2vi_oppos: a2", i, a2[i], (int)103);
+      }
+      // Reset for indexing with offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_off(a1);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_ci_off: a1", i, a1[i], (int)-123);
+      }
+      test_vi_off(a2, (int)123);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_vi_off: a2", i, a2[i], (int)123);
+      }
+      test_cp_off(a1, a2);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_cp_off: a1", i, a1[i], (int)123);
+      }
+      test_2ci_off(a1, a2);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2ci_off: a1", i, a1[i], (int)-123);
+        errn += verify("test_2ci_off: a2", i, a2[i], (int)-103);
+      }
+      test_2vi_off(a1, a2, (int)123, (int)103);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2vi_off: a1", i, a1[i], (int)123);
+        errn += verify("test_2vi_off: a2", i, a2[i], (int)103);
+      }
+      for (int i=0; i<OFFSET; i++) {
+        errn += verify("test_2vi_off: a1", i, a1[i], (int)-1);
+        errn += verify("test_2vi_off: a2", i, a2[i], (int)-1);
+      }
+      // Reset for indexing with invariant offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_inv(a1, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_ci_inv: a1", i, a1[i], (int)-123);
+      }
+      test_vi_inv(a2, (int)123, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_vi_inv: a2", i, a2[i], (int)123);
+      }
+      test_cp_inv(a1, a2, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_cp_inv: a1", i, a1[i], (int)123);
+      }
+      test_2ci_inv(a1, a2, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2ci_inv: a1", i, a1[i], (int)-123);
+        errn += verify("test_2ci_inv: a2", i, a2[i], (int)-103);
+      }
+      test_2vi_inv(a1, a2, (int)123, (int)103, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2vi_inv: a1", i, a1[i], (int)123);
+        errn += verify("test_2vi_inv: a2", i, a2[i], (int)103);
+      }
+      for (int i=0; i<OFFSET; i++) {
+        errn += verify("test_2vi_inv: a1", i, a1[i], (int)-1);
+        errn += verify("test_2vi_inv: a2", i, a2[i], (int)-1);
+      }
+      // Reset for indexing with scale
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_scl(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : -123;
+        errn += verify("test_ci_scl: a1", i, a1[i], (int)val);
+      }
+      test_vi_scl(a2, (int)123);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : 123;
+        errn += verify("test_vi_scl: a2", i, a2[i], (int)val);
+      }
+      test_cp_scl(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : 123;
+        errn += verify("test_cp_scl: a1", i, a1[i], (int)val);
+      }
+      test_2ci_scl(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        if (i%SCALE != 0) {
+          errn += verify("test_2ci_scl: a1", i, a1[i], (int)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2ci_scl: a1", i*SCALE, a1[i*SCALE], (int)-123);
+        }
+        if (i%SCALE != 0) {
+          errn += verify("test_2ci_scl: a2", i, a2[i], (int)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2ci_scl: a2", i*SCALE, a2[i*SCALE], (int)-103);
+        }
+      }
+      test_2vi_scl(a1, a2, (int)123, (int)103);
+      for (int i=0; i<ARRLEN; i++) {
+        if (i%SCALE != 0) {
+          errn += verify("test_2vi_scl: a1", i, a1[i], (int)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2vi_scl: a1", i*SCALE, a1[i*SCALE], (int)123);
+        }
+        if (i%SCALE != 0) {
+          errn += verify("test_2vi_scl: a2", i, a2[i], (int)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2vi_scl: a2", i*SCALE, a2[i*SCALE], (int)103);
+        }
+      }
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_vi(a2, (int)123);
+      test_cp_alndst(a1, a2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (int)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (int)123);
+      }
+      test_vi(a2, (int)-123);
+      test_cp_alnsrc(a1, a2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (int)-123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (int)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2ci_aln(a1, a2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln: a1", i, a1[i], (int)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln: a1", i, a1[i], (int)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln: a2", i, a2[i], (int)-103);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln: a2", i, a2[i], (int)-1);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2vi_aln(a1, a2, (int)123, (int)103);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln: a1", i, a1[i], (int)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln: a1", i, a1[i], (int)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln: a2", i, a2[i], (int)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln: a2", i, a2[i], (int)103);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_vi(a2, (int)123);
+      test_cp_unalndst(a1, a2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (int)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (int)123);
+      }
+      test_vi(a2, (int)-123);
+      test_cp_unalnsrc(a1, a2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (int)-123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (int)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2ci_unaln(a1, a2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln: a1", i, a1[i], (int)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln: a1", i, a1[i], (int)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln: a2", i, a2[i], (int)-103);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln: a2", i, a2[i], (int)-1);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2vi_unaln(a1, a2, (int)123, (int)103);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln: a1", i, a1[i], (int)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln: a1", i, a1[i], (int)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln: a2", i, a2[i], (int)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln: a2", i, a2[i], (int)103);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (int)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_cp_alndst(a1, a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (int)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+      }
+      test_cp_alnsrc(a1, a1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (int)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (int)v);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2ci_aln(a1, a1);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (int)-103);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (int)-123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2vi_aln(a1, a1, (int)123, (int)103);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (int)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (int)103);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (int)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_cp_unalndst(a1, a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (int)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+      }
+      test_cp_unalnsrc(a1, a1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (int)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (int)v);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2ci_unaln(a1, a1);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (int)-103);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (int)-123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2vi_unaln(a1, a1, (int)123, (int)103);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (int)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (int)103);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, (int)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi(a1, a2, (int)123, (int)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a2, (int)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_neg(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_neg(a1, a2, (int)123, (int)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_neg: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a2, (int)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_oppos(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_oppos(a1, a2, (int)123, (int)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_oppos: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_off(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_off(a2, (int)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_off(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_off(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_off(a1, a2, (int)123, (int)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_off: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_inv(a1, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_inv(a2, (int)123, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_inv(a1, a2, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_inv(a1, a2, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_inv(a1, a2, (int)123, (int)103, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_inv: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_scl(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_scl(a2, (int)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_scl(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_scl(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_scl(a1, a2, (int)123, (int)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_scl: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_aln(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_aln(a1, a2, (int)123, (int)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_aln: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_unaln(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_unaln(a1, a2, (int)123, (int)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_unaln: " + (end - start));
+
+    return errn;
+  }
+
+  static void test_ci(int[] a) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+    }
+  }
+  static void test_vi(int[] a, int b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b;
+    }
+  }
+  static void test_cp(int[] a, int[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+    }
+  }
+  static void test_2ci(int[] a, int[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi(int[] a, int[] b, int c, int d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_ci_neg(int[] a) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+    }
+  }
+  static void test_vi_neg(int[] a, int b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b;
+    }
+  }
+  static void test_cp_neg(int[] a, int[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+    }
+  }
+  static void test_2ci_neg(int[] a, int[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi_neg(int[] a, int[] b, int c, int d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_ci_oppos(int[] a) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+    }
+  }
+  static void test_vi_oppos(int[] a, int b) {
+    int limit = a.length-1;
+    for (int i = limit; i >= 0; i-=1) {
+      a[limit-i] = b;
+    }
+  }
+  static void test_cp_oppos(int[] a, int[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+    }
+  }
+  static void test_2ci_oppos(int[] a, int[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi_oppos(int[] a, int[] b, int c, int d) {
+    int limit = a.length-1;
+    for (int i = limit; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_ci_off(int[] a) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = -123;
+    }
+  }
+  static void test_vi_off(int[] a, int b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = b;
+    }
+  }
+  static void test_cp_off(int[] a, int[] b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = b[i+OFFSET];
+    }
+  }
+  static void test_2ci_off(int[] a, int[] b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = -123;
+      b[i+OFFSET] = -103;
+    }
+  }
+  static void test_2vi_off(int[] a, int[] b, int c, int d) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = c;
+      b[i+OFFSET] = d;
+    }
+  }
+  static void test_ci_inv(int[] a, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = -123;
+    }
+  }
+  static void test_vi_inv(int[] a, int b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = b;
+    }
+  }
+  static void test_cp_inv(int[] a, int[] b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = b[i+k];
+    }
+  }
+  static void test_2ci_inv(int[] a, int[] b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = -123;
+      b[i+k] = -103;
+    }
+  }
+  static void test_2vi_inv(int[] a, int[] b, int c, int d, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = c;
+      b[i+k] = d;
+    }
+  }
+  static void test_ci_scl(int[] a) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = -123;
+    }
+  }
+  static void test_vi_scl(int[] a, int b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = b;
+    }
+  }
+  static void test_cp_scl(int[] a, int[] b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = b[i*SCALE];
+    }
+  }
+  static void test_2ci_scl(int[] a, int[] b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = -123;
+      b[i*SCALE] = -103;
+    }
+  }
+  static void test_2vi_scl(int[] a, int[] b, int c, int d) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = c;
+      b[i*SCALE] = d;
+    }
+  }
+  static void test_cp_alndst(int[] a, int[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+    }
+  }
+  static void test_cp_alnsrc(int[] a, int[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+    }
+  }
+  static void test_2ci_aln(int[] a, int[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi_aln(int[] a, int[] b, int c, int d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(int[] a, int[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+    }
+  }
+  static void test_cp_unalnsrc(int[] a, int[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+    }
+  }
+  static void test_2ci_unaln(int[] a, int[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi_unaln(int[] a, int[] b, int c, int d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+
+  static int verify(String text, int i, int elem, int val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestLongDoubleVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestLongDoubleVect
+ */
+
+public class TestLongDoubleVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Long + Double vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    long[] a1 = new long[ARRLEN];
+    long[] a2 = new long[ARRLEN];
+    double[] b1 = new double[ARRLEN];
+    double[] b2 = new double[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+      test_vi(a2, b2, (long)123, 103.);
+      test_cp(a1, a2, b1, b2);
+      test_ci_neg(a1, b1);
+      test_vi_neg(a1, b1, (long)123, 103.);
+      test_cp_neg(a1, a2, b1, b2);
+      test_ci_oppos(a1, b1);
+      test_vi_oppos(a1, b1, (long)123, 103.);
+      test_cp_oppos(a1, a2, b1, b2);
+      test_ci_aln(a1, b1);
+      test_vi_aln(a1, b1, (long)123, 103.);
+      test_cp_alndst(a1, a2, b1, b2);
+      test_cp_alnsrc(a1, a2, b1, b2);
+      test_ci_unaln(a1, b1);
+      test_vi_unaln(a1, b1, (long)123, 103.);
+      test_cp_unalndst(a1, a2, b1, b2);
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+      b1[i] = -1.;
+      b2[i] = -1.;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (long)-123);
+        errn += verify("test_ci: b1", i, b1[i], -103.);
+      }
+      test_vi(a2, b2, (long)123, 103.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (long)123);
+        errn += verify("test_vi: b2", i, b2[i], 103.);
+      }
+      test_cp(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (long)123);
+        errn += verify("test_cp: b1", i, b1[i], 103.);
+      }
+
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1.;
+        b2[i] = -1.;
+      }
+      test_ci_neg(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (long)-123);
+        errn += verify("test_ci_neg: b1", i, b1[i], -103.);
+      }
+      test_vi_neg(a2, b2, (long)123, 103.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (long)123);
+        errn += verify("test_vi_neg: b2", i, b2[i], 103.);
+      }
+      test_cp_neg(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (long)123);
+        errn += verify("test_cp_neg: b1", i, b1[i], 103.);
+      }
+
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1.;
+        b2[i] = -1.;
+      }
+      test_ci_oppos(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (long)-123);
+        errn += verify("test_ci_oppos: b1", i, b1[i], -103.);
+      }
+      test_vi_oppos(a2, b2, (long)123, 103.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (long)123);
+        errn += verify("test_vi_oppos: b2", i, b2[i], 103.);
+      }
+      test_cp_oppos(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (long)123);
+        errn += verify("test_cp_oppos: b1", i, b1[i], 103.);
+      }
+
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1.;
+        b2[i] = 123.;
+      }
+      test_cp_alndst(a1, a2, b1, b2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (long)-1);
+        errn += verify("test_cp_alndst: b1", i, b1[i], -1.);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (long)123);
+        errn += verify("test_cp_alndst: b1", i, b1[i], 123.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123.;
+      }
+      test_cp_alnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (long)-123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], -123.);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (long)123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], 123.);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_ci_aln(a1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (long)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (long)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], -103.);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], -1.);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_vi_aln(a1, b1, (long)123, 103.);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (long)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (long)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], -1.);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], 103.);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1.;
+        b2[i] = 123.;
+      }
+      test_cp_unalndst(a1, a2, b1, b2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (long)-1);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], -1.);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (long)123);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], 123.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123.;
+      }
+      test_cp_unalnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (long)-123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], -123.);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (long)123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], 123.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_unaln(a1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (long)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (long)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], -103.);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], -1.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_unaln(a1, b1, (long)123, 103.);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (long)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (long)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], -1.);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], 103.);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (long)i;
+        b1[i] = (double)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_cp_alndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (long)v);
+        errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (double)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+        b1[i+ALIGN_OFF] = -1.;
+      }
+      test_cp_alnsrc(a1, a1, b1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (long)-1);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], -1.);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (long)v);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (double)v);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (long)i;
+        b1[i] = (double)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_cp_unalndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (long)v);
+        errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (double)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+        b1[i+UNALIGN_OFF] = -1.;
+      }
+      test_cp_unalnsrc(a1, a1, b1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (long)-1);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], -1.);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (long)v);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (double)v);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, b2, (long)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a1, b1, (long)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a1, b1, (long)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_aln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_aln(a1, b1, (long)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_unaln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_unaln(a1, b1, (long)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    return errn;
+  }
+
+  static void test_ci(long[] a, double[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi(long[] a, double[] b, long c, double d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp(long[] a, long[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_neg(long[] a, double[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_neg(long[] a, double[] b, long c, double d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp_neg(long[] a, long[] b, double[] c, double[] d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_oppos(long[] a, double[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_oppos(long[] a, double[] b, long c, double d) {
+    int limit = a.length-1;
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_cp_oppos(long[] a, long[] b, double[] c, double[] d) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+      c[limit-i] = d[i];
+    }
+  }
+  static void test_ci_aln(long[] a, double[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_aln(long[] a, double[] b, long c, double d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_alndst(long[] a, long[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+      c[i+ALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_alnsrc(long[] a, long[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+      c[i] = d[i+ALIGN_OFF];
+    }
+  }
+  static void test_ci_unaln(long[] a, double[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_unaln(long[] a, double[] b, long c, double d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(long[] a, long[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+      c[i+UNALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_unalnsrc(long[] a, long[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+      c[i] = d[i+UNALIGN_OFF];
+    }
+  }
+
+  static int verify(String text, int i, long elem, long val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+  static int verify(String text, int i, double elem, double val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestLongFloatVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestLongFloatVect
+ */
+
+public class TestLongFloatVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Long + Float vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    long[] a1 = new long[ARRLEN];
+    long[] a2 = new long[ARRLEN];
+    float[] b1 = new float[ARRLEN];
+    float[] b2 = new float[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+      test_vi(a2, b2, (long)123, 103.f);
+      test_cp(a1, a2, b1, b2);
+      test_ci_neg(a1, b1);
+      test_vi_neg(a1, b1, (long)123, 103.f);
+      test_cp_neg(a1, a2, b1, b2);
+      test_ci_oppos(a1, b1);
+      test_vi_oppos(a1, b1, (long)123, 103.f);
+      test_cp_oppos(a1, a2, b1, b2);
+      test_ci_aln(a1, b1);
+      test_vi_aln(a1, b1, (long)123, 103.f);
+      test_cp_alndst(a1, a2, b1, b2);
+      test_cp_alnsrc(a1, a2, b1, b2);
+      test_ci_unaln(a1, b1);
+      test_vi_unaln(a1, b1, (long)123, 103.f);
+      test_cp_unalndst(a1, a2, b1, b2);
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+      b1[i] = -1.f;
+      b2[i] = -1.f;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (long)-123);
+        errn += verify("test_ci: b1", i, b1[i], -103.f);
+      }
+      test_vi(a2, b2, (long)123, 103.f);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (long)123);
+        errn += verify("test_vi: b2", i, b2[i], 103.f);
+      }
+      test_cp(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (long)123);
+        errn += verify("test_cp: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1.f;
+        b2[i] = -1.f;
+      }
+      test_ci_neg(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (long)-123);
+        errn += verify("test_ci_neg: b1", i, b1[i], -103.f);
+      }
+      test_vi_neg(a2, b2, (long)123, 103.f);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (long)123);
+        errn += verify("test_vi_neg: b2", i, b2[i], 103.f);
+      }
+      test_cp_neg(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (long)123);
+        errn += verify("test_cp_neg: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1.f;
+        b2[i] = -1.f;
+      }
+      test_ci_oppos(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (long)-123);
+        errn += verify("test_ci_oppos: b1", i, b1[i], -103.f);
+      }
+      test_vi_oppos(a2, b2, (long)123, 103.f);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (long)123);
+        errn += verify("test_vi_oppos: b2", i, b2[i], 103.f);
+      }
+      test_cp_oppos(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (long)123);
+        errn += verify("test_cp_oppos: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1.f;
+        b2[i] = 123.f;
+      }
+      test_cp_alndst(a1, a2, b1, b2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (long)-1);
+        errn += verify("test_cp_alndst: b1", i, b1[i], -1.f);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (long)123);
+        errn += verify("test_cp_alndst: b1", i, b1[i], 123.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123.f;
+      }
+      test_cp_alnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (long)-123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], -123.f);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (long)123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], 123.f);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.f;
+      }
+      test_ci_aln(a1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (long)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (long)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], -103.f);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], -1.f);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.f;
+      }
+      test_vi_aln(a1, b1, (long)123, 103.f);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (long)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (long)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], -1.f);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1.f;
+        b2[i] = 123.f;
+      }
+      test_cp_unalndst(a1, a2, b1, b2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (long)-1);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], -1.f);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (long)123);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], 123.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123.f;
+      }
+      test_cp_unalnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (long)-123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], -123.f);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (long)123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], 123.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_unaln(a1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (long)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (long)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], -103.f);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], -1.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_unaln(a1, b1, (long)123, 103.f);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (long)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (long)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], -1.f);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (long)i;
+        b1[i] = (float)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.f;
+      }
+      test_cp_alndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (long)v);
+        errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (float)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+        b1[i+ALIGN_OFF] = -1.f;
+      }
+      test_cp_alnsrc(a1, a1, b1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (long)-1);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], -1.f);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (long)v);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (float)v);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (long)i;
+        b1[i] = (float)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.f;
+      }
+      test_cp_unalndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (long)v);
+        errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (float)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+        b1[i+UNALIGN_OFF] = -1.f;
+      }
+      test_cp_unalnsrc(a1, a1, b1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (long)-1);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], -1.f);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (long)v);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (float)v);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, b2, (long)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a1, b1, (long)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a1, b1, (long)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_aln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_aln(a1, b1, (long)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_unaln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_unaln(a1, b1, (long)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    return errn;
+  }
+
+  static void test_ci(long[] a, float[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi(long[] a, float[] b, long c, float d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp(long[] a, long[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_neg(long[] a, float[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi_neg(long[] a, float[] b, long c, float d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp_neg(long[] a, long[] b, float[] c, float[] d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_oppos(long[] a, float[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi_oppos(long[] a, float[] b, long c, float d) {
+    int limit = a.length-1;
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_cp_oppos(long[] a, long[] b, float[] c, float[] d) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+      c[limit-i] = d[i];
+    }
+  }
+  static void test_ci_aln(long[] a, float[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi_aln(long[] a, float[] b, long c, float d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_alndst(long[] a, long[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+      c[i+ALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_alnsrc(long[] a, long[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+      c[i] = d[i+ALIGN_OFF];
+    }
+  }
+  static void test_ci_unaln(long[] a, float[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi_unaln(long[] a, float[] b, long c, float d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(long[] a, long[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+      c[i+UNALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_unalnsrc(long[] a, long[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+      c[i] = d[i+UNALIGN_OFF];
+    }
+  }
+
+  static int verify(String text, int i, long elem, long val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+  static int verify(String text, int i, float elem, float val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestLongVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,953 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestLongVect
+ */
+
+public class TestLongVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Long vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    long[] a1 = new long[ARRLEN];
+    long[] a2 = new long[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1);
+      test_vi(a2, (long)123);
+      test_cp(a1, a2);
+      test_2ci(a1, a2);
+      test_2vi(a1, a2, (long)123, (long)103);
+      test_ci_neg(a1);
+      test_vi_neg(a2, (long)123);
+      test_cp_neg(a1, a2);
+      test_2ci_neg(a1, a2);
+      test_2vi_neg(a1, a2, (long)123, (long)103);
+      test_ci_oppos(a1);
+      test_vi_oppos(a2, (long)123);
+      test_cp_oppos(a1, a2);
+      test_2ci_oppos(a1, a2);
+      test_2vi_oppos(a1, a2, (long)123, (long)103);
+      test_ci_off(a1);
+      test_vi_off(a2, (long)123);
+      test_cp_off(a1, a2);
+      test_2ci_off(a1, a2);
+      test_2vi_off(a1, a2, (long)123, (long)103);
+      test_ci_inv(a1, OFFSET);
+      test_vi_inv(a2, (long)123, OFFSET);
+      test_cp_inv(a1, a2, OFFSET);
+      test_2ci_inv(a1, a2, OFFSET);
+      test_2vi_inv(a1, a2, (long)123, (long)103, OFFSET);
+      test_ci_scl(a1);
+      test_vi_scl(a2, (long)123);
+      test_cp_scl(a1, a2);
+      test_2ci_scl(a1, a2);
+      test_2vi_scl(a1, a2, (long)123, (long)103);
+      test_cp_alndst(a1, a2);
+      test_cp_alnsrc(a1, a2);
+      test_2ci_aln(a1, a2);
+      test_2vi_aln(a1, a2, (long)123, (long)103);
+      test_cp_unalndst(a1, a2);
+      test_cp_unalnsrc(a1, a2);
+      test_2ci_unaln(a1, a2);
+      test_2vi_unaln(a1, a2, (long)123, (long)103);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (long)-123);
+      }
+      test_vi(a2, (long)123);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (long)123);
+      }
+      test_cp(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (long)123);
+      }
+      test_2ci(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci: a1", i, a1[i], (long)-123);
+        errn += verify("test_2ci: a2", i, a2[i], (long)-103);
+      }
+      test_2vi(a1, a2, (long)123, (long)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi: a1", i, a1[i], (long)123);
+        errn += verify("test_2vi: a2", i, a2[i], (long)103);
+      }
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_neg(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (long)-123);
+      }
+      test_vi_neg(a2, (long)123);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (long)123);
+      }
+      test_cp_neg(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (long)123);
+      }
+      test_2ci_neg(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci_neg: a1", i, a1[i], (long)-123);
+        errn += verify("test_2ci_neg: a2", i, a2[i], (long)-103);
+      }
+      test_2vi_neg(a1, a2, (long)123, (long)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi_neg: a1", i, a1[i], (long)123);
+        errn += verify("test_2vi_neg: a2", i, a2[i], (long)103);
+      }
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_oppos(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (long)-123);
+      }
+      test_vi_oppos(a2, (long)123);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (long)123);
+      }
+      test_cp_oppos(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (long)123);
+      }
+      test_2ci_oppos(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci_oppos: a1", i, a1[i], (long)-123);
+        errn += verify("test_2ci_oppos: a2", i, a2[i], (long)-103);
+      }
+      test_2vi_oppos(a1, a2, (long)123, (long)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi_oppos: a1", i, a1[i], (long)123);
+        errn += verify("test_2vi_oppos: a2", i, a2[i], (long)103);
+      }
+      // Reset for indexing with offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_off(a1);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_ci_off: a1", i, a1[i], (long)-123);
+      }
+      test_vi_off(a2, (long)123);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_vi_off: a2", i, a2[i], (long)123);
+      }
+      test_cp_off(a1, a2);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_cp_off: a1", i, a1[i], (long)123);
+      }
+      test_2ci_off(a1, a2);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2ci_off: a1", i, a1[i], (long)-123);
+        errn += verify("test_2ci_off: a2", i, a2[i], (long)-103);
+      }
+      test_2vi_off(a1, a2, (long)123, (long)103);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2vi_off: a1", i, a1[i], (long)123);
+        errn += verify("test_2vi_off: a2", i, a2[i], (long)103);
+      }
+      for (int i=0; i<OFFSET; i++) {
+        errn += verify("test_2vi_off: a1", i, a1[i], (long)-1);
+        errn += verify("test_2vi_off: a2", i, a2[i], (long)-1);
+      }
+      // Reset for indexing with invariant offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_inv(a1, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_ci_inv: a1", i, a1[i], (long)-123);
+      }
+      test_vi_inv(a2, (long)123, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_vi_inv: a2", i, a2[i], (long)123);
+      }
+      test_cp_inv(a1, a2, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_cp_inv: a1", i, a1[i], (long)123);
+      }
+      test_2ci_inv(a1, a2, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2ci_inv: a1", i, a1[i], (long)-123);
+        errn += verify("test_2ci_inv: a2", i, a2[i], (long)-103);
+      }
+      test_2vi_inv(a1, a2, (long)123, (long)103, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2vi_inv: a1", i, a1[i], (long)123);
+        errn += verify("test_2vi_inv: a2", i, a2[i], (long)103);
+      }
+      for (int i=0; i<OFFSET; i++) {
+        errn += verify("test_2vi_inv: a1", i, a1[i], (long)-1);
+        errn += verify("test_2vi_inv: a2", i, a2[i], (long)-1);
+      }
+      // Reset for indexing with scale
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_scl(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : -123;
+        errn += verify("test_ci_scl: a1", i, a1[i], (long)val);
+      }
+      test_vi_scl(a2, (long)123);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : 123;
+        errn += verify("test_vi_scl: a2", i, a2[i], (long)val);
+      }
+      test_cp_scl(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : 123;
+        errn += verify("test_cp_scl: a1", i, a1[i], (long)val);
+      }
+      test_2ci_scl(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        if (i%SCALE != 0) {
+          errn += verify("test_2ci_scl: a1", i, a1[i], (long)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2ci_scl: a1", i*SCALE, a1[i*SCALE], (long)-123);
+        }
+        if (i%SCALE != 0) {
+          errn += verify("test_2ci_scl: a2", i, a2[i], (long)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2ci_scl: a2", i*SCALE, a2[i*SCALE], (long)-103);
+        }
+      }
+      test_2vi_scl(a1, a2, (long)123, (long)103);
+      for (int i=0; i<ARRLEN; i++) {
+        if (i%SCALE != 0) {
+          errn += verify("test_2vi_scl: a1", i, a1[i], (long)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2vi_scl: a1", i*SCALE, a1[i*SCALE], (long)123);
+        }
+        if (i%SCALE != 0) {
+          errn += verify("test_2vi_scl: a2", i, a2[i], (long)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2vi_scl: a2", i*SCALE, a2[i*SCALE], (long)103);
+        }
+      }
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_vi(a2, (long)123);
+      test_cp_alndst(a1, a2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (long)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (long)123);
+      }
+      test_vi(a2, (long)-123);
+      test_cp_alnsrc(a1, a2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (long)-123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (long)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2ci_aln(a1, a2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln: a1", i, a1[i], (long)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln: a1", i, a1[i], (long)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln: a2", i, a2[i], (long)-103);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln: a2", i, a2[i], (long)-1);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2vi_aln(a1, a2, (long)123, (long)103);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln: a1", i, a1[i], (long)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln: a1", i, a1[i], (long)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln: a2", i, a2[i], (long)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln: a2", i, a2[i], (long)103);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_vi(a2, (long)123);
+      test_cp_unalndst(a1, a2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (long)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (long)123);
+      }
+      test_vi(a2, (long)-123);
+      test_cp_unalnsrc(a1, a2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (long)-123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (long)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2ci_unaln(a1, a2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln: a1", i, a1[i], (long)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln: a1", i, a1[i], (long)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln: a2", i, a2[i], (long)-103);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln: a2", i, a2[i], (long)-1);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2vi_unaln(a1, a2, (long)123, (long)103);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln: a1", i, a1[i], (long)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln: a1", i, a1[i], (long)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln: a2", i, a2[i], (long)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln: a2", i, a2[i], (long)103);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (long)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_cp_alndst(a1, a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (long)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+      }
+      test_cp_alnsrc(a1, a1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (long)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (long)v);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2ci_aln(a1, a1);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (long)-103);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (long)-123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2vi_aln(a1, a1, (long)123, (long)103);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (long)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (long)103);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (long)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_cp_unalndst(a1, a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (long)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+      }
+      test_cp_unalnsrc(a1, a1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (long)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (long)v);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2ci_unaln(a1, a1);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (long)-103);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (long)-123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2vi_unaln(a1, a1, (long)123, (long)103);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (long)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (long)103);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, (long)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi(a1, a2, (long)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a2, (long)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_neg(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_neg(a1, a2, (long)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_neg: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a2, (long)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_oppos(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_oppos(a1, a2, (long)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_oppos: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_off(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_off(a2, (long)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_off(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_off(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_off(a1, a2, (long)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_off: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_inv(a1, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_inv(a2, (long)123, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_inv(a1, a2, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_inv(a1, a2, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_inv(a1, a2, (long)123, (long)103, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_inv: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_scl(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_scl(a2, (long)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_scl(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_scl(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_scl(a1, a2, (long)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_scl: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_aln(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_aln(a1, a2, (long)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_aln: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_unaln(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_unaln(a1, a2, (long)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_unaln: " + (end - start));
+
+    return errn;
+  }
+
+  static void test_ci(long[] a) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+    }
+  }
+  static void test_vi(long[] a, long b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b;
+    }
+  }
+  static void test_cp(long[] a, long[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+    }
+  }
+  static void test_2ci(long[] a, long[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi(long[] a, long[] b, long c, long d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_ci_neg(long[] a) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+    }
+  }
+  static void test_vi_neg(long[] a, long b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b;
+    }
+  }
+  static void test_cp_neg(long[] a, long[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+    }
+  }
+  static void test_2ci_neg(long[] a, long[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi_neg(long[] a, long[] b, long c, long d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_ci_oppos(long[] a) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+    }
+  }
+  static void test_vi_oppos(long[] a, long b) {
+    int limit = a.length-1;
+    for (int i = limit; i >= 0; i-=1) {
+      a[limit-i] = b;
+    }
+  }
+  static void test_cp_oppos(long[] a, long[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+    }
+  }
+  static void test_2ci_oppos(long[] a, long[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi_oppos(long[] a, long[] b, long c, long d) {
+    int limit = a.length-1;
+    for (int i = limit; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_ci_off(long[] a) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = -123;
+    }
+  }
+  static void test_vi_off(long[] a, long b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = b;
+    }
+  }
+  static void test_cp_off(long[] a, long[] b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = b[i+OFFSET];
+    }
+  }
+  static void test_2ci_off(long[] a, long[] b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = -123;
+      b[i+OFFSET] = -103;
+    }
+  }
+  static void test_2vi_off(long[] a, long[] b, long c, long d) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = c;
+      b[i+OFFSET] = d;
+    }
+  }
+  static void test_ci_inv(long[] a, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = -123;
+    }
+  }
+  static void test_vi_inv(long[] a, long b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = b;
+    }
+  }
+  static void test_cp_inv(long[] a, long[] b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = b[i+k];
+    }
+  }
+  static void test_2ci_inv(long[] a, long[] b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = -123;
+      b[i+k] = -103;
+    }
+  }
+  static void test_2vi_inv(long[] a, long[] b, long c, long d, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = c;
+      b[i+k] = d;
+    }
+  }
+  static void test_ci_scl(long[] a) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = -123;
+    }
+  }
+  static void test_vi_scl(long[] a, long b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = b;
+    }
+  }
+  static void test_cp_scl(long[] a, long[] b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = b[i*SCALE];
+    }
+  }
+  static void test_2ci_scl(long[] a, long[] b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = -123;
+      b[i*SCALE] = -103;
+    }
+  }
+  static void test_2vi_scl(long[] a, long[] b, long c, long d) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = c;
+      b[i*SCALE] = d;
+    }
+  }
+  static void test_cp_alndst(long[] a, long[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+    }
+  }
+  static void test_cp_alnsrc(long[] a, long[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+    }
+  }
+  static void test_2ci_aln(long[] a, long[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi_aln(long[] a, long[] b, long c, long d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(long[] a, long[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+    }
+  }
+  static void test_cp_unalnsrc(long[] a, long[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+    }
+  }
+  static void test_2ci_unaln(long[] a, long[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi_unaln(long[] a, long[] b, long c, long d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+
+  static int verify(String text, int i, long elem, long val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestShortDoubleVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestShortDoubleVect
+ */
+
+public class TestShortDoubleVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Short + Double vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    short[] a1 = new short[ARRLEN];
+    short[] a2 = new short[ARRLEN];
+    double[] b1 = new double[ARRLEN];
+    double[] b2 = new double[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+      test_vi(a2, b2, (short)123, 103.);
+      test_cp(a1, a2, b1, b2);
+      test_ci_neg(a1, b1);
+      test_vi_neg(a1, b1, (short)123, 103.);
+      test_cp_neg(a1, a2, b1, b2);
+      test_ci_oppos(a1, b1);
+      test_vi_oppos(a1, b1, (short)123, 103.);
+      test_cp_oppos(a1, a2, b1, b2);
+      test_ci_aln(a1, b1);
+      test_vi_aln(a1, b1, (short)123, 103.);
+      test_cp_alndst(a1, a2, b1, b2);
+      test_cp_alnsrc(a1, a2, b1, b2);
+      test_ci_unaln(a1, b1);
+      test_vi_unaln(a1, b1, (short)123, 103.);
+      test_cp_unalndst(a1, a2, b1, b2);
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+      b1[i] = -1.;
+      b2[i] = -1.;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (short)-123);
+        errn += verify("test_ci: b1", i, b1[i], -103.);
+      }
+      test_vi(a2, b2, (short)123, 103.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (short)123);
+        errn += verify("test_vi: b2", i, b2[i], 103.);
+      }
+      test_cp(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (short)123);
+        errn += verify("test_cp: b1", i, b1[i], 103.);
+      }
+
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1.;
+        b2[i] = -1.;
+      }
+      test_ci_neg(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (short)-123);
+        errn += verify("test_ci_neg: b1", i, b1[i], -103.);
+      }
+      test_vi_neg(a2, b2, (short)123, 103.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (short)123);
+        errn += verify("test_vi_neg: b2", i, b2[i], 103.);
+      }
+      test_cp_neg(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_neg: b1", i, b1[i], 103.);
+      }
+
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1.;
+        b2[i] = -1.;
+      }
+      test_ci_oppos(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (short)-123);
+        errn += verify("test_ci_oppos: b1", i, b1[i], -103.);
+      }
+      test_vi_oppos(a2, b2, (short)123, 103.);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (short)123);
+        errn += verify("test_vi_oppos: b2", i, b2[i], 103.);
+      }
+      test_cp_oppos(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_oppos: b1", i, b1[i], 103.);
+      }
+
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1.;
+        b2[i] = 123.;
+      }
+      test_cp_alndst(a1, a2, b1, b2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (short)-1);
+        errn += verify("test_cp_alndst: b1", i, b1[i], -1.);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_alndst: b1", i, b1[i], 123.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123.;
+      }
+      test_cp_alnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)-123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], -123.);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], 123.);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_ci_aln(a1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (short)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], -103.);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], -1.);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_vi_aln(a1, b1, (short)123, 103.);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (short)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], -1.);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], 103.);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1.;
+        b2[i] = 123.;
+      }
+      test_cp_unalndst(a1, a2, b1, b2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (short)-1);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], -1.);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], 123.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123.;
+      }
+      test_cp_unalnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)-123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], -123.);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], 123.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_unaln(a1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (short)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], -103.);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], -1.);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_unaln(a1, b1, (short)123, 103.);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (short)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], -1.);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], 103.);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (short)i;
+        b1[i] = (double)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_cp_alndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (short)v);
+        errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (double)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+        b1[i+ALIGN_OFF] = -1.;
+      }
+      test_cp_alnsrc(a1, a1, b1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)-1);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], -1.);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)v);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (double)v);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (short)i;
+        b1[i] = (double)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.;
+      }
+      test_cp_unalndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (short)v);
+        errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (double)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+        b1[i+UNALIGN_OFF] = -1.;
+      }
+      test_cp_unalnsrc(a1, a1, b1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)-1);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], -1.);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)v);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (double)v);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, b2, (short)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a1, b1, (short)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a1, b1, (short)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_aln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_aln(a1, b1, (short)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_unaln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_unaln(a1, b1, (short)123, 103.);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    return errn;
+  }
+
+  static void test_ci(short[] a, double[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi(short[] a, double[] b, short c, double d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp(short[] a, short[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_neg(short[] a, double[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_neg(short[] a, double[] b, short c, double d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp_neg(short[] a, short[] b, double[] c, double[] d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_oppos(short[] a, double[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_oppos(short[] a, double[] b, short c, double d) {
+    int limit = a.length-1;
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_cp_oppos(short[] a, short[] b, double[] c, double[] d) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+      c[limit-i] = d[i];
+    }
+  }
+  static void test_ci_aln(short[] a, double[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_aln(short[] a, double[] b, short c, double d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_alndst(short[] a, short[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+      c[i+ALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_alnsrc(short[] a, short[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+      c[i] = d[i+ALIGN_OFF];
+    }
+  }
+  static void test_ci_unaln(short[] a, double[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123;
+      b[i] = -103.;
+    }
+  }
+  static void test_vi_unaln(short[] a, double[] b, short c, double d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(short[] a, short[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+      c[i+UNALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_unalnsrc(short[] a, short[] b, double[] c, double[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+      c[i] = d[i+UNALIGN_OFF];
+    }
+  }
+
+  static int verify(String text, int i, short elem, short val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+  static int verify(String text, int i, double elem, double val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestShortFloatVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestShortFloatVect
+ */
+
+public class TestShortFloatVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Short + Float vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    short[] a1 = new short[ARRLEN];
+    short[] a2 = new short[ARRLEN];
+    float[] b1 = new float[ARRLEN];
+    float[] b2 = new float[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+      test_vi(a2, b2, (short)123, 103.f);
+      test_cp(a1, a2, b1, b2);
+      test_ci_neg(a1, b1);
+      test_vi_neg(a1, b1, (short)123, 103.f);
+      test_cp_neg(a1, a2, b1, b2);
+      test_ci_oppos(a1, b1);
+      test_vi_oppos(a1, b1, (short)123, 103.f);
+      test_cp_oppos(a1, a2, b1, b2);
+      test_ci_aln(a1, b1);
+      test_vi_aln(a1, b1, (short)123, 103.f);
+      test_cp_alndst(a1, a2, b1, b2);
+      test_cp_alnsrc(a1, a2, b1, b2);
+      test_ci_unaln(a1, b1);
+      test_vi_unaln(a1, b1, (short)123, 103.f);
+      test_cp_unalndst(a1, a2, b1, b2);
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+      b1[i] = -1.f;
+      b2[i] = -1.f;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (short)-123);
+        errn += verify("test_ci: b1", i, b1[i], -103.f);
+      }
+      test_vi(a2, b2, (short)123, 103.f);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (short)123);
+        errn += verify("test_vi: b2", i, b2[i], 103.f);
+      }
+      test_cp(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (short)123);
+        errn += verify("test_cp: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1.f;
+        b2[i] = -1.f;
+      }
+      test_ci_neg(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (short)-123);
+        errn += verify("test_ci_neg: b1", i, b1[i], -103.f);
+      }
+      test_vi_neg(a2, b2, (short)123, 103.f);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (short)123);
+        errn += verify("test_vi_neg: b2", i, b2[i], 103.f);
+      }
+      test_cp_neg(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_neg: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1.f;
+        b2[i] = -1.f;
+      }
+      test_ci_oppos(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (short)-123);
+        errn += verify("test_ci_oppos: b1", i, b1[i], -103.f);
+      }
+      test_vi_oppos(a2, b2, (short)123, 103.f);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (short)123);
+        errn += verify("test_vi_oppos: b2", i, b2[i], 103.f);
+      }
+      test_cp_oppos(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_oppos: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1.f;
+        b2[i] = 123.f;
+      }
+      test_cp_alndst(a1, a2, b1, b2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (short)-1);
+        errn += verify("test_cp_alndst: b1", i, b1[i], -1.f);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_alndst: b1", i, b1[i], 123.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123.f;
+      }
+      test_cp_alnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)-123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], -123.f);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], 123.f);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.f;
+      }
+      test_ci_aln(a1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (short)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], -103.f);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], -1.f);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.f;
+      }
+      test_vi_aln(a1, b1, (short)123, 103.f);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (short)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], -1.f);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1.f;
+        b2[i] = 123.f;
+      }
+      test_cp_unalndst(a1, a2, b1, b2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (short)-1);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], -1.f);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], 123.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123.f;
+      }
+      test_cp_unalnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)-123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], -123.f);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], 123.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_unaln(a1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (short)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], -103.f);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], -1.f);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_unaln(a1, b1, (short)123, 103.f);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (short)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], -1.f);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], 103.f);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (short)i;
+        b1[i] = (float)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.f;
+      }
+      test_cp_alndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (short)v);
+        errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (float)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+        b1[i+ALIGN_OFF] = -1.f;
+      }
+      test_cp_alnsrc(a1, a1, b1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)-1);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], -1.f);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)v);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (float)v);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (short)i;
+        b1[i] = (float)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1.f;
+      }
+      test_cp_unalndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (short)v);
+        errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (float)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+        b1[i+UNALIGN_OFF] = -1.f;
+      }
+      test_cp_unalnsrc(a1, a1, b1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)-1);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], -1.f);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)v);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (float)v);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, b2, (short)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a1, b1, (short)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a1, b1, (short)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_aln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_aln(a1, b1, (short)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_unaln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_unaln(a1, b1, (short)123, 103.f);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    return errn;
+  }
+
+  static void test_ci(short[] a, float[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi(short[] a, float[] b, short c, float d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp(short[] a, short[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_neg(short[] a, float[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi_neg(short[] a, float[] b, short c, float d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp_neg(short[] a, short[] b, float[] c, float[] d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_oppos(short[] a, float[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi_oppos(short[] a, float[] b, short c, float d) {
+    int limit = a.length-1;
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_cp_oppos(short[] a, short[] b, float[] c, float[] d) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+      c[limit-i] = d[i];
+    }
+  }
+  static void test_ci_aln(short[] a, float[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi_aln(short[] a, float[] b, short c, float d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_alndst(short[] a, short[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+      c[i+ALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_alnsrc(short[] a, short[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+      c[i] = d[i+ALIGN_OFF];
+    }
+  }
+  static void test_ci_unaln(short[] a, float[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123;
+      b[i] = -103.f;
+    }
+  }
+  static void test_vi_unaln(short[] a, float[] b, short c, float d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(short[] a, short[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+      c[i+UNALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_unalnsrc(short[] a, short[] b, float[] c, float[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+      c[i] = d[i+UNALIGN_OFF];
+    }
+  }
+
+  static int verify(String text, int i, short elem, short val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+  static int verify(String text, int i, float elem, float val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestShortIntVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestShortIntVect
+ */
+
+public class TestShortIntVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Short + Integer vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    short[] a1 = new short[ARRLEN];
+    short[] a2 = new short[ARRLEN];
+    int[] b1 = new int[ARRLEN];
+    int[] b2 = new int[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+      test_vi(a2, b2, (short)123, (int)103);
+      test_cp(a1, a2, b1, b2);
+      test_ci_neg(a1, b1);
+      test_vi_neg(a1, b1, (short)123, (int)103);
+      test_cp_neg(a1, a2, b1, b2);
+      test_ci_oppos(a1, b1);
+      test_vi_oppos(a1, b1, (short)123, (int)103);
+      test_cp_oppos(a1, a2, b1, b2);
+      test_ci_aln(a1, b1);
+      test_vi_aln(a1, b1, (short)123, (int)103);
+      test_cp_alndst(a1, a2, b1, b2);
+      test_cp_alnsrc(a1, a2, b1, b2);
+      test_ci_unaln(a1, b1);
+      test_vi_unaln(a1, b1, (short)123, (int)103);
+      test_cp_unalndst(a1, a2, b1, b2);
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+      b1[i] = -1;
+      b2[i] = -1;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (short)-123);
+        errn += verify("test_ci: b1", i, b1[i], (int)-103);
+      }
+      test_vi(a2, b2, (short)123, (int)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (short)123);
+        errn += verify("test_vi: b2", i, b2[i], (int)103);
+      }
+      test_cp(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (short)123);
+        errn += verify("test_cp: b1", i, b1[i], (int)103);
+      }
+
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1;
+        b2[i] = -1;
+      }
+      test_ci_neg(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (short)-123);
+        errn += verify("test_ci_neg: b1", i, b1[i], (int)-103);
+      }
+      test_vi_neg(a2, b2, (short)123, (int)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (short)123);
+        errn += verify("test_vi_neg: b2", i, b2[i], (int)103);
+      }
+      test_cp_neg(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_neg: b1", i, b1[i], (int)103);
+      }
+
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1;
+        b2[i] = -1;
+      }
+      test_ci_oppos(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (short)-123);
+        errn += verify("test_ci_oppos: b1", i, b1[i], (int)-103);
+      }
+      test_vi_oppos(a2, b2, (short)123, (int)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (short)123);
+        errn += verify("test_vi_oppos: b2", i, b2[i], (int)103);
+      }
+      test_cp_oppos(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_oppos: b1", i, b1[i], (int)103);
+      }
+
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1;
+        b2[i] = 123;
+      }
+      test_cp_alndst(a1, a2, b1, b2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (short)-1);
+        errn += verify("test_cp_alndst: b1", i, b1[i], (int)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_alndst: b1", i, b1[i], (int)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123;
+      }
+      test_cp_alnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)-123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], (int)-123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], (int)123);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_aln(a1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (short)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], (int)-103);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], (int)-1);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_aln(a1, b1, (short)123, (int)103);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (short)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], (int)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], (int)103);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1;
+        b2[i] = 123;
+      }
+      test_cp_unalndst(a1, a2, b1, b2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (short)-1);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], (int)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], (int)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123;
+      }
+      test_cp_unalnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)-123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], (int)-123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], (int)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_unaln(a1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (short)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], (int)-103);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], (int)-1);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_unaln(a1, b1, (short)123, (int)103);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (short)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], (int)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], (int)103);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (short)i;
+        b1[i] = (int)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_cp_alndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (short)v);
+        errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (int)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+        b1[i+ALIGN_OFF] = -1;
+      }
+      test_cp_alnsrc(a1, a1, b1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)-1);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (int)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)v);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (int)v);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (short)i;
+        b1[i] = (int)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_cp_unalndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (short)v);
+        errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (int)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+        b1[i+UNALIGN_OFF] = -1;
+      }
+      test_cp_unalnsrc(a1, a1, b1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)-1);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (int)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)v);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (int)v);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, b2, (short)123, (int)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a1, b1, (short)123, (int)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a1, b1, (short)123, (int)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_aln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_aln(a1, b1, (short)123, (int)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_unaln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_unaln(a1, b1, (short)123, (int)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    return errn;
+  }
+
+  static void test_ci(short[] a, int[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi(short[] a, int[] b, short c, int d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp(short[] a, short[] b, int[] c, int[] d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_neg(short[] a, int[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_neg(short[] a, int[] b, short c, int d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp_neg(short[] a, short[] b, int[] c, int[] d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_oppos(short[] a, int[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_oppos(short[] a, int[] b, short c, int d) {
+    int limit = a.length-1;
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_cp_oppos(short[] a, short[] b, int[] c, int[] d) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+      c[limit-i] = d[i];
+    }
+  }
+  static void test_ci_aln(short[] a, int[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_aln(short[] a, int[] b, short c, int d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_alndst(short[] a, short[] b, int[] c, int[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+      c[i+ALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_alnsrc(short[] a, short[] b, int[] c, int[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+      c[i] = d[i+ALIGN_OFF];
+    }
+  }
+  static void test_ci_unaln(short[] a, int[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_unaln(short[] a, int[] b, short c, int d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(short[] a, short[] b, int[] c, int[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+      c[i+UNALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_unalnsrc(short[] a, short[] b, int[] c, int[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+      c[i] = d[i+UNALIGN_OFF];
+    }
+  }
+
+  static int verify(String text, int i, short elem, short val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+  static int verify(String text, int i, int elem, int val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestShortLongVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestShortLongVect
+ */
+
+public class TestShortLongVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Short + Long vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    short[] a1 = new short[ARRLEN];
+    short[] a2 = new short[ARRLEN];
+    long[] b1 = new long[ARRLEN];
+    long[] b2 = new long[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+      test_vi(a2, b2, (short)123, (long)103);
+      test_cp(a1, a2, b1, b2);
+      test_ci_neg(a1, b1);
+      test_vi_neg(a1, b1, (short)123, (long)103);
+      test_cp_neg(a1, a2, b1, b2);
+      test_ci_oppos(a1, b1);
+      test_vi_oppos(a1, b1, (short)123, (long)103);
+      test_cp_oppos(a1, a2, b1, b2);
+      test_ci_aln(a1, b1);
+      test_vi_aln(a1, b1, (short)123, (long)103);
+      test_cp_alndst(a1, a2, b1, b2);
+      test_cp_alnsrc(a1, a2, b1, b2);
+      test_ci_unaln(a1, b1);
+      test_vi_unaln(a1, b1, (short)123, (long)103);
+      test_cp_unalndst(a1, a2, b1, b2);
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+      b1[i] = -1;
+      b2[i] = -1;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (short)-123);
+        errn += verify("test_ci: b1", i, b1[i], (long)-103);
+      }
+      test_vi(a2, b2, (short)123, (long)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (short)123);
+        errn += verify("test_vi: b2", i, b2[i], (long)103);
+      }
+      test_cp(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (short)123);
+        errn += verify("test_cp: b1", i, b1[i], (long)103);
+      }
+
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1;
+        b2[i] = -1;
+      }
+      test_ci_neg(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (short)-123);
+        errn += verify("test_ci_neg: b1", i, b1[i], (long)-103);
+      }
+      test_vi_neg(a2, b2, (short)123, (long)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (short)123);
+        errn += verify("test_vi_neg: b2", i, b2[i], (long)103);
+      }
+      test_cp_neg(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_neg: b1", i, b1[i], (long)103);
+      }
+
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+        b1[i] = -1;
+        b2[i] = -1;
+      }
+      test_ci_oppos(a1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (short)-123);
+        errn += verify("test_ci_oppos: b1", i, b1[i], (long)-103);
+      }
+      test_vi_oppos(a2, b2, (short)123, (long)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (short)123);
+        errn += verify("test_vi_oppos: b2", i, b2[i], (long)103);
+      }
+      test_cp_oppos(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_oppos: b1", i, b1[i], (long)103);
+      }
+
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1;
+        b2[i] = 123;
+      }
+      test_cp_alndst(a1, a2, b1, b2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (short)-1);
+        errn += verify("test_cp_alndst: b1", i, b1[i], (long)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_alndst: b1", i, b1[i], (long)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123;
+      }
+      test_cp_alnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)-123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], (long)-123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_alnsrc: b1", i, b1[i], (long)123);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_aln(a1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: a1", i, a1[i], (short)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], (long)-103);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_aln: b1", i, b1[i], (long)-1);
+      }
+
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_aln(a1, b1, (short)123, (long)103);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (short)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], (long)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_aln: b1", i, b1[i], (long)103);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = 123;
+        b1[i] = -1;
+        b2[i] = 123;
+      }
+      test_cp_unalndst(a1, a2, b1, b2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (short)-1);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], (long)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_unalndst: b1", i, b1[i], (long)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a2[i] = -123;
+        b2[i] = -123;
+      }
+      test_cp_unalnsrc(a1, a2, b1, b2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)-123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], (long)-123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)123);
+        errn += verify("test_cp_unalnsrc: b1", i, b1[i], (long)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_ci_unaln(a1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: a1", i, a1[i], (short)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], (long)-103);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_ci_unaln: b1", i, b1[i], (long)-1);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_vi_unaln(a1, b1, (short)123, (long)103);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (short)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], (long)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_vi_unaln: b1", i, b1[i], (long)103);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (short)i;
+        b1[i] = (long)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_cp_alndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (short)v);
+        errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (long)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+        b1[i+ALIGN_OFF] = -1;
+      }
+      test_cp_alnsrc(a1, a1, b1, b1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)-1);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (long)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)v);
+        errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (long)v);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (short)i;
+        b1[i] = (long)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+        b1[i] = -1;
+      }
+      test_cp_unalndst(a1, a1, b1, b1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (short)v);
+        errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (long)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+        b1[i+UNALIGN_OFF] = -1;
+      }
+      test_cp_unalnsrc(a1, a1, b1, b1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)-1);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (long)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)v);
+        errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (long)v);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, b2, (short)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a1, b1, (short)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a1, b1, (short)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_aln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_aln(a1, b1, (short)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_unaln(a1, b1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_unaln(a1, b1, (short)123, (long)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2, b1, b2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    return errn;
+  }
+
+  static void test_ci(short[] a, long[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi(short[] a, long[] b, short c, long d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp(short[] a, short[] b, long[] c, long[] d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_neg(short[] a, long[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_neg(short[] a, long[] b, short c, long d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_cp_neg(short[] a, short[] b, long[] c, long[] d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+      c[i] = d[i];
+    }
+  }
+  static void test_ci_oppos(short[] a, long[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_oppos(short[] a, long[] b, short c, long d) {
+    int limit = a.length-1;
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_cp_oppos(short[] a, short[] b, long[] c, long[] d) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+      c[limit-i] = d[i];
+    }
+  }
+  static void test_ci_aln(short[] a, long[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_aln(short[] a, long[] b, short c, long d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_alndst(short[] a, short[] b, long[] c, long[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+      c[i+ALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_alnsrc(short[] a, short[] b, long[] c, long[] d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+      c[i] = d[i+ALIGN_OFF];
+    }
+  }
+  static void test_ci_unaln(short[] a, long[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_vi_unaln(short[] a, long[] b, short c, long d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(short[] a, short[] b, long[] c, long[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+      c[i+UNALIGN_OFF] = d[i];
+    }
+  }
+  static void test_cp_unalnsrc(short[] a, short[] b, long[] c, long[] d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+      c[i] = d[i+UNALIGN_OFF];
+    }
+  }
+
+  static int verify(String text, int i, short elem, short val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+  static int verify(String text, int i, long elem, long val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7119644/TestShortVect.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,953 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestShortVect
+ */
+
+public class TestShortVect {
+  private static final int ARRLEN = 997;
+  private static final int ITERS  = 11000;
+  private static final int OFFSET = 3;
+  private static final int SCALE = 2;
+  private static final int ALIGN_OFF = 8;
+  private static final int UNALIGN_OFF = 5;
+
+  public static void main(String args[]) {
+    System.out.println("Testing Short vectors");
+    int errn = test();
+    if (errn > 0) {
+      System.err.println("FAILED: " + errn + " errors");
+      System.exit(97);
+    }
+    System.out.println("PASSED");
+  }
+
+  static int test() {
+    short[] a1 = new short[ARRLEN];
+    short[] a2 = new short[ARRLEN];
+    System.out.println("Warmup");
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1);
+      test_vi(a2, (short)123);
+      test_cp(a1, a2);
+      test_2ci(a1, a2);
+      test_2vi(a1, a2, (short)123, (short)103);
+      test_ci_neg(a1);
+      test_vi_neg(a2, (short)123);
+      test_cp_neg(a1, a2);
+      test_2ci_neg(a1, a2);
+      test_2vi_neg(a1, a2, (short)123, (short)103);
+      test_ci_oppos(a1);
+      test_vi_oppos(a2, (short)123);
+      test_cp_oppos(a1, a2);
+      test_2ci_oppos(a1, a2);
+      test_2vi_oppos(a1, a2, (short)123, (short)103);
+      test_ci_off(a1);
+      test_vi_off(a2, (short)123);
+      test_cp_off(a1, a2);
+      test_2ci_off(a1, a2);
+      test_2vi_off(a1, a2, (short)123, (short)103);
+      test_ci_inv(a1, OFFSET);
+      test_vi_inv(a2, (short)123, OFFSET);
+      test_cp_inv(a1, a2, OFFSET);
+      test_2ci_inv(a1, a2, OFFSET);
+      test_2vi_inv(a1, a2, (short)123, (short)103, OFFSET);
+      test_ci_scl(a1);
+      test_vi_scl(a2, (short)123);
+      test_cp_scl(a1, a2);
+      test_2ci_scl(a1, a2);
+      test_2vi_scl(a1, a2, (short)123, (short)103);
+      test_cp_alndst(a1, a2);
+      test_cp_alnsrc(a1, a2);
+      test_2ci_aln(a1, a2);
+      test_2vi_aln(a1, a2, (short)123, (short)103);
+      test_cp_unalndst(a1, a2);
+      test_cp_unalnsrc(a1, a2);
+      test_2ci_unaln(a1, a2);
+      test_2vi_unaln(a1, a2, (short)123, (short)103);
+    }
+    // Initialize
+    for (int i=0; i<ARRLEN; i++) {
+      a1[i] = -1;
+      a2[i] = -1;
+    }
+    // Test and verify results
+    System.out.println("Verification");
+    int errn = 0;
+    {
+      test_ci(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci: a1", i, a1[i], (short)-123);
+      }
+      test_vi(a2, (short)123);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi: a2", i, a2[i], (short)123);
+      }
+      test_cp(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp: a1", i, a1[i], (short)123);
+      }
+      test_2ci(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci: a1", i, a1[i], (short)-123);
+        errn += verify("test_2ci: a2", i, a2[i], (short)-103);
+      }
+      test_2vi(a1, a2, (short)123, (short)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi: a1", i, a1[i], (short)123);
+        errn += verify("test_2vi: a2", i, a2[i], (short)103);
+      }
+      // Reset for negative stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_neg(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_neg: a1", i, a1[i], (short)-123);
+      }
+      test_vi_neg(a2, (short)123);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_neg: a2", i, a2[i], (short)123);
+      }
+      test_cp_neg(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_neg: a1", i, a1[i], (short)123);
+      }
+      test_2ci_neg(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci_neg: a1", i, a1[i], (short)-123);
+        errn += verify("test_2ci_neg: a2", i, a2[i], (short)-103);
+      }
+      test_2vi_neg(a1, a2, (short)123, (short)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi_neg: a1", i, a1[i], (short)123);
+        errn += verify("test_2vi_neg: a2", i, a2[i], (short)103);
+      }
+      // Reset for opposite stride
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_oppos(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_ci_oppos: a1", i, a1[i], (short)-123);
+      }
+      test_vi_oppos(a2, (short)123);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_vi_oppos: a2", i, a2[i], (short)123);
+      }
+      test_cp_oppos(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_cp_oppos: a1", i, a1[i], (short)123);
+      }
+      test_2ci_oppos(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2ci_oppos: a1", i, a1[i], (short)-123);
+        errn += verify("test_2ci_oppos: a2", i, a2[i], (short)-103);
+      }
+      test_2vi_oppos(a1, a2, (short)123, (short)103);
+      for (int i=0; i<ARRLEN; i++) {
+        errn += verify("test_2vi_oppos: a1", i, a1[i], (short)123);
+        errn += verify("test_2vi_oppos: a2", i, a2[i], (short)103);
+      }
+      // Reset for indexing with offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_off(a1);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_ci_off: a1", i, a1[i], (short)-123);
+      }
+      test_vi_off(a2, (short)123);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_vi_off: a2", i, a2[i], (short)123);
+      }
+      test_cp_off(a1, a2);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_cp_off: a1", i, a1[i], (short)123);
+      }
+      test_2ci_off(a1, a2);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2ci_off: a1", i, a1[i], (short)-123);
+        errn += verify("test_2ci_off: a2", i, a2[i], (short)-103);
+      }
+      test_2vi_off(a1, a2, (short)123, (short)103);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2vi_off: a1", i, a1[i], (short)123);
+        errn += verify("test_2vi_off: a2", i, a2[i], (short)103);
+      }
+      for (int i=0; i<OFFSET; i++) {
+        errn += verify("test_2vi_off: a1", i, a1[i], (short)-1);
+        errn += verify("test_2vi_off: a2", i, a2[i], (short)-1);
+      }
+      // Reset for indexing with invariant offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_inv(a1, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_ci_inv: a1", i, a1[i], (short)-123);
+      }
+      test_vi_inv(a2, (short)123, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_vi_inv: a2", i, a2[i], (short)123);
+      }
+      test_cp_inv(a1, a2, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_cp_inv: a1", i, a1[i], (short)123);
+      }
+      test_2ci_inv(a1, a2, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2ci_inv: a1", i, a1[i], (short)-123);
+        errn += verify("test_2ci_inv: a2", i, a2[i], (short)-103);
+      }
+      test_2vi_inv(a1, a2, (short)123, (short)103, OFFSET);
+      for (int i=OFFSET; i<ARRLEN; i++) {
+        errn += verify("test_2vi_inv: a1", i, a1[i], (short)123);
+        errn += verify("test_2vi_inv: a2", i, a2[i], (short)103);
+      }
+      for (int i=0; i<OFFSET; i++) {
+        errn += verify("test_2vi_inv: a1", i, a1[i], (short)-1);
+        errn += verify("test_2vi_inv: a2", i, a2[i], (short)-1);
+      }
+      // Reset for indexing with scale
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_ci_scl(a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : -123;
+        errn += verify("test_ci_scl: a1", i, a1[i], (short)val);
+      }
+      test_vi_scl(a2, (short)123);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : 123;
+        errn += verify("test_vi_scl: a2", i, a2[i], (short)val);
+      }
+      test_cp_scl(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        int val = (i%SCALE != 0) ? -1 : 123;
+        errn += verify("test_cp_scl: a1", i, a1[i], (short)val);
+      }
+      test_2ci_scl(a1, a2);
+      for (int i=0; i<ARRLEN; i++) {
+        if (i%SCALE != 0) {
+          errn += verify("test_2ci_scl: a1", i, a1[i], (short)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2ci_scl: a1", i*SCALE, a1[i*SCALE], (short)-123);
+        }
+        if (i%SCALE != 0) {
+          errn += verify("test_2ci_scl: a2", i, a2[i], (short)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2ci_scl: a2", i*SCALE, a2[i*SCALE], (short)-103);
+        }
+      }
+      test_2vi_scl(a1, a2, (short)123, (short)103);
+      for (int i=0; i<ARRLEN; i++) {
+        if (i%SCALE != 0) {
+          errn += verify("test_2vi_scl: a1", i, a1[i], (short)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2vi_scl: a1", i*SCALE, a1[i*SCALE], (short)123);
+        }
+        if (i%SCALE != 0) {
+          errn += verify("test_2vi_scl: a2", i, a2[i], (short)-1);
+        } else if (i*SCALE < ARRLEN) {
+          errn += verify("test_2vi_scl: a2", i*SCALE, a2[i*SCALE], (short)103);
+        }
+      }
+      // Reset for 2 arrays with relative aligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_vi(a2, (short)123);
+      test_cp_alndst(a1, a2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (short)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alndst: a1", i, a1[i], (short)123);
+      }
+      test_vi(a2, (short)-123);
+      test_cp_alnsrc(a1, a2);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)-123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2ci_aln(a1, a2);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln: a1", i, a1[i], (short)-123);
+      }
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln: a2", i, a2[i], (short)-103);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln: a2", i, a2[i], (short)-1);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2vi_aln(a1, a2, (short)123, (short)103);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln: a1", i, a1[i], (short)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln: a2", i, a2[i], (short)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln: a2", i, a2[i], (short)103);
+      }
+
+      // Reset for 2 arrays with relative unaligned offset
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_vi(a2, (short)123);
+      test_cp_unalndst(a1, a2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (short)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalndst: a1", i, a1[i], (short)123);
+      }
+      test_vi(a2, (short)-123);
+      test_cp_unalnsrc(a1, a2);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)-123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2ci_unaln(a1, a2);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln: a1", i, a1[i], (short)-123);
+      }
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln: a2", i, a2[i], (short)-103);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln: a2", i, a2[i], (short)-1);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+        a2[i] = -1;
+      }
+      test_2vi_unaln(a1, a2, (short)123, (short)103);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln: a1", i, a1[i], (short)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln: a1", i, a1[i], (short)-1);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln: a2", i, a2[i], (short)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln: a2", i, a2[i], (short)103);
+      }
+
+      // Reset for aligned overlap initialization
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i] = (short)i;
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_cp_alndst(a1, a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (short)v);
+      }
+      for (int i=0; i<ALIGN_OFF; i++) {
+        a1[i+ALIGN_OFF] = -1;
+      }
+      test_cp_alnsrc(a1, a1);
+      for (int i=0; i<ALIGN_OFF; i++) {
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)-1);
+      }
+      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%ALIGN_OFF;
+        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)v);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2ci_aln(a1, a1);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (short)-103);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (short)-123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2vi_aln(a1, a1, (short)123, (short)103);
+      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+        errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (short)123);
+      }
+      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (short)103);
+      }
+
+      // Reset for unaligned overlap initialization
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i] = (short)i;
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_cp_unalndst(a1, a1);
+      for (int i=0; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (short)v);
+      }
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        a1[i+UNALIGN_OFF] = -1;
+      }
+      test_cp_unalnsrc(a1, a1);
+      for (int i=0; i<UNALIGN_OFF; i++) {
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)-1);
+      }
+      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+        int v = i%UNALIGN_OFF;
+        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)v);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2ci_unaln(a1, a1);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (short)-103);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (short)-123);
+      }
+      for (int i=0; i<ARRLEN; i++) {
+        a1[i] = -1;
+      }
+      test_2vi_unaln(a1, a1, (short)123, (short)103);
+      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+        errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (short)123);
+      }
+      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+        errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (short)103);
+      }
+
+    }
+
+    if (errn > 0)
+      return errn;
+
+    System.out.println("Time");
+    long start, end;
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi(a2, (short)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi(a1, a2, (short)123, (short)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_neg(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_neg(a2, (short)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_neg(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_neg(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_neg: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_neg(a1, a2, (short)123, (short)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_neg: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_oppos(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_oppos(a2, (short)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_oppos(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_oppos(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_oppos: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_oppos(a1, a2, (short)123, (short)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_oppos: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_off(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_off(a2, (short)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_off(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_off(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_off: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_off(a1, a2, (short)123, (short)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_off: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_inv(a1, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_inv(a2, (short)123, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_inv(a1, a2, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_inv(a1, a2, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_inv: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_inv(a1, a2, (short)123, (short)103, OFFSET);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_inv: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_ci_scl(a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_ci_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_vi_scl(a2, (short)123);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_vi_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_scl(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_scl(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_scl: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_scl(a1, a2, (short)123, (short)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_scl: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alndst(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_alnsrc(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_alnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_aln(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_aln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_aln(a1, a2, (short)123, (short)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_aln: " + (end - start));
+
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalndst(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalndst: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_cp_unalnsrc(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_cp_unalnsrc: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2ci_unaln(a1, a2);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2ci_unaln: " + (end - start));
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_2vi_unaln(a1, a2, (short)123, (short)103);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_2vi_unaln: " + (end - start));
+
+    return errn;
+  }
+
+  static void test_ci(short[] a) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+    }
+  }
+  static void test_vi(short[] a, short b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b;
+    }
+  }
+  static void test_cp(short[] a, short[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[i];
+    }
+  }
+  static void test_2ci(short[] a, short[] b) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi(short[] a, short[] b, short c, short d) {
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_ci_neg(short[] a) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+    }
+  }
+  static void test_vi_neg(short[] a, short b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b;
+    }
+  }
+  static void test_cp_neg(short[] a, short[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = b[i];
+    }
+  }
+  static void test_2ci_neg(short[] a, short[] b) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi_neg(short[] a, short[] b, short c, short d) {
+    for (int i = a.length-1; i >= 0; i-=1) {
+      a[i] = c;
+      b[i] = d;
+    }
+  }
+  static void test_ci_oppos(short[] a) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+    }
+  }
+  static void test_vi_oppos(short[] a, short b) {
+    int limit = a.length-1;
+    for (int i = limit; i >= 0; i-=1) {
+      a[limit-i] = b;
+    }
+  }
+  static void test_cp_oppos(short[] a, short[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[i] = b[limit-i];
+    }
+  }
+  static void test_2ci_oppos(short[] a, short[] b) {
+    int limit = a.length-1;
+    for (int i = 0; i < a.length; i+=1) {
+      a[limit-i] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi_oppos(short[] a, short[] b, short c, short d) {
+    int limit = a.length-1;
+    for (int i = limit; i >= 0; i-=1) {
+      a[i] = c;
+      b[limit-i] = d;
+    }
+  }
+  static void test_ci_off(short[] a) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = -123;
+    }
+  }
+  static void test_vi_off(short[] a, short b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = b;
+    }
+  }
+  static void test_cp_off(short[] a, short[] b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = b[i+OFFSET];
+    }
+  }
+  static void test_2ci_off(short[] a, short[] b) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = -123;
+      b[i+OFFSET] = -103;
+    }
+  }
+  static void test_2vi_off(short[] a, short[] b, short c, short d) {
+    for (int i = 0; i < a.length-OFFSET; i+=1) {
+      a[i+OFFSET] = c;
+      b[i+OFFSET] = d;
+    }
+  }
+  static void test_ci_inv(short[] a, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = -123;
+    }
+  }
+  static void test_vi_inv(short[] a, short b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = b;
+    }
+  }
+  static void test_cp_inv(short[] a, short[] b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = b[i+k];
+    }
+  }
+  static void test_2ci_inv(short[] a, short[] b, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = -123;
+      b[i+k] = -103;
+    }
+  }
+  static void test_2vi_inv(short[] a, short[] b, short c, short d, int k) {
+    for (int i = 0; i < a.length-k; i+=1) {
+      a[i+k] = c;
+      b[i+k] = d;
+    }
+  }
+  static void test_ci_scl(short[] a) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = -123;
+    }
+  }
+  static void test_vi_scl(short[] a, short b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = b;
+    }
+  }
+  static void test_cp_scl(short[] a, short[] b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = b[i*SCALE];
+    }
+  }
+  static void test_2ci_scl(short[] a, short[] b) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = -123;
+      b[i*SCALE] = -103;
+    }
+  }
+  static void test_2vi_scl(short[] a, short[] b, short c, short d) {
+    for (int i = 0; i*SCALE < a.length; i+=1) {
+      a[i*SCALE] = c;
+      b[i*SCALE] = d;
+    }
+  }
+  static void test_cp_alndst(short[] a, short[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = b[i];
+    }
+  }
+  static void test_cp_alnsrc(short[] a, short[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = b[i+ALIGN_OFF];
+    }
+  }
+  static void test_2ci_aln(short[] a, short[] b) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i+ALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi_aln(short[] a, short[] b, short c, short d) {
+    for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+ALIGN_OFF] = d;
+    }
+  }
+  static void test_cp_unalndst(short[] a, short[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = b[i];
+    }
+  }
+  static void test_cp_unalnsrc(short[] a, short[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = b[i+UNALIGN_OFF];
+    }
+  }
+  static void test_2ci_unaln(short[] a, short[] b) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i+UNALIGN_OFF] = -123;
+      b[i] = -103;
+    }
+  }
+  static void test_2vi_unaln(short[] a, short[] b, short c, short d) {
+    for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+      a[i] = c;
+      b[i+UNALIGN_OFF] = d;
+    }
+  }
+
+  static int verify(String text, int i, short elem, short val) {
+    if (elem != val) {
+      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+      return 1;
+    }
+    return 0;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7174363/Test7174363.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,49 @@
+/*
+ * 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 7174363
+ * @summary crash with Arrays.copyOfRange(original, from, to) when from > original.length
+ *
+ * @run main/othervm -XX:-BackgroundCompilation Test7174363
+ */
+
+import java.util.*;
+
+public class Test7174363 {
+
+  static Object[] m(Object[] original, int from, int to) {
+    return Arrays.copyOfRange(original, from, to, Object[].class);
+  }
+
+  static public void main(String[] args) {
+    Object[] orig = new Object[10];
+    for (int i = 0; i < 20000; i++) {
+      try {
+        m(orig, 15, 20);
+      } catch(ArrayIndexOutOfBoundsException excp) {}
+    }
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7177917/Test7177917.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,142 @@
+/*
+ * 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.
+ *
+ */
+
+/*
+ * Micro-benchmark for Math.pow() and Math.exp()
+ */
+
+import java.util.*;
+
+public class Test7177917 {
+
+  static double d;
+
+  static Random r = new Random(0);
+
+  static long  m_pow(double[][] values) {
+    double res = 0;
+    long start = System.nanoTime();
+    for (int i = 0; i < values.length; i++) {
+      res += Math.pow(values[i][0], values[i][1]);
+    }
+    long stop = System.nanoTime();
+    d = res;
+    return (stop - start) / 1000;
+  }
+
+  static long  m_exp(double[] values) {
+    double res = 0;
+    long start = System.nanoTime();
+    for (int i = 0; i < values.length; i++) {
+      res += Math.exp(values[i]);
+    }
+    long stop = System.nanoTime();
+    d = res;
+    return (stop - start) / 1000;
+  }
+
+  static double[][] pow_values(int nb) {
+    double[][] res = new double[nb][2];
+    for (int i = 0; i < nb; i++) {
+      double ylogx = (1 + (r.nextDouble() * 2045)) - 1023; // 2045 rather than 2046 as a safety margin
+      double x = Math.abs(Double.longBitsToDouble(r.nextLong()));
+      while (x != x) {
+        x = Math.abs(Double.longBitsToDouble(r.nextLong()));
+      }
+      double logx = Math.log(x) / Math.log(2);
+      double y = ylogx / logx;
+
+      res[i][0] = x;
+      res[i][1] = y;
+    }
+    return res;
+  }
+
+  static double[] exp_values(int nb) {
+    double[] res = new double[nb];
+    for (int i = 0; i < nb; i++) {
+      double ylogx = (1 + (r.nextDouble() * 2045)) - 1023; // 2045 rather than 2046 as a safety margin
+      double x = Math.E;
+      double logx = Math.log(x) / Math.log(2);
+      double y = ylogx / logx;
+      res[i] = y;
+    }
+    return res;
+  }
+
+  static public void main(String[] args) {
+    {
+      // warmup
+      double[][] warmup_values = pow_values(10);
+      m_pow(warmup_values);
+
+      for (int i = 0; i < 20000; i++) {
+        m_pow(warmup_values);
+      }
+      // test pow perf
+      double[][] values = pow_values(1000000);
+      System.out.println("==> POW " + m_pow(values));
+
+      // force uncommon trap
+      double[][] nan_values = new double[1][2];
+      nan_values[0][0] = Double.NaN;
+      nan_values[0][1] = Double.NaN;
+      m_pow(nan_values);
+
+      // force recompilation
+      for (int i = 0; i < 20000; i++) {
+        m_pow(warmup_values);
+      }
+
+      // test pow perf again
+      System.out.println("==> POW " + m_pow(values));
+    }
+    {
+      // warmup
+      double[] warmup_values = exp_values(10);
+      m_exp(warmup_values);
+
+      for (int i = 0; i < 20000; i++) {
+        m_exp(warmup_values);
+      }
+
+      // test pow perf
+      double[] values = exp_values(1000000);
+      System.out.println("==> EXP " + m_exp(values));
+
+      // force uncommon trap
+      double[] nan_values = new double[1];
+      nan_values[0] = Double.NaN;
+      m_exp(nan_values);
+
+      // force recompilation
+      for (int i = 0; i < 20000; i++) {
+        m_exp(warmup_values);
+      }
+
+      // test pow perf again
+      System.out.println("==> EXP " + m_exp(values));
+    }
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7179138/Test7179138_1.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012 Skip Balk.  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 7179138
+ * @summary Incorrect result with String concatenation optimization
+ * @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation Test7179138_1
+ *
+ * @author Skip Balk
+ */
+
+public class Test7179138_1 {
+    public static void main(String[] args) throws Exception {
+        System.out.println("Java Version: " + System.getProperty("java.vm.version"));
+        long[] durations = new long[60];
+        for (int i = 0; i < 100000; i++) {
+            // this empty for-loop is required to reproduce this bug
+            for (long duration : durations) {
+                // do nothing
+            }
+            {
+                String s = "test";
+                int len = s.length();
+
+                s = new StringBuilder(String.valueOf(s)).append(s).toString();
+                len = len + len;
+
+                s = new StringBuilder(String.valueOf(s)).append(s).toString();
+                len = len + len;
+
+                s = new StringBuilder(String.valueOf(s)).append(s).toString();
+                len = len + len;
+
+                if (s.length() != len) {
+                    System.out.println("Failed at iteration: " + i);
+                    System.out.println("Length mismatch: " + s.length() + " <> " + len);
+                    System.out.println("Expected: \"" + "test" + "test" + "test" + "test" + "test" + "test" + "test" + "test" + "\"");
+                    System.out.println("Actual:   \"" + s + "\"");
+                    System.exit(97);
+                }
+            }
+        }
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/7179138/Test7179138_2.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012 Skip Balk.  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 7179138
+ * @summary Incorrect result with String concatenation optimization
+ * @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation Test7179138_2
+ *
+ * @author Skip Balk
+ */
+
+public class Test7179138_2 {
+    public static void main(String[] args) throws Exception {
+        System.out.println("Java Version: " + System.getProperty("java.vm.version"));
+        long[] durations = new long[60];
+        for (int i = 0; i < 100000; i++) {
+            // this empty for-loop is required to reproduce this bug
+            for (long duration : durations) {
+                // do nothing
+            }
+            {
+                String s = "test";
+                int len = s.length();
+
+                s = s + s;
+                len = len + len;
+
+                s = s + s;
+                len = len + len;
+
+                s = s + s;
+                len = len + len;
+
+                if (s.length() != len) {
+                    System.out.println("Failed at iteration: " + i);
+                    System.out.println("Length mismatch: " + s.length() + " <> " + len);
+                    System.out.println("Expected: \"" + "test" + "test" + "test" + "test" + "test" + "test" + "test" + "test" + "\"");
+                    System.out.println("Actual:   \"" + s + "\"");
+                    System.exit(0);
+                }
+            }
+        }
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/runtime/6294277/SourceDebugExtension.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,136 @@
+/*
+ * 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 6294277
+ * @summary java -Xdebug crashes on SourceDebugExtension attribute larger than 64K
+ * @run main/othervm -Xdebug -Xrunjdwp:transport=dt_socket,address=8888,server=y,suspend=n SourceDebugExtension
+ */
+import java.io.*;
+
+public class SourceDebugExtension extends ClassLoader
+{
+    static final int attrSize = 68000;
+    static byte[] header = {
+(byte)0xca, (byte)0xfe, (byte)0xba, (byte)0xbe, (byte)0x00, (byte)0x00, (byte)0x00,
+(byte)0x32, (byte)0x00, (byte)0x1e, (byte)0x0a, (byte)0x00, (byte)0x06, (byte)0x00,
+(byte)0x0f, (byte)0x09, (byte)0x00, (byte)0x10, (byte)0x00, (byte)0x11, (byte)0x08,
+(byte)0x00, (byte)0x12, (byte)0x0a, (byte)0x00, (byte)0x13, (byte)0x00, (byte)0x14,
+(byte)0x07, (byte)0x00, (byte)0x15, (byte)0x07, (byte)0x00, (byte)0x16, (byte)0x01,
+(byte)0x00, (byte)0x06, (byte)0x3c, (byte)0x69, (byte)0x6e, (byte)0x69, (byte)0x74,
+(byte)0x3e, (byte)0x01, (byte)0x00, (byte)0x03, (byte)0x28, (byte)0x29, (byte)0x56,
+(byte)0x01, (byte)0x00, (byte)0x04, (byte)0x43, (byte)0x6f, (byte)0x64, (byte)0x65,
+(byte)0x01, (byte)0x00, (byte)0x0f, (byte)0x4c, (byte)0x69, (byte)0x6e, (byte)0x65,
+(byte)0x4e, (byte)0x75, (byte)0x6d, (byte)0x62, (byte)0x65, (byte)0x72, (byte)0x54,
+(byte)0x61, (byte)0x62, (byte)0x6c, (byte)0x65, (byte)0x01, (byte)0x00, (byte)0x04,
+(byte)0x6d, (byte)0x61, (byte)0x69, (byte)0x6e, (byte)0x01, (byte)0x00, (byte)0x16,
+(byte)0x28, (byte)0x5b, (byte)0x4c, (byte)0x6a, (byte)0x61, (byte)0x76, (byte)0x61,
+(byte)0x2f, (byte)0x6c, (byte)0x61, (byte)0x6e, (byte)0x67, (byte)0x2f, (byte)0x53,
+(byte)0x74, (byte)0x72, (byte)0x69, (byte)0x6e, (byte)0x67, (byte)0x3b, (byte)0x29,
+(byte)0x56, (byte)0x01, (byte)0x00, (byte)0x0a, (byte)0x53, (byte)0x6f, (byte)0x75,
+(byte)0x72, (byte)0x63, (byte)0x65, (byte)0x46, (byte)0x69, (byte)0x6c, (byte)0x65,
+(byte)0x01, (byte)0x00, (byte)0x0d, (byte)0x54, (byte)0x65, (byte)0x73, (byte)0x74,
+(byte)0x50, (byte)0x72, (byte)0x6f, (byte)0x67, (byte)0x2e, (byte)0x6a, (byte)0x61,
+(byte)0x76, (byte)0x61, (byte)0x0c, (byte)0x00, (byte)0x07, (byte)0x00, (byte)0x08,
+(byte)0x07, (byte)0x00, (byte)0x17, (byte)0x0c, (byte)0x00, (byte)0x18, (byte)0x00,
+(byte)0x19, (byte)0x01, (byte)0x00, (byte)0x34, (byte)0x54, (byte)0x65, (byte)0x73,
+(byte)0x74, (byte)0x20, (byte)0x70, (byte)0x72, (byte)0x6f, (byte)0x67, (byte)0x72,
+(byte)0x61, (byte)0x6d, (byte)0x20, (byte)0x66, (byte)0x6f, (byte)0x72, (byte)0x20,
+(byte)0x62, (byte)0x69, (byte)0x67, (byte)0x20, (byte)0x53, (byte)0x6f, (byte)0x75,
+(byte)0x72, (byte)0x63, (byte)0x65, (byte)0x44, (byte)0x65, (byte)0x62, (byte)0x75,
+(byte)0x67, (byte)0x45, (byte)0x78, (byte)0x74, (byte)0x65, (byte)0x6e, (byte)0x73,
+(byte)0x69, (byte)0x6f, (byte)0x6e, (byte)0x20, (byte)0x61, (byte)0x74, (byte)0x74,
+(byte)0x72, (byte)0x69, (byte)0x62, (byte)0x75, (byte)0x74, (byte)0x65, (byte)0x73,
+(byte)0x07, (byte)0x00, (byte)0x1a, (byte)0x0c, (byte)0x00, (byte)0x1b, (byte)0x00,
+(byte)0x1c, (byte)0x01, (byte)0x00, (byte)0x08, (byte)0x54, (byte)0x65, (byte)0x73,
+(byte)0x74, (byte)0x50, (byte)0x72, (byte)0x6f, (byte)0x67, (byte)0x01, (byte)0x00,
+(byte)0x10, (byte)0x6a, (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2f, (byte)0x6c,
+(byte)0x61, (byte)0x6e, (byte)0x67, (byte)0x2f, (byte)0x4f, (byte)0x62, (byte)0x6a,
+(byte)0x65, (byte)0x63, (byte)0x74, (byte)0x01, (byte)0x00, (byte)0x10, (byte)0x6a,
+(byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2f, (byte)0x6c, (byte)0x61, (byte)0x6e,
+(byte)0x67, (byte)0x2f, (byte)0x53, (byte)0x79, (byte)0x73, (byte)0x74, (byte)0x65,
+(byte)0x6d, (byte)0x01, (byte)0x00, (byte)0x03, (byte)0x6f, (byte)0x75, (byte)0x74,
+(byte)0x01, (byte)0x00, (byte)0x15, (byte)0x4c, (byte)0x6a, (byte)0x61, (byte)0x76,
+(byte)0x61, (byte)0x2f, (byte)0x69, (byte)0x6f, (byte)0x2f, (byte)0x50, (byte)0x72,
+(byte)0x69, (byte)0x6e, (byte)0x74, (byte)0x53, (byte)0x74, (byte)0x72, (byte)0x65,
+(byte)0x61, (byte)0x6d, (byte)0x3b, (byte)0x01, (byte)0x00, (byte)0x13, (byte)0x6a,
+(byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2f, (byte)0x69, (byte)0x6f, (byte)0x2f,
+(byte)0x50, (byte)0x72, (byte)0x69, (byte)0x6e, (byte)0x74, (byte)0x53, (byte)0x74,
+(byte)0x72, (byte)0x65, (byte)0x61, (byte)0x6d, (byte)0x01, (byte)0x00, (byte)0x07,
+(byte)0x70, (byte)0x72, (byte)0x69, (byte)0x6e, (byte)0x74, (byte)0x6c, (byte)0x6e,
+(byte)0x01, (byte)0x00, (byte)0x15, (byte)0x28, (byte)0x4c, (byte)0x6a, (byte)0x61,
+(byte)0x76, (byte)0x61, (byte)0x2f, (byte)0x6c, (byte)0x61, (byte)0x6e, (byte)0x67,
+(byte)0x2f, (byte)0x53, (byte)0x74, (byte)0x72, (byte)0x69, (byte)0x6e, (byte)0x67,
+(byte)0x3b, (byte)0x29, (byte)0x56, (byte)0x01, (byte)0x00, (byte)0x14, (byte)0x53,
+(byte)0x6f, (byte)0x75, (byte)0x72, (byte)0x63, (byte)0x65, (byte)0x44, (byte)0x65,
+(byte)0x62, (byte)0x75, (byte)0x67, (byte)0x45, (byte)0x78, (byte)0x74, (byte)0x65,
+(byte)0x6e, (byte)0x73, (byte)0x69, (byte)0x6f, (byte)0x6e, (byte)0x00, (byte)0x21,
+(byte)0x00, (byte)0x05, (byte)0x00, (byte)0x06, (byte)0x00, (byte)0x00, (byte)0x00,
+(byte)0x00, (byte)0x00, (byte)0x02, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x07,
+(byte)0x00, (byte)0x08, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x09, (byte)0x00,
+(byte)0x00, (byte)0x00, (byte)0x1d, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x01,
+(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x05, (byte)0x2a, (byte)0xb7, (byte)0x00,
+(byte)0x01, (byte)0xb1, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x00,
+(byte)0x0a, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x06, (byte)0x00, (byte)0x01,
+(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x09, (byte)0x00,
+(byte)0x0b, (byte)0x00, (byte)0x0c, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x09,
+(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x25, (byte)0x00, (byte)0x02, (byte)0x00,
+(byte)0x01, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x09, (byte)0xb2, (byte)0x00,
+(byte)0x02, (byte)0x12, (byte)0x03, (byte)0xb6, (byte)0x00, (byte)0x04, (byte)0xb1,
+(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x0a, (byte)0x00,
+(byte)0x00, (byte)0x00, (byte)0x0a, (byte)0x00, (byte)0x02, (byte)0x00, (byte)0x00,
+(byte)0x00, (byte)0x03, (byte)0x00, (byte)0x08, (byte)0x00, (byte)0x04, (byte)0x00,
+(byte)0x02, (byte)0x00, (byte)0x0d, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x02,
+(byte)0x00, (byte)0x0e, (byte)0x00, (byte)0x1d, (byte)0x00, (byte)0x01, (byte)0x09,
+(byte)0xa0
+  };
+
+    public static void main(String[] args) throws Exception
+    {
+        try {
+            SourceDebugExtension loader = new SourceDebugExtension();
+            /* The test program creates a class file from the header
+             * stored above and adding the content of a SourceDebugExtension
+             * attribute made of the character 0x02 repeated 68000 times.
+             * This attribute doesn't follow the syntax specified in JSR 45
+             * but it's fine because this test just checks that the JVM is
+             * able to load a class file with a SourceDebugExtension
+             * attribute bigger than 64KB. The JVM doesn't try to
+             * parse the content of the attribute, this work is performed
+             * by the SA or external tools.
+             */
+            byte[] buf = new byte[header.length + attrSize];
+            for(int i=0; i<header.length; i++) {
+                buf[i] = header[i];
+            }
+            for(int i=0; i<attrSize; i++) {
+                buf[header.length+i] = (byte)0x02;
+            }
+            Class c = loader.defineClass("TestProg", buf, 0, buf.length);
+            System.out.println("Test PASSES");
+        } catch(Exception e) {
+            System.out.println("Test FAILS");
+        }
+    }
+}
--- a/test/runtime/7020373/Test7020373.sh	Thu Aug 02 17:00:18 2012 +0100
+++ b/test/runtime/7020373/Test7020373.sh	Fri Aug 03 20:23:25 2012 +0100
@@ -2,10 +2,10 @@
 
 ##
 ## @test
-## @bug 7020373 7055247
+## @bug 7020373 7055247 7053586 7185550
 ## @key cte_test
 ## @summary JSR rewriting can overflow memory address size variables
-## @ignore Ignore it until 7053586 fixed
+## @ignore Ignore it as 7053586 test uses lots of memory. See bug report for detail.
 ## @run shell Test7020373.sh
 ##
 
@@ -30,7 +30,7 @@
 # set platform-dependent variables
 OS=`uname -s`
 case "$OS" in
-  SunOS | Linux )
+  SunOS | Linux | Darwin )
     NULL=/dev/null
     PS=":"
     FS="/"
@@ -66,7 +66,7 @@
     echo "Test Failed"
     exit 1
 else
-    grep "java.lang.LinkageError" test.out
+    egrep "java.lang.LinkageError|java.lang.NoSuchMethodError|Main method not found in class OOMCrashClass4000_1|insufficient memory" test.out
     if [ $? = 0 ]
     then
         echo "Test Passed"
Binary file test/runtime/7020373/testcase.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/runtime/7158800/BadUtf8.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,1254 @@
+/*
+ * 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 7158800
+ * @summary Test that 1200 symbols that hash to the same value triggers
+ * the symbol table alternate hashing mechanism.  There isn't actually a
+ * way to verify this.
+ */
+//
+// Generate large number of strings that hash to the same value
+// to slow down symbol table lookup.
+
+import java.io.BufferedOutputStream;
+import java.io.FileOutputStream;
+
+public class BadUtf8 {
+static String[] strings = {
+    "EOcLKvbddZyPxYpb",
+    "DncLKvbdPxmAGrqj",
+    "DoCjjvbdpxoIHQdY",
+    "EPCkKvbdqYoHfqEY",
+    "DnbkKvbdezvYdiUX",
+    "DnbjjvbdeEoRbXCj",
+    "EObkKvbdbsCkUEKB",
+    "EOcLKvbdnUtyjiqf",
+    "DncLKvbdRWnDcMHc",
+    "DoCkKvbdrSUkOLAm",
+    "DncLKvbdfNFwGmJk",
+    "EPDLKvbdvAdYroFI",
+    "DoDLKvbdiGibyViu",
+    "DncLKvbdYqNEhmFR",
+    "DoCkKvbdEARhlzXX",
+    "DncLKvbdSZjHsCvA",
+    "DncKjvbdqTsgRqkU",
+    "DnbjjvbdqAiFAXHd",
+    "EPDKjvbdGcjvJaij",
+    "DnbkKvbdwtldpxkn",
+    "DoDKjvbdYkrETnMN",
+    "EPCjjvbdbBWEfQQX",
+    "EPCjjvbduMXwAtBX",
+    "DncLKvbdbsCkTcia",
+    "DoCjjvbdczYpYZRC",
+    "EOcKjvbdFeiqmhsq",
+    "DoCkKvbdKCicQibx",
+    "EOcKjvbdZLrEUOLm",
+    "DoCjjvbdaNKbStmH",
+    "DoDKjvbdJbjDQjDY",
+    "EPCkKvbdemFwGmKL",
+    "EPDKjvbdZQleImEq",
+    "DncKjvbdZjShPfbG",
+    "DnbjjvbdqYnhHREY",
+    "DoCkKvbdaRfDIUGL",
+    "DoDKjvbdLrWlyuQz",
+    "DnbjjvbdZisHofaf",
+    "EObjjvbdhtydvrUb",
+    "DnbjjvbdRotHKGEX",
+    "EObjjvbdNeEThhkE",
+    "EPCjjvbdZtJJZESn",
+    "DoDKjvbdnPyxvLYb",
+    "EPDKjvbdeEoRbWbj",
+    "EOcLKvbdFxttaEXb",
+    "EObjjvbddwystRez",
+    "EPCjjvbdJpzEnenF",
+    "DnbkKvbdTppntuIN",
+    "EPCkKvbdTukpKUBR",
+    "DnbkKvbdhlFEOUcZ",
+    "EObkKvbdlhdUQuRa",
+    "DnbjjvbdkClKqHUg",
+    "EOcKjvbdqTtGqqkU",
+    "DncKjvbdtkwvaUBX",
+    "DoDKjvbdsQWOjCuf",
+    "DncLKvbdEKIJuwjA",
+    "DncKjvbdGLErcIMu",
+    "EOcLKvbdNPwpumfs",
+    "EObkKvbdnVUzLJrG",
+    "DoCkKvbdcTDKsdKB",
+    "DncKjvbdKRZdoFme",
+    "EOcLKvbdemFvgNKL",
+    "EPCkKvbdznopdblY",
+    "EPDLKvbdOYPVzdOU",
+    "DnbjjvbdsZlPsAhO",
+    "DoDLKvbdKCjDRKDY",
+    "DoCkKvbdhuZeXSVC",
+    "EPDKjvbdOStVgEtp",
+    "DncLKvbdvwMAvBWV",
+    "EPDKjvbdBcoaWJlf",
+    "EOcKjvbdZxdKODMS",
+    "DoCjjvbdbsCkTcjB",
+    "EOcLKvbdwWlAuaWV",
+    "DnbjjvbdFejRnJUR",
+    "DnbjjvbdmIdTqVSB",
+    "DnbkKvbdqBIeAWhE",
+    "DncKjvbdrMzJyMIJ",
+    "DoCkKvbdZGvdAOsJ",
+    "DncLKvbdjggLfFnL",
+    "DoCjjvbdYqNFJMdq",
+    "DoCkKvbdqZPHfqDx",
+    "DncLKvbdOEdThiLE",
+    "DoCkKvbdZirgpGaf",
+    "EPDLKvbdziuQPdSt",
+    "EObkKvbdKQyeOenF",
+    "DoDLKvbduaDySndh",
+    "DoCjjvbdVUNUGLvK",
+    "DncKjvbdAMhYrvzY",
+    "DnbkKvbdnQZxvKxb",
+    "EPCjjvbdBhjakJFj",
+    "DncLKvbdmfeYNNfy",
+    "DoDLKvbdjlbLydfo",
+    "DoDLKvbdpyPIGpcx",
+    "EOcLKvbdnVUzLJqf",
+    "DoCjjvbdmJETqVSB",
+    "DoDLKvbdJTZAsMxM",
+    "DoCkKvbdnQZxvLZC",
+    "DoDKjvbdACqwizJQ",
+    "DncKjvbdvBEZSoFI",
+    "DncKjvbdGckVjCJj",
+    "DncLKvbdiMFENtcZ",
+    "Dnbjjvbdjuvmcaww",
+    "DnbkKvbdZyEKNblS",
+    "DoCjjvbduMYXBUBX",
+    "DnbjjvbdFWYopNJe",
+    "DoDKjvbdelfXGljL",
+    "DnbjjvbdakLenmcA",
+    "EPDKjvbdfILWRmpg",
+    "EObjjvbdSLYeuHLT",
+    "DoCjjvbdMfbolotk",
+    "EPDLKvbdrRuKnKaN",
+    "EOcKjvbdyzdnRhIh",
+    "DoDLKvbdGAoRZJzm",
+    "DoCjjvbdhlFDnUcZ",
+    "EPDLKvbdmpZyVkYb",
+    "DncKjvbdTpqPUuIN",
+    "DncLKvbdHDjvJaij",
+    "EPDLKvbdYlRcsmkm",
+    "EPDLKvbdvlvAMdFN",
+    "DncKjvbdIsZArmYM",
+    "EOcLKvbdegjuqnQg",
+    "EOcLKvbdZQmFJNFR",
+    "DoCjjvbdZxdJmcMS",
+    "EPCkKvbdlZTSTYgU",
+    "DoDKjvbdqceJPnWB",
+    "DncLKvbdVgwuxGxz",
+    "DncKjvbdDnbkLXDE",
+    "EPDLKvbdatbHYKsh",
+    "DncKjvbdEzsqFLbi",
+    "EPDLKvbdnVVZkKRf",
+    "EOcKjvbdKeegbBQu",
+    "EPCkKvbdKfGHaaRV",
+    "EPDKjvbdmIctRVRa",
+    "EPCjjvbdRMxBxnUz",
+    "DnbjjvbdJYTbILpp",
+    "EPCkKvbdTAEiHbPE",
+    "EOcLKvbdfelZnGgA",
+    "DoCjjvbdOStWGeUp",
+    "EOcLKvbdemGXHNJk",
+    "DoDKjvbdYTMAmUOx",
+    "EPCkKvbdpyOhGpcx",
+    "EPCkKvbdAMgxsWzY",
+    "DnbjjvbdYkrETnMN",
+    "EPDLKvbdUQqPUtgm",
+    "DncKjvbdehKurNqH",
+    "DoCjjvbdZMSETnLm",
+    "DoDKjvbdIHGyyXwg",
+    "EObjjvbdXGYzUAPT",
+    "DoCjjvbdhbPCeWqR",
+    "DoCkKvbdKNADzGuB",
+    "DnbjjvbdFeirOJTq",
+    "DncLKvbdaRecHtFk",
+    "DnbkKvbdzoPpeClY",
+    "EObkKvbdZRMeJMeR",
+    "DnbjjvbdYfvdAPSi",
+    "DncLKvbdJcKCqJcY",
+    "EOcLKvbdqvokbhyR",
+    "DoDLKvbdrRuLNjaN",
+    "DoCjjvbdTlWPBWOi",
+    "DoCkKvbdjvWnEBxX",
+    "DoDLKvbdTkunaVoJ",
+    "DoCkKvbdQZNAHTSK",
+    "EObjjvbdqwPkbhyR",
+    "EOcLKvbdNHDPlpUk",
+    "DncLKvbdIHHZxxYH",
+    "DncLKvbdtkxXAtAw",
+    "DncLKvbdSCEFMJZL",
+    "DnbjjvbdZQmEhldq",
+    "DoCjjvbdNGbolotk",
+    "DnbjjvbdnCKWwnmu",
+    "DncLKvbdzHZMANEw",
+    "DoDKjvbdmttykJrG",
+    "DnbkKvbdlrZUzSci",
+    "EPDKjvbdSKyGVHKs",
+    "DoCjjvbdKVuGEFGi",
+    "EPCjjvbdCIkBkIej",
+    "DncLKvbdzHZMAMeX",
+    "DnbkKvbdaSFbgsek",
+    "DncLKvbdHDjujBij",
+    "DoDKjvbdGZVUaDwb",
+    "DnbjjvbdZnnJFEzK",
+    "DoCkKvbdtcDUwWOo",
+    "DoCkKvbdlBMoNALA",
+    "EOcKjvbdNsUWHFUp",
+    "DoDLKvbdVUNUFlVj",
+    "DnbkKvbdhkdcnUcZ",
+    "DncLKvbdLiBkqYAS",
+    "EOcKjvbdzoPpdcLx",
+    "EPDKjvbdijGIJmXr",
+    "EOcKjvbdZisHofaf",
+    "DoDLKvbdeOdrkUUS",
+    "DoDLKvbdnPyxvKxb",
+    "EPDKjvbdIxUBhMRQ",
+    "DncLKvbdlhctRUqa",
+    "DoDLKvbdmgFXlnGy",
+    "DncKjvbdCJKbKiGK",
+    "EOcLKvbddndrjtUS",
+    "DnbjjvbdkDLjqGuH",
+    "DncKjvbdmIcsptqa",
+    "DoCkKvbdvvlAvBWV",
+    "EObjjvbdjblLQftg",
+    "DnbjjvbdCEQBWKMf",
+    "DnbjjvbdBdPaVilf",
+    "DoCkKvbdZxcjODLr",
+    "DoCkKvbdEObjjwCd",
+    "EPDKjvbdyTNhlqbH",
+    "EPCkKvbdUMVoAvPJ",
+    "DncKjvbdUxhUZjoO",
+    "DncKjvbdqqtjmkAm",
+    "DncKjvbdKfGICBRV",
+    "EPCjjvbdVrOXaeLc",
+    "EPDLKvbdwXLaWBWV",
+    "EPCkKvbdjblKqHUg",
+    "DnbjjvbduDCuWuoP",
+    "EPDKjvbdNGbpMouL",
+    "EObjjvbdBcoaVjNG",
+    "DncLKvbdrWpMDIxq",
+    "DncLKvbdhaoCdwRR",
+    "DnbkKvbdFxtuBDwb",
+    "DncKjvbdIjEAKPgE",
+    "EOcLKvbduCbuXVoP",
+    "DoDKjvbdZtIiZDsO",
+    "DnbjjvbdEztRElCi",
+    "DncLKvbdxmsHwsJD",
+    "DnbjjvbdRbEElIxk",
+    "DoDKjvbdWHwvXgYz",
+    "EOcKjvbdQlwbYnUz",
+    "EOcLKvbdVTltFkuj",
+    "DncKjvbdliETptqa",
+    "DnbkKvbddoErjtTr",
+    "DoCkKvbdgPazvdXh",
+    "DncKjvbdySmhlqag",
+    "DoCjjvbdbPgHDkzd",
+    "DoCkKvbdFWZPomKF",
+    "EObjjvbdssSSxydc",
+    "EObjjvbdzQnliJwA",
+    "EObkKvbdKCjCpibx",
+    "EPCjjvbdpyOhHREY",
+    "DncLKvbddjJqutzn",
+    "EObkKvbdBdQAujMf",
+    "EPCkKvbdLAjflbXq",
+    "DncLKvbdLBLGlaxR",
+    "DoDLKvbdrpWPJbuf",
+    "DoCjjvbdEKHiuxKA",
+    "DoCjjvbdXsMAlsnx",
+    "EObkKvbdptTgSSLU",
+    "DoDKjvbdnHFXmNfy",
+    "DncKjvbdCJKbKhej",
+    "EPCjjvbdhlEdOUby",
+    "EOcKjvbdKWUfEFGi",
+    "DoDKjvbdZQmFJMdq",
+    "EPCjjvbdiGjDZWKV",
+    "EObkKvbdVAbQrprZ",
+    "DoDKjvbdfekzNgHA",
+    "DoDLKvbdnHEwlmgZ",
+    "DncKjvbdwzHeexEr",
+    "DoCjjvbdmpZxujyC",
+    "EPDKjvbdwMvAMcdm",
+    "DoCjjvbdfHkVrNqH",
+    "EPCkKvbdYzbfRiuy",
+    "EPCkKvbdZtIiZDrn",
+    "DnbjjvbdjvWnDbYX",
+    "DoCjjvbdOStVgEtp",
+    "EPDLKvbdZMSETmlN",
+    "EPDKjvbdBhjajhej",
+    "EPCjjvbddoFTLUUS",
+    "DnbkKvbdsQVoJcWG",
+    "EPCjjvbdrEFJQNvB",
+    "DoCjjvbdMpYRWOGs",
+    "EOcLKvbdZirgpHBf",
+    "EPDLKvbdyOTIXsJD",
+    "DoCkKvbdKRZdnfNe",
+    "DnbjjvbdbBWFFoow",
+    "EPCjjvbdgFlZnHHA",
+    "DnbkKvbdGGJrOIsq",
+    "DoDLKvbduDCtwWPP",
+    "EObjjvbdNddUIhjd",
+    "DnbjjvbdxsNiMqag",
+    "EObjjvbddeOrCWbj",
+    "EObjjvbdPxmAGsRj",
+    "EOcLKvbddeOrCXDK",
+    "DoDLKvbddeOrBwCj",
+    "DoCjjvbdVqnYCElD",
+    "DnbkKvbdUyIUZjoO",
+    "EObjjvbdeFOrCXDK",
+    "EObkKvbdVrNxCFLc",
+    "EObjjvbdTfzmkwWF",
+    "EOcKjvbdIHGzZYYH",
+    "EPDKjvbdtbbuXWPP",
+    "DoCjjvbdZisIQHBf",
+    "EObjjvbdbsCkUDjB",
+    "EPCkKvbdVwJXudFH",
+    "EPDKjvbdrouoKDVf",
+    "EPCkKvbdFyVVBEYC",
+    "DncLKvbdZnnIeEzK",
+    "EPDLKvbdxVNFQxkn",
+    "DoDKjvbdpxnggRDx",
+    "DoDLKvbdqZOgfpcx",
+    "DncKjvbdCIjakJGK",
+    "EPCkKvbdCJLBjhej",
+    "DoDLKvbdnPzYvKxb",
+    "EOcKjvbdqTsgSRkU",
+    "EOcLKvbdLBLGlaxR",
+    "DoDLKvbdcbTMrAUN",
+    "DncLKvbdzitoodSt",
+    "DoDKjvbdJvUfDdfi",
+    "EOcLKvbdHDjvKCJj",
+    "EPCkKvbdeOeTKssr",
+    "DnbkKvbdlYrqsYft",
+    "DncLKvbdiiehKMxS",
+    "DncKjvbdURQoVUhN",
+    "DnbkKvbduMYXBUAw",
+    "DoDLKvbdSPtHJfEX",
+    "EObkKvbdqBJFAWgd",
+    "EOcKjvbdFpATWgFy",
+    "DoDLKvbdBsBDTfXS",
+    "DncKjvbdjhHLfFmk",
+    "DoCjjvbdCJKakIfK",
+    "DnbkKvbddoFSjtTr",
+    "EObkKvbdANIYsWzY",
+    "EObjjvbdCTAbtFvr",
+    "EObjjvbdrRtkOLAm",
+    "DnbkKvbdkxsSTYgU",
+    "DoCjjvbdnBiwXnmu",
+    "EObjjvbdwtmEqYlO",
+    "EPDKjvbdrylQTAhO",
+    "DoDLKvbdtbbtvvOo",
+    "EPCjjvbdZLrETmlN",
+    "EPDLKvbdWXJYWDdg",
+    "DoCkKvbdKQzFOfOF",
+    "EPCjjvbdwzIFfXeS",
+    "DncKjvbdRjyFuHLT",
+    "EPDLKvbdULunaWPJ",
+    "DncKjvbdUxhTykOn",
+    "DnbkKvbdJcKCqKDY",
+    "EPDLKvbdcbSmSATm",
+    "DnbkKvbdegjurNqH",
+    "EPDKjvbdZjTIQGbG",
+    "EPCjjvbdiLddNuCy",
+    "DoCjjvbdZQldiNEq",
+    "EOcLKvbdakMGPODA",
+    "EObjjvbdnHEwlmgZ",
+    "EOcLKvbdBsAcUGXS",
+    "EPCkKvbdiVZdwSUb",
+    "EOcLKvbddCTNSAUN",
+    "DnbkKvbdEXxMUUUM",
+    "DncKjvbdYpldiMeR",
+    "DoDKjvbdNddTiIjd",
+    "DoDLKvbdZLqdUNlN",
+    "EPCkKvbdiBncFWpq",
+    "DncLKvbdiCPDEvqR",
+    "EOcKjvbdUyHszKoO",
+    "DncKjvbdhtydvqtb",
+    "EPCjjvbdpxoHgQcx",
+    "EObkKvbdkWWnDaxX",
+    "DnbjjvbdBhkBkJFj",
+    "DoCkKvbdRacdkhyL",
+    "EOcLKvbdZjTHpHCG",
+    "EPCkKvbdMowqWOGs",
+    "DncLKvbdegjurNpg",
+    "EObjjvbdfMfWfmKL",
+    "EPDLKvbdZirgpGaf",
+    "DoDLKvbdiZuFlQnG",
+    "DncLKvbdFxuVAcxC",
+    "EObkKvbdZisHofaf",
+    "EOcKjvbdJSyBSmYM",
+    "EPDLKvbdVYgtZkPO",
+    "EOcKjvbdRbEFMJYk",
+    "DncLKvbdrEFIonWB",
+    "DncKjvbdKDJbqJcY",
+    "EOcLKvbdhfjCxuiu",
+    "EObjjvbdLLAhWAKZ",
+    "DoCkKvbdRXNcblID",
+    "DoDLKvbdcbSmSATm",
+    "EOcLKvbdwWlAvAuu",
+    "EObkKvbdiBnbdvpq",
+    "DoCkKvbdNQXpumgT",
+    "DncLKvbdkVwOECYX",
+    "DnbkKvbdfoazwDxI",
+    "DoDLKvbdbBWFFpPw",
+    "DoDLKvbdvBDxsPEh",
+    "EPDKjvbdJqZdoFme",
+    "DoDLKvbdIryArmXl",
+    "EPCjjvbdANIZSwZx",
+    "EPCkKvbdVhYVxGxz",
+    "DncKjvbdLAjgNCYR",
+    "DncKjvbdxxIjCQZk",
+    "DncKjvbdbiNKKewY",
+    "EPCjjvbdlrZVZsEJ",
+    "EPDKjvbdIryAsMwl",
+    "DoCkKvbdtAHRIAAr",
+    "EPDKjvbdJmAEZfuB",
+    "EPCkKvbdZjSgogBf",
+    "DoDLKvbdOXnuzcnU",
+    "DnbkKvbdehKvRnQg",
+    "EObjjvbdZyDimbkr",
+    "DoDKjvbdmajWwoOV",
+    "EOcKjvbdkMalZeHP",
+    "EOcKjvbdIjEAJpHE",
+    "EPCkKvbdDihKVxKA",
+    "DncKjvbdNddUIiKd",
+    "EObjjvbdqdFIpOWB",
+    "DoCkKvbdxnShXsJD",
+    "DoDLKvbdjmBkzEfo",
+    "EOcLKvbdatagYLTh",
+    "DoCjjvbdVhYVxHYz",
+    "DnbjjvbdJbjDRKDY",
+    "EPCjjvbdLBLHNCYR",
+    "DnbjjvbdnGeYNOGy",
+    "EOcLKvbdUsmTekvK",
+    "EPCjjvbdtkxXBTaX",
+    "EPCjjvbdzoPqFCkx",
+    "DncKjvbdCIjbKhej",
+    "DncKjvbdZLqdTmkm",
+    "DoDKjvbdsPunicVf",
+    "EOcKjvbdmgFXmNgZ",
+    "EObkKvbdiMFENuCy",
+    "DoDKjvbdhanbeXRR",
+    "EObkKvbdACqwiyhp",
+    "DncKjvbdZisIQHBf",
+    "EPCjjvbdgQBzwDwh",
+    "DnbjjvbdyYJJaoyk",
+    "DoDKjvbdxUldqZMO",
+    "EObkKvbdkClLQgVH",
+    "EPCjjvbdZQldiMeR",
+    "EPDLKvbdZyEKOClS",
+    "EPDLKvbdcIlikFvx",
+    "DoDKjvbdrzMQTBHn",
+    "DnbjjvbdVYgtZkPO",
+    "DoDLKvbdHEKuiajK",
+    "EPCkKvbdczZQXxqC",
+    "DoDKjvbdrDdiQNua",
+    "DncLKvbdcImKLGWx",
+    "DoCjjvbdVYgtZkPO",
+    "EPDLKvbdZnnIeFZj",
+    "EPDKjvbdMIakqYAS",
+    "DoCkKvbdSLYfUgLT",
+    "EPDLKvbdiCObdvpq",
+    "DnbjjvbdRpUHKFcw",
+    "DoDLKvbdIHHZyYXg",
+    "EPCjjvbdypoMhiwA",
+    "DnbkKvbdCEPaVjMf",
+    "DnbkKvbderAvzlDP",
+    "DnbkKvbdZQleImFR",
+    "EOcKjvbdKRZdneme",
+    "DoDLKvbdiBnbeXQq",
+    "DncLKvbdEPDKjvcE",
+    "EOcLKvbdauCGwkTh",
+    "DncLKvbdEvZQPmJe",
+    "EPCkKvbdURQnuVIN",
+    "DncLKvbdegjvSOQg",
+    "EPCjjvbdKaKgMawq",
+    "DnbkKvbdRzKISbvA",
+    "DncLKvbdiLdcnUcZ",
+    "EPDLKvbdkDMKpfuH",
+    "DoDLKvbdRbDdkhyL",
+    "DnbjjvbdDwxMUUTl",
+    "DnbkKvbdrpWPKCuf",
+    "DnbkKvbdNVSqjmAX",
+    "DoDKjvbdRbDeMIxk",
+    "EOcLKvbdcyxpXyRC",
+    "DncLKvbdRMwbYnUz",
+    "EObjjvbdqlzJxlHi",
+    "DoCkKvbdJYUCIMQp",
+    "DncLKvbdLZQjSzuG",
+    "EOcKjvbdxVNEqYkn",
+    "DnbkKvbdZoOIeFZj",
+    "DoCjjvbdBraCtFwS",
+    "EOcLKvbdliDsqVSB",
+    "EPCkKvbdeATqNXif",
+    "DncLKvbdkMbLydgP",
+    "EObjjvbdZxdJmbkr",
+    "DoCjjvbdraellHLZ",
+    "EObkKvbduDCuWvPP",
+    "DoCkKvbdpstGrSLU",
+    "DoCjjvbdLGFgbBQu",
+    "DnbkKvbdhtzFWquC",
+    "EObjjvbdoAKztHdO",
+    "EPDLKvbdatafxKtI",
+    "EPDKjvbdkWXNcaww",
+    "DoCkKvbdwkXEHzzG",
+    "EObkKvbdmgEwmNgZ",
+    "DncKjvbdBiLCLJFj",
+    "DoCjjvbdeOdsKssr",
+    "EOcLKvbdfILWSORH",
+    "EObkKvbdCDpAujMf",
+    "EPDKjvbdKDKDQibx",
+    "DoDKjvbdVUMtGLuj",
+    "EObkKvbdrXQMCiYq",
+    "DncKjvbdePEsLTtS",
+    "DncLKvbdDxYLtUTl",
+    "EPCkKvbdGYuVBEYC",
+    "DncLKvbdNeEUIiKd",
+    "EPCkKvbdpxoIHRDx",
+    "EObjjvbdFkEsDHlu",
+    "EObjjvbdssSSxzFD",
+    "DoCkKvbdUtNTfMVj",
+    "DnbjjvbdJcKDRKDY",
+    "DncKjvbdqiAKEmOe",
+    "DoDKjvbdtlXwAtBX",
+    "DnbkKvbdxmsIYTIc",
+    "EObkKvbdLrXMzUpz",
+    "DoCjjvbdkxsSSxft",
+    "DncKjvbdQlwaxnUz",
+    "EObkKvbdjhGlFfNk",
+    "EPCkKvbdxsNhmRag",
+    "DoDLKvbdMfcPmQUk",
+    "DoDKjvbdQvnEDLhD",
+    "EObjjvbdVgxVxHYz",
+    "DoDLKvbdlrYtyrdJ",
+    "DoCjjvbdezvYeIsw",
+    "DncLKvbdNddTiIjd",
+    "EPDLKvbdGGJrNiUR",
+    "EPDLKvbdRzJhTDWA",
+    "EPCjjvbdvvkaWBVu",
+    "EOcKjvbdRXNdCkgc",
+    "EOcKjvbdQZNAHTSK",
+    "EPCkKvbdsCGNLfkZ",
+    "EOcLKvbdDwwktTsl",
+    "EOcLKvbdqlzJyLgi",
+    "EOcLKvbdxsNiMqag",
+    "EOcLKvbdhzVFlROG",
+    "EOcKjvbdEztRFMCi",
+    "DnbkKvbdqiAJdmPF",
+    "EPDLKvbdjcMKqGtg",
+    "EObkKvbdTlWOaWOi",
+    "EPDLKvbdURRPUuHm",
+    "DoDKjvbdelfWgNKL",
+    "EOcLKvbdGAnqZJzm",
+    "EObjjvbdGZUuAdXb",
+    "DoDLKvbduLwwAtAw",
+    "DoCjjvbdZjTIQGbG",
+    "EPCjjvbdRNXbYnUz",
+    "EPDLKvbdiLeENtby",
+    "EObjjvbdMowpunGs",
+    "EOcKjvbdbiNJjevx",
+    "DoDKjvbdEYYLstTl",
+    "DoDLKvbdqUTfrRjt",
+    "DoDKjvbdbsCkUEJa",
+    "DoDKjvbdXsMBNUPY",
+    "EPCjjvbdRNXaxnUz",
+    "DoDLKvbdNGcQNQUk",
+    "DnbjjvbdEARiMywX",
+    "EPDKjvbdSKxfUfkT",
+    "DncKjvbdhtyeXRtb",
+    "DncKjvbdZLqcsnLm",
+    "EObkKvbdZnmheEzK",
+    "EObjjvbdtbcUvuno",
+    "DnbjjvbdrzMQTBHn",
+    "DnbjjvbdDwwktTsl",
+    "EPDKjvbdkxsSTYgU",
+    "DoDKjvbdIryArlxM",
+    "DoDKjvbdnBivxOnV",
+    "DoDKjvbdeATplwif",
+    "EOcLKvbdKeegbApu",
+    "EPCjjvbdMgDQMotk",
+    "DoCjjvbduCbtwWOo",
+    "DnbkKvbdyNsHwrhc",
+    "DnbkKvbdtvNxJpsA",
+    "EOcLKvbdqAheAWgd",
+    "DoCkKvbdURQoUtgm",
+    "EOcKjvbdqceIpOWB",
+    "DoCkKvbdVwIwudFH",
+    "DnbkKvbdbLMFnmcA",
+    "EOcLKvbdZjTHpHBf",
+    "EOcKjvbdRXNdCkhD",
+    "EPDLKvbdiHJcZViu",
+    "DoCjjvbdxxIjCPzL",
+    "DnbkKvbdBcpBWJmG",
+    "EPCkKvbdZyEKOCkr",
+    "EPDKjvbdOTUWHFVQ",
+    "DoCjjvbdIGgZxwwg",
+    "EPDLKvbdFjeSbhMu",
+    "EPDLKvbdhgKCxvJu",
+    "EOcLKvbdNsUWGdtp",
+    "EPDKjvbduVnXipsA",
+    "DncLKvbdGYuVBEXb",
+    "EPDLKvbdZtIhyESn",
+    "DoDKjvbdZxdJmcLr",
+    "DoCjjvbdUsltGLuj",
+    "DoDKjvbdDoDLKvbd",
+    "DncLKvbdrDdhpNvB",
+    "EPDLKvbdKCjDRJbx",
+    "DoDLKvbdxLWdHzyf",
+    "EObkKvbdrzMQTAhO",
+    "EOcLKvbdOFDtJJKd",
+    "EPCkKvbdrSVKmjaN",
+    "EOcKjvbdWWiYVdEg",
+    "EOcKjvbdWWhwvDdg",
+    "DncKjvbdpstHRqjt",
+    "EPCkKvbdKWVFceGi",
+    "DoCkKvbdZjShPfbG",
+    "DoCkKvbdSxKlNzkY",
+    "EPDLKvbdIwtCHkqQ",
+    "EOcKjvbdsCGNLgLZ",
+    "DncKjvbdzaAOfgCM",
+    "DoDLKvbdxmrhYSiD",
+    "DncLKvbdfMfWgMjL",
+    "EPDKjvbdqFdEsuaI",
+    "EOcLKvbdiLeDnUcZ",
+    "DoCjjvbdKVuFceHJ",
+    "DoCjjvbdfekzNgHA",
+    "EOcKjvbdOFEThiLE",
+    "EPDLKvbdqceJPnWB",
+    "DoDLKvbduCbtwWOo",
+    "DncKjvbdTqROtuIN",
+    "DncKjvbdpedFUWBI",
+    "DoDLKvbdrEFJQNua",
+    "DoDLKvbdyXhjCPyk",
+    "EPCkKvbdJYUBhLqQ",
+    "EPCkKvbdtcCuXVno",
+    "DoDLKvbdZLrEUOLm",
+    "EPCkKvbdpstGrRjt",
+    "DncLKvbddePSCXCj",
+    "EObkKvbdauCHXjsh",
+    "DoDLKvbdkHfkefNk",
+    "EObjjvbdMRwMzUpz",
+    "EObjjvbdaMkCTVNH",
+    "DoCkKvbdGGJrNhtR",
+    "EPDLKvbdvBDxrneI",
+    "EPDLKvbdIHHZxwxH",
+    "EOcLKvbdrJAJdmPF",
+    "EOcKjvbdGZUuAdXb",
+    "EOcLKvbdbUbHYLUI",
+    "DnbjjvbdJzofYEAN",
+    "EPDKjvbdFxtuBDxC",
+    "DnbkKvbdQvnDbkgc",
+    "EPDKjvbdJmADzGta",
+    "DoDKjvbdZRMdhleR",
+    "DnbkKvbdsrqsZZeD",
+    "EObkKvbdrovPJbuf",
+    "EPCjjvbddeOqbXCj",
+    "EObjjvbdtcDVXVoP",
+    "DncKjvbdMfbpNQVL",
+    "DoCkKvbdhbPCeXQq",
+    "DoCkKvbdNHComQVL",
+    "EObjjvbdvBDxroFI",
+    "EPCjjvbdnBivwoNu",
+    "EObjjvbdbhljKewY",
+    "EPDKjvbdZyDimcMS",
+    "EObkKvbdWSOXbElD",
+    "EOcKjvbdTfznMXVe",
+    "EPCjjvbdZtJJYcsO",
+    "DoCjjvbdRjxfVHLT",
+    "DoCkKvbdVTltGMVj",
+    "DncKjvbdYfwEAOri",
+    "DncKjvbdYkrEUOMN",
+    "EObkKvbdqGEEsuaI",
+    "DncLKvbdjJfHimXr",
+    "EPDLKvbddndsLUTr",
+    "DnbkKvbdqBJFAWhE",
+    "EPDLKvbdEOcKjwDE",
+    "EPCkKvbdtvOYJqTA",
+    "DncLKvbdkyTRsZHU",
+    "DoCjjvbdTppnuVIN",
+    "DncLKvbdwyhFeweS",
+    "DncKjvbdsBelkgKy",
+    "DoCjjvbdKDKCqJcY",
+    "DoCjjvbdkClKqHVH",
+    "DoCjjvbdcTCjtDia",
+    "EPDLKvbdUVkpJtAq",
+    "EPDLKvbdRyjITCvA",
+    "DnbjjvbdJuuFcdgJ",
+    "DoDKjvbdrJAJdmOe",
+    "DncKjvbdJcJbqKCx",
+    "DoDLKvbdJcJbqJcY",
+    "DoDKjvbdeEoSCXDK",
+    "DoDLKvbdSwjlNzkY",
+    "EObjjvbdzitopDrt",
+    "DoCkKvbdKWVGEEgJ",
+    "DncKjvbdpssfqrKt",
+    "EOcLKvbdUMWPBVoJ",
+    "DncKjvbdyzdmrIIh",
+    "EPCjjvbdxUldqZLn",
+    "DoDLKvbdySnImRbH",
+    "DoCjjvbdGdKvJaij",
+    "DoCkKvbdxZgeewdr",
+    "EObkKvbdiLddNuDZ",
+    "DnbjjvbdSCDdkiZL",
+    "DncKjvbdznpREcMY",
+    "EOcLKvbdaRebhTfL",
+    "DnbjjvbdZQldiMdq",
+    "EPCjjvbdbrbjtEKB",
+    "EOcKjvbdEARiMzXX",
+    "DoDLKvbdXrkaNTnx",
+    "EPCkKvbdQZNAHTRj",
+    "DoDLKvbdEzspeLcJ",
+    "EPCjjvbduVnYKRTA",
+    "EObjjvbdJXtBhMQp",
+    "EPDKjvbdeOdrjssr",
+    "EPCjjvbdLqwMytpz",
+    "EPDKjvbdUMVoBVoJ",
+    "DncKjvbdRpUGifDw",
+    "EPDLKvbdZyDinDLr",
+    "DnbkKvbdNrsufeVQ",
+    "EPCkKvbdZMSDtNlN",
+    "EPCkKvbdySnJNSCH",
+    "EPCjjvbdfMevfljL",
+    "DncLKvbdXsMBNTnx",
+    "DnbkKvbdpxoHfqDx",
+    "DncLKvbdUQpntthN",
+    "DncKjvbdIsZArlwl",
+    "DoDLKvbdZGwEAOsJ",
+    "EOcKjvbdVvhwvDdg",
+    "EOcLKvbduWNxJqTA",
+    "EPCjjvbdHEKvJaij",
+    "DoDKjvbdrpWOjCuf",
+    "DncLKvbdrpWOjDVf",
+    "DoCjjvbdIHGzYwwg",
+    "DoDLKvbdpxoIGqEY",
+    "DoDLKvbdJcJbqKDY",
+    "DoCjjvbdRWmdClHc",
+    "EPCjjvbdFWYopNJe",
+    "DncKjvbdmfdwlmfy",
+    "DoCkKvbdxUleQxlO",
+    "EObjjvbdnGdxMnGy",
+    "EPCjjvbdvvlAvBVu",
+    "DncLKvbddndsKssr",
+    "EObjjvbdZMRcsnLm",
+    "EOcKjvbdFxttaEXb",
+    "DncKjvbdVUNTfMVj",
+    "EOcLKvbdNrtWHFUp",
+    "DoDKjvbdwuMdqYlO",
+    "EPDLKvbdrXPkbhxq",
+    "EObjjvbdrEFIpNua",
+    "EObjjvbdziuQQDrt",
+    "EOcLKvbdqYoIGpcx",
+    "DnbjjvbdsQVoJcVf",
+    "EObkKvbdkDMKpgUg",
+    "EObjjvbdvBDyTPFI",
+    "DncKjvbduCbuWvOo",
+    "EPCjjvbdkVvnECYX",
+    "DncLKvbdZGvdAOri",
+    "DoCkKvbdrXPlDJZR",
+    "EOcLKvbduCcVWvOo",
+    "DoDKjvbdCEPaWJlf",
+    "EPDKjvbddoErjssr",
+    "DncKjvbdACqxKZiQ",
+    "EPCjjvbdUVlPitAq",
+    "EPDKjvbdjJfHjMxS",
+    "EObkKvbdAMhYsWzY",
+    "DoDKjvbdnBivxOmu",
+    "EOcLKvbdbiNKKfXY",
+    "EPDKjvbdYqMeIleR",
+    "EObkKvbdJmADygUa",
+    "EObjjvbdEPDLLWcE",
+    "EPCjjvbdrXPkcIxq",
+    "EOcLKvbdliDtQtqa",
+    "DoCjjvbdmoyxujyC",
+    "EPDLKvbddoFTLTsr",
+    "EOcLKvbdCWzdJEpW",
+    "DnbjjvbdrEEhpOWB",
+    "DoDKjvbdZLrDtNkm",
+    "EOcLKvbdLFfHbAqV",
+    "EOcKjvbdmttzLKSG",
+    "EOcLKvbdmbJvwoOV",
+    "EOcKjvbdUaCQrqSZ",
+    "DnbjjvbdmgExMnGy",
+    "EPDKjvbddndrkUUS",
+    "EObkKvbdDwwkstTl",
+    "DoCkKvbdcJMjLFwY",
+    "DnbjjvbdaNLBruMg",
+    "DoDLKvbdQYmAHTRj",
+    "DnbkKvbdsQWOicWG",
+    "EObkKvbdMRwMzUpz",
+    "DoDLKvbdZshiZDrn",
+    "EPDLKvbdnPzYujxb",
+    "EOcKjvbdCEQAujMf",
+    "EPDLKvbdKefHbApu",
+    "DoDLKvbdYpldiNFR",
+    "DoCkKvbdFWZQQNJe",
+    "DncLKvbdznpQeCkx",
+    "EOcKjvbdnQZxvKxb",
+    "DoCkKvbdVBBprpqy",
+    "DnbkKvbdZirhPfaf",
+    "DnbkKvbdegjvSNqH",
+    "EOcLKvbdqdEiPnWB",
+    "EObjjvbdBhkCKiGK",
+    "EObjjvbdxZgfGYFS",
+    "DnbjjvbdNQYQumgT",
+    "EPCjjvbdxsNhlrBg",
+    "DoCkKvbdQdDApRDr",
+    "DoCkKvbdxxIiaoyk",
+    "EPDKjvbdFeirNhtR",
+    "DoCjjvbdegjvSOQg",
+    "EObkKvbdqcdiQNvB",
+    "DncLKvbdiMEdNtcZ",
+    "DncLKvbdTqRPUthN",
+    "EPCkKvbdwygeexFS",
+    "DoDKjvbdyTOJMrBg",
+    "DncLKvbdeEoRavbj",
+    "EPCjjvbdtbcUvvOo",
+    "EObjjvbdKCicRJcY",
+    "EObjjvbdZyEKODMS",
+    "DnbjjvbdmJDtQtrB",
+    "DncLKvbdEARhlyvw",
+    "DnbjjvbdIxTbILqQ",
+    "EOcLKvbdwygefYFS",
+    "DoCjjvbdznoqFCkx",
+    "DoCjjvbdRpUGjGDw",
+    "DncKjvbdhzVGMQnG",
+    "EPCjjvbdhkeDnVCy",
+    "EObkKvbdOEdUIiKd",
+    "DncKjvbdrDeIomua",
+    "DncLKvbdiHJbxuiu",
+    "EPDKjvbddxZstRez",
+    "EPDLKvbdmSYuZrdJ",
+    "EObkKvbdVUNUFkvK",
+    "EPDLKvbdNeEUJIjd",
+    "DoCkKvbdiMEdNuCy",
+    "DoDLKvbdRDcApQcr",
+    "EPCjjvbdTlVoBVoJ",
+    "EObjjvbdLBKgNBwq",
+    "EPCkKvbdsCFllHKy",
+    "EObjjvbdnVUzLJqf",
+    "DoDKjvbdqrVLNkBN",
+    "DoCkKvbdqFcdtWBI",
+    "DncLKvbdbVCGxLTh",
+    "EOcLKvbdeFPSCXCj",
+    "EOcLKvbdRpTgKFdX",
+    "EObjjvbdznpQeDLx",
+    "EOcKjvbdjvXNcaxX",
+    "DnbjjvbdHDkWJbJj",
+    "DncKjvbdhkeENuDZ",
+    "DnbkKvbdnUtyjjSG",
+    "DoDKjvbdSQUHJfDw",
+    "DncKjvbdbUbHYLUI",
+    "EOcLKvbdNsTvGduQ",
+    "EPDLKvbdSZigsCvA",
+    "DncKjvbdMfcPlpUk",
+    "DoDLKvbdxrnIlrBg",
+    "DncKjvbdiLdcnVCy",
+    "EPCjjvbdmfeYNOHZ",
+    "DoCkKvbdjvWmcaxX",
+    "DoDKjvbdbUbHXkUI",
+    "DncKjvbdBhkBjiFj",
+    "DoDLKvbdNHColpVL",
+    "EOcKjvbdrykosAhO",
+    "DncLKvbdqGDeUVaI",
+    "DnbkKvbdhgJcZViu",
+    "DnbjjvbduLxXAtBX",
+    "EPCjjvbdYpleJNFR",
+    "EPDLKvbdQvmdClHc",
+    "DnbjjvbdJYTbIMRQ",
+    "DncLKvbdznpRFDMY",
+    "EOcLKvbdZnmiFEyj",
+    "DnbkKvbdrRuLOLAm",
+    "EObkKvbdhkeEOUby",
+    "DncLKvbdYlSEUOLm",
+    "DoCjjvbdhkdcmtby",
+    "DncLKvbdddnrCXDK",
+    "DoDLKvbdKaLHNCYR",
+    "EOcKjvbdcyxpYZQb",
+    "EPDLKvbdACqwjZhp",
+    "DoCkKvbdBsBDTevr",
+    "EObkKvbdeKJqvUzn",
+    "EObkKvbdcImJkGWx",
+    "DncLKvbdYSlAltOx",
+    "DncLKvbdlrYtyrdJ",
+    "EObkKvbdKxqJrztf",
+    "EOcKjvbdsQWPJcVf",
+    "DoDKjvbdkySqrxgU",
+    "EObjjvbdeEoRbXCj",
+    "EOcKjvbdHDkVjBij",
+    "DoDLKvbdCTBCsfXS",
+    "DoCjjvbdKCjDQibx",
+    "DoCjjvbdlhdTqUrB",
+    "DoDKjvbdTulQKTaR",
+    "DoCkKvbdRjxetfkT",
+    "EPCjjvbdEuyQQNKF",
+    "EPCjjvbdDoDKkXDE",
+    "DoCjjvbdsQWPJbuf",
+    "DoDKjvbdhuZdvqtb",
+    "EPDLKvbdiHKCyWJu",
+    "EPDLKvbdLFegaaQu",
+    "DoCjjvbdqZPHgRDx",
+    "DncKjvbdUWMPjUAq",
+    "DoDLKvbdTYKkmzjx",
+    "DoDKjvbdegjvSOQg",
+    "DnbkKvbdUtNTekvK",
+    "EObkKvbdNsTvGeVQ",
+    "DoDLKvbdfNFvgMjL",
+    "EOcLKvbdZQmEiNEq",
+    "EPDKjvbdBraDTfWr",
+    "EPDKjvbdNGcQNQVL",
+    "EPDLKvbdZyEKODMS",
+    "EOcKjvbdBvzdIdpW",
+    "EPCjjvbdACqwiyiQ",
+    "DoCjjvbddePRawCj",
+    "EPDKjvbdWWiXucdg",
+    "DoDKjvbdWexzUAPT",
+    "DnbjjvbdwXMBWBWV",
+    "EOcLKvbdUyHszLOn",
+    "EPCkKvbdOYOuzcnU",
+    "EPCkKvbdhancEwQq",
+    "DnbkKvbdjggLefOL",
+    "EPCkKvbdFjdsDIMu",
+    "DoDKjvbdrSUjmkBN",
+    "DoDLKvbdZjTIQGaf",
+    "DoDKjvbdMgDPmPtk",
+    "EPDLKvbdWRmwbFMD",
+    "DoCkKvbdzROmJKXA",
+    "DnbkKvbdrDdiQNvB",
+    "DnbjjvbduDCtwVoP",
+    "EOcLKvbdCIjbLJFj",
+    "EPDKjvbdXrkaMsnx",
+    "EPDKjvbdVhXvXfxz",
+    "DncKjvbdhbPDEwRR",
+    "DoCkKvbdpxoHgQcx",
+    "DoCkKvbduMXwBUBX",
+    "EObjjvbdNeEThhjd",
+    "DoCjjvbdirzhrkJz",
+    "DoDLKvbdaMkCTUlg",
+    "DncLKvbdWRnYBeLc",
+    "DnbjjvbdGBPRZJzm",
+    "EOcLKvbdeOeSjstS",
+    "DoDLKvbdmIctRVSB",
+    "DoCjjvbdZxdJnDMS",
+    "DoCkKvbdRpTgKFcw",
+    "DncLKvbdTukojTaR",
+    "DnbjjvbdKRZdoFme",
+    "DnbkKvbdURQoVUhN",
+    "DoDLKvbdyYJKBozL",
+    "EObkKvbdfNFwHMjL",
+    "DoDLKvbdZisIQHBf",
+    "EObkKvbdqFcdsuaI",
+    "DncLKvbdzoPqFDLx",
+    "DoDKjvbdSKxeuHLT",
+    "EPDKjvbdsBemLfjy",
+    "DoCjjvbdJbjCqJcY",
+    "DoCjjvbdNPxRVnGs",
+    "DncLKvbdGcjvJbKK",
+    "EOcKjvbdrWpMDIxq",
+    "EOcLKvbdQdDApQcr",
+    "DoDKjvbdZMRdTnLm",
+    "EOcLKvbddxZssrFz",
+    "EObjjvbdUtNTfLuj",
+    "EPCjjvbdLLBIWAKZ",
+    "DoCkKvbdgFlZmfgA",
+    "EPCjjvbdUVkoitAq",
+    "DoDKjvbdDncKjvcE",
+    "DoDLKvbdRpUHJfEX",
+    "EPDKjvbdLqvlzVQz",
+    "EPDKjvbdZMRdUOLm",
+    "EOcLKvbdCJLBkIfK",
+    "DncKjvbdaSFbhUFk",
+    "EPDLKvbdZoNheEzK",
+    "DncKjvbdUVlPjUAq",
+    "DnbkKvbdKNADyfuB",
+    "EObkKvbdZdwfzghb",
+    "EPDLKvbdZtIhxcrn",
+    "EObkKvbdGckViajK",
+    "DncLKvbdFfJqmiUR",
+    "DncKjvbdKWUfDdgJ",
+    "DoDKjvbdMtrqjmAX",
+    "EOcLKvbdsQWPKDVf",
+    "DoCjjvbdwtleRZMO",
+    "EObjjvbduaDxsPEh",
+    "EPDLKvbdKxqJrzuG",
+    "EOcKjvbdVAaprprZ",
+    "EObjjvbdEuxopMjF",
+    "DnbjjvbdyOTHwriD",
+    "EPDLKvbdrpVnibvG",
+    "EPDKjvbdkWWnDaww",
+    "DncLKvbdrXPkbiYq",
+    "DoDLKvbddxZssqez",
+    "EOcLKvbdHDkWJbJj",
+    "DncLKvbdEPCkLWcE",
+    "DnbkKvbdEXwkstTl",
+    "EObjjvbdqiAKEmOe",
+    "DncLKvbdjAQGaQGj",
+    "EPCjjvbdNeDtJJKd",
+    "EPCjjvbdvwMBWBVu",
+    "EPDKjvbdFejSOItR",
+    "EOcLKvbdNPwqWOHT",
+    "EPDKjvbdbsCjscia",
+    "EObkKvbdyYIiaoyk",
+    "DoDKjvbdLZQirzuG",
+    "EObjjvbdSLZGVGjs",
+    "DoCjjvbdAMgxsWzY",
+    "DoDLKvbdEObjjwCd",
+    "DnbkKvbdsPvOicWG",
+    "EPCkKvbdrJAKElne",
+    "EPCkKvbdauCGwjsh",
+    "DncLKvbdegkWRnQg",
+    "EPCkKvbdYpmEiNFR",
+    "DoDKjvbduaDxsPFI",
+    "DoCjjvbdcyxoxYqC",
+    "DoCkKvbdkMakzFHP",
+    "DnbjjvbdJbibqJbx",
+    "DnbkKvbdWWhxWDeH",
+    "DoCjjvbdssRsYzFD",
+    "DoDKjvbdpyPIHRDx",
+    "DncLKvbdwNWANDeN",
+    "DoDKjvbdJYUBglRQ",
+    "EObkKvbdXnRAYVVt",
+    "DoCjjvbdUWLpKTaR",
+    "DoDKjvbdTqROttgm",
+    "EPCkKvbdVqnXaeMD",
+    "EObjjvbdADRwiyiQ",
+    "DoDKjvbdlrZUyrci",
+    "EPDKjvbdvAdZSndh",
+    "DoCkKvbdzoQQeDLx",
+    "DnbkKvbdSQUGjFdX",
+    "EOcLKvbdqBJFAXIE",
+    "EObkKvbdSCEFLiZL",
+    "DnbjjvbdzoQQdcMY",
+    "DnbkKvbdpxngfqEY",
+    "DncLKvbdbsDLUEKB",
+    "DoCjjvbdXrlBMtOx",
+    "EObjjvbdKCjDQicY",
+    "DncLKvbdLrWlzUpz",
+    "EObjjvbdaaWEfQQX",
+    "EObjjvbdtlYWaTaX",
+    "DnbkKvbdMowpunGs",
+    "EObkKvbdSLYeuHKs",
+    "EObkKvbdTAEhhCOd",
+    "EPCkKvbdmSYtyrci",
+    "DncLKvbdYkqcsnLm",
+    "DoDLKvbdrylQTAgn",
+    "DncLKvbdJXtCIMRQ",
+    "EObkKvbdSBdElIyL",
+    "DoDLKvbdwygefYFS",
+    "DncKjvbdyXhibPzL",
+    "EPCjjvbduaDxsPFI",
+    "EObjjvbdZoNiFEzK",
+    "EPCjjvbdkNBkyeHP",
+    "EPCkKvbdWRnXadlD",
+    "DncLKvbdRWmdDLhD",
+    "DnbkKvbdmSYtzTDi",
+    "EOcKjvbdkVwODbXw",
+    "DncLKvbdQlxCZOUz",
+    "EObjjvbdbhlijfXY",
+    "EOcLKvbdXmqAXtut",
+    "EOcLKvbdmbKXXnnV",
+    "DoDKjvbdkHgMFfOL",
+    "EPCkKvbdfekymgHA",
+    "DoCjjvbdeKKRvUzn",
+    "DoDKjvbdkHfkefNk",
+    "DoCjjvbdyqPMiKXA",
+    "DnbjjvbdUQqOtuIN",
+    "EOcKjvbdEPCkKwDE",
+    "DoDLKvbdZRNFIleR",
+    "DnbjjvbdRacdlJZL",
+    "EOcLKvbdTukoitAq",
+    "EOcLKvbdZLrDtOMN",
+    "EOcLKvbdgKfzcGAE",
+    "EObjjvbdzjVQQESt",
+    "EOcLKvbdcIlijevx",
+    "EOcKjvbdGKdsDHmV",
+    "DncLKvbdKkBHvAJy",
+    "EOcKjvbdZMRctOLm",
+    "EPCkKvbdADRxKZiQ",
+    "EObjjvbdDwxLsssl",
+    "EPDLKvbdUxgszLPO",
+    "EPCkKvbdSQTfiedX",
+    "EPCjjvbdNeEUJIkE",
+    "DoDLKvbdpyPHfqDx",
+    "DnbkKvbdyOShXsJD",
+    "DncLKvbdLiBkpxAS",
+    "DoDKjvbdaaWEepQX",
+    "DoCjjvbdWSOYBeLc",
+    "EOcKjvbdLFegbAqV",
+    "EPDKjvbdffLzOGgA",
+    "EObkKvbdFkErbglu",
+    "DncLKvbdiZuFlROG",
+    "DncKjvbdegkWRnQg",
+    "DoDLKvbdQdDApRDr",
+    "EOcLKvbdeYZtURez",
+    "EObjjvbdrXQLcIxq",
+    "DoDLKvbdxZhGGXeS",
+    "DoDLKvbdGGKSOItR",
+    "EObjjvbdjhHLfFnL",
+    "EOcLKvbdUQpoUuHm",
+    "DoCkKvbdXrlBNUPY",
+    "DoDKjvbdJXtCIMRQ",
+    "DnbkKvbdZMSDsnLm",
+    "DncKjvbdCTBDUGWr",
+    "DncKjvbdbhlikGXY",
+    "DoDKjvbdXmqAYVWU",
+    "DnbjjvbdliDsqVRa",
+    "DnbkKvbdmajXYOnV",
+    "EObjjvbdJpyePGNe",
+    "DnbkKvbdCTAcUGXS",
+    "DoDLKvbdCDpBVjNG",
+    "EOcLKvbdxwhiaoyk",
+    "DoDKjvbdxVNFQyMO",
+    "EPCkKvbdVvhwvEEg",
+    "DnbkKvbdFWYoomJe",
+    "EOcKjvbdlrZUysEJ",
+    "EPDKjvbdqquKnKaN",
+    "DoCkKvbdTkunaVoJ",
+    "EOcLKvbdfHkVrOQg",
+    "EPDLKvbdiUzFWrUb",
+    "DoDLKvbdtAGqIABS",
+    "DoCkKvbdZRMdhmEq",
+    "DnbkKvbdNsUVfeVQ",
+    "EPDLKvbdqwPkbiZR",
+    "DoCkKvbdNUsSLNAX",
+    "DncKjvbdmpZxvKyC",
+    "EPCkKvbdLYqKSztf",
+    "EPDKjvbdZyEKODMS",
+    "EPDKjvbdNGbomPuL",
+    "DncKjvbdZMSDtNlN",
+    "EPCjjvbdTXjkmzjx",
+    "EObkKvbdBdQAvKMf",
+    "EOcLKvbdkySrTYgU",
+    "DnbkKvbdZoOIddzK",
+    "DoCkKvbdZMSDsmkm",
+    "EPCkKvbdCWzdIdpW",
+    "DncLKvbdBvzdIdov",
+    "DoCjjvbdaRfDHtFk",
+    "DnbkKvbdWeyZtAOs",
+    "DoDLKvbdnCJwYPOV",
+    "DoCjjvbdEYYLstUM",
+    "EOcLKvbdwtldqZMO",
+    "EPCjjvbdFVxoomKF",
+    "EObkKvbdyqPMhiwA",
+    "DoDLKvbdkxrrSxgU",
+    "DoCjjvbdeATqNYKG",
+    "DncLKvbdJKEAJpHE",
+    "DoCkKvbddndsLUTr",
+    "DnbjjvbdqFceUWBI",
+    "DoDLKvbdhkddOUby",
+    "DncKjvbdGKdrcIMu",
+    "EPCkKvbdelevflik",
+    "DoDKjvbdhaoDFWqR",
+    "DoCjjvbdYlSDsmlN",
+    "EPCjjvbdiZuGLpmf",
+    "EObkKvbdnCJvxPNu",
+    "DnbkKvbdhzUelRNf",
+    "DnbkKvbdZeYGzgiC",
+    "DoCkKvbdDnbkLWbd",
+    "DnbkKvbdnHFYMmfy",
+    "DoCjjvbdePEsKtTr",
+    "DnbjjvbdZQmEhleR",
+    "DnbkKvbdTkunaVoJ",
+    "DnbkKvbdFWZPpMjF",
+    "DoDKjvbdSwkMNzkY",
+    "EOcLKvbdwtldpyMO",
+    "EOcKjvbdhkdcmtby",
+    "DoCjjvbdNQXqWNfs",
+    "EPDKjvbdzjUpPdTU",
+    "DnbjjvbdqceJPnWB",
+    "EPDKjvbdUyHsyjoO",
+    "EPCkKvbdZshhxcsO",
+    "DncKjvbdqAiFAWgd",
+    "EObkKvbdgFkzOGgA",
+    "DncKjvbdmgFYNNgZ",
+    "DoDLKvbdDjHjWYKA",
+    "DnbjjvbdJbicRKCx",
+    "DnbkKvbdfNFwHMjL",
+    "EPCkKvbdWSNxBdlD",
+    "EPDLKvbdCJKbLJFj",
+    "EPDKjvbdEOcKkXDE",
+    "EPCkKvbdVrOYCElD",
+    "DnbjjvbdCIkBjhej",
+    "DoDLKvbddoFTKstS",
+    "DnbjjvbduDDVXVoP",
+    "EObkKvbdxwiKCPzL",
+    "DnbkKvbdZGvdAPTJ",
+    "DoDLKvbdBdPaVjNG",
+    "EOcKjvbdIHGzYwxH",
+    "DoCjjvbdGFjSNhsq",
+    "DnbjjvbdlYsSSxgU",
+    "EPCjjvbdqrUjnKaN",
+    "EOcLKvbdtvOXipsA",
+    "DoDLKvbdrounjCuf",
+    "DoCkKvbdFVyPomKF",
+    "EOcKjvbdNHCpNPtk",
+    "EPDLKvbdWeyZtAPT",
+    "EPDKjvbdjcLkQfuH",
+    "EOcLKvbdzHZMAMeX",
+    "DoCjjvbdUMWPBVni",
+    "EOcKjvbdHELWKBjK",
+    "DoDKjvbdMgComQUk",
+    "DnbkKvbdiGjDZWJu",
+    "DncKjvbdyqOmJKXA",
+    "DoDKjvbdVZITyjoO",
+    "DoCjjvbdzQoNJJwA",
+    "EOcLKvbdGAoQxizm",
+    "DoDKjvbdatagYKsh",
+    "EPDKjvbdSBceMJYk",
+    "DoDLKvbdMpYQvOHT",
+    "DncKjvbdiCOcFWpq",
+    "DoCjjvbdUGznLvvF",
+    "EPDLKvbdANIYrvyx",
+    "EPCjjvbdIwtCHkpp",
+    "EObkKvbdJSyBSmYM",
+    "EObkKvbdwuMdqYlO",
+    "EObjjvbdmuVZkKSG",
+    "DncLKvbdSPsfjFdX",
+    "DoDLKvbdSQUHJedX",
+    "DoDKjvbdiVZdwSUb",
+    "EPDLKvbdRjxfVGkT",
+    "EObjjvbdmpZyVkZC",
+    "DncLKvbdhzUelROG",
+    "EPCkKvbdxVMeRZMO",
+    "EOcKjvbdxxIiapZk",
+    "EOcKjvbdJSyBTNYM",
+    "EPDKjvbdMSXMzUpz",
+    "EObkKvbdJmADzHVB" };
+
+  public static void main(java.lang.String[] unused) {
+    try {
+      BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("bad.out"));
+      for (int i = 0; i < strings.length; i++) {
+        out.write(strings[i].getBytes());
+        out.write("\n".getBytes());
+      }
+      out.close();
+    } catch (Exception e) {
+      System.out.println("Some exception occurred");
+    }
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/runtime/7158800/InternTest.java	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,80 @@
+/*
+ * 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 7158800
+ * @run shell/timeout=400 Test7158800.sh
+ * @summary This test performs poorly if alternate hashing isn't used for
+ * string table.
+ * The timeout is handled by the shell file (which kills the process)
+ */
+import java.util.*;
+import java.io.*;
+
+public class InternTest {
+    public static void main (String args[]) throws Exception {
+        final String badStringsFilename = "badstrings.txt";
+
+        if (args.length == 0 || (!args[0].equals("bad") && !args[0].equals("normal"))) {
+            System.out.println("Usage:  java InternTest [normal|bad]");
+            System.exit(1);
+        }
+
+        FileInputStream fstream = new FileInputStream(badStringsFilename);
+        DataInputStream in = new DataInputStream(fstream);
+        BufferedReader br = new BufferedReader(new InputStreamReader(in));
+        String toIntern, toDiscard;
+        int count = 0;
+        long current = 0L;
+        long last = System.currentTimeMillis();
+
+        if (args[0].equals("bad")) {
+            while ((toIntern = br.readLine()) != null) {
+                toDiscard = new String((new Integer((int)(Math.random() * Integer.MAX_VALUE))).toString());
+                toIntern.intern();
+                count++;
+                if (count % 10000 == 0 && count != 0) {
+                    current = System.currentTimeMillis();
+                    System.out.println(new Date(current) + ": interned " + count + " 0-hash strings - last 10000 took " + ((float)(current - last))/1000 + "s (" + ((float)(current - last))/10000000 + "s per String)");
+                    last = current;
+                }
+            }
+        }
+        if (args[0].equals("normal")) {
+            while ((toDiscard = br.readLine()) != null) { // do the same read from the file to try and make the test fair
+                toIntern = new String((new Integer((int)(Math.random() * Integer.MAX_VALUE))).toString());
+                toIntern.intern();
+                count++;
+                if (count % 10000 == 0 && count != 0) {
+                    current = System.currentTimeMillis();
+                    System.out.println(new Date(current) + ": interned " + count + " normal strings - last 10000 took " + ((float)(current - last))/1000 + "s (" + ((float)(current - last))/10000000 + "s per String)");
+                    last = current;
+                }
+            }
+        }
+        in.close();
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/runtime/7158800/Test7158800.sh	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,91 @@
+#!/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.
+# 
+#
+#   Run test for InternTest.java
+#
+
+if [ "${TESTSRC}" = "" ]
+then TESTSRC=.
+fi
+
+if [ "${TESTJAVA}" = "" ]
+then
+  PARENT=`dirname \`which java\``
+  TESTJAVA=`dirname ${PARENT}`
+  echo "TESTJAVA not set, selecting " ${TESTJAVA}
+  echo "If this is incorrect, try setting the variable manually."
+fi
+
+if [ "${TESTCLASSES}" = "" ]
+then
+  echo "TESTCLASSES not set.  Test cannot execute.  Failed."
+  exit 1
+fi
+
+# set platform-dependent variables
+OS=`uname -s`
+case "$OS" in
+  SunOS | Linux )
+    NULL=/dev/null
+    PS=":"
+    FS="/"
+    ;;
+  Windows_* )
+    NULL=NUL
+    PS=";"
+    FS="\\"
+    ;;
+  * )
+    echo "Unrecognized system!"
+    exit 1;
+    ;;
+esac
+
+JEMMYPATH=${CPAPPEND}
+CLASSPATH=.${PS}${TESTCLASSES}${PS}${JEMMYPATH} ; export CLASSPATH
+
+THIS_DIR=`pwd`
+
+${TESTJAVA}${FS}bin${FS}java -fullversion
+
+${TESTJAVA}${FS}bin${FS}javac -d . ${TESTSRC}${FS}InternTest.java
+
+cp ${TESTSRC}${FS}badstrings.txt .
+
+${TESTJAVA}${FS}bin${FS}java -XX:+PrintStringTableStatistics -XX:+TraceSafepointCleanupTime InternTest bad > test.out 2>&1 &
+C_PID=$!
+
+sleep 60
+
+ps | grep ${C_PID} | grep -v grep
+
+if [ $? = 0 ]
+then
+    kill -9 ${C_PID}
+    echo "Test Failed"
+    exit 1
+else
+    echo "Test Passed"
+    exit 0
+fi
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/runtime/7158800/badstrings.txt	Fri Aug 03 20:23:25 2012 +0100
@@ -0,0 +1,30001 @@
+EOcLKvbddZyPxYpb
+DncLKvbdPxmAGrqj
+DoCjjvbdpxoIHQdY
+EPCkKvbdqYoHfqEY
+DnbkKvbdezvYdiUX
+DnbjjvbdeEoRbXCj
+EObkKvbdbsCkUEKB
+EOcLKvbdnUtyjiqf
+DncLKvbdRWnDcMHc
+DoCkKvbdrSUkOLAm
+DncLKvbdfNFwGmJk
+EPDLKvbdvAdYroFI
+DoDLKvbdiGibyViu
+DncLKvbdYqNEhmFR
+DoCkKvbdEARhlzXX
+DncLKvbdSZjHsCvA
+DncKjvbdqTsgRqkU
+DnbjjvbdqAiFAXHd
+EPDKjvbdGcjvJaij
+DnbkKvbdwtldpxkn
+DoDKjvbdYkrETnMN
+EPCjjvbdbBWEfQQX
+EPCjjvbduMXwAtBX
+DncLKvbdbsCkTcia
+DoCjjvbdczYpYZRC
+EOcKjvbdFeiqmhsq
+DoCkKvbdKCicQibx
+EOcKjvbdZLrEUOLm
+DoCjjvbdaNKbStmH
+DoDKjvbdJbjDQjDY
+EPCkKvbdemFwGmKL
+EPDKjvbdZQleImEq
+DncKjvbdZjShPfbG
+DnbjjvbdqYnhHREY
+DoCkKvbdaRfDIUGL
+DoDKjvbdLrWlyuQz
+DnbjjvbdZisHofaf
+EObjjvbdhtydvrUb
+DnbjjvbdRotHKGEX
+EObjjvbdNeEThhkE
+EPCjjvbdZtJJZESn
+DoDKjvbdnPyxvLYb
+EPDKjvbdeEoRbWbj
+EOcLKvbdFxttaEXb
+EObjjvbddwystRez
+EPCjjvbdJpzEnenF
+DnbkKvbdTppntuIN
+EPCkKvbdTukpKUBR
+DnbkKvbdhlFEOUcZ
+EObkKvbdlhdUQuRa
+DnbjjvbdkClKqHUg
+EOcKjvbdqTtGqqkU
+DncKjvbdtkwvaUBX
+DoDKjvbdsQWOjCuf
+DncLKvbdEKIJuwjA
+DncKjvbdGLErcIMu
+EOcLKvbdNPwpumfs
+EObkKvbdnVUzLJrG
+DoCkKvbdcTDKsdKB
+DncKjvbdKRZdoFme
+EOcLKvbdemFvgNKL
+EPCkKvbdznopdblY
+EPDLKvbdOYPVzdOU
+DnbjjvbdsZlPsAhO
+DoDLKvbdKCjDRKDY
+DoCkKvbdhuZeXSVC
+EPDKjvbdOStVgEtp
+DncLKvbdvwMAvBWV
+EPDKjvbdBcoaWJlf
+EOcKjvbdZxdKODMS
+DoCjjvbdbsCkTcjB
+EOcLKvbdwWlAuaWV
+DnbjjvbdFejRnJUR
+DnbjjvbdmIdTqVSB
+DnbkKvbdqBIeAWhE
+DncKjvbdrMzJyMIJ
+DoCkKvbdZGvdAOsJ
+DncLKvbdjggLfFnL
+DoCjjvbdYqNFJMdq
+DoCkKvbdqZPHfqDx
+DncLKvbdOEdThiLE
+DoCkKvbdZirgpGaf
+EPDLKvbdziuQPdSt
+EObkKvbdKQyeOenF
+DoDLKvbduaDySndh
+DoCjjvbdVUNUGLvK
+DncKjvbdAMhYrvzY
+DnbkKvbdnQZxvKxb
+EPCjjvbdBhjakJFj
+DncLKvbdmfeYNNfy
+DoDLKvbdjlbLydfo
+DoDLKvbdpyPIGpcx
+EOcLKvbdnVUzLJqf
+DoCjjvbdmJETqVSB
+DoDLKvbdJTZAsMxM
+DoCkKvbdnQZxvLZC
+DoDKjvbdACqwizJQ
+DncKjvbdvBEZSoFI
+DncKjvbdGckVjCJj
+DncLKvbdiMFENtcZ
+Dnbjjvbdjuvmcaww
+DnbkKvbdZyEKNblS
+DoCjjvbduMYXBUBX
+DnbjjvbdFWYopNJe
+DoDKjvbdelfXGljL
+DnbjjvbdakLenmcA
+EPDKjvbdfILWRmpg
+EObjjvbdSLYeuHLT
+DoCjjvbdMfbolotk
+EPDLKvbdrRuKnKaN
+EOcKjvbdyzdnRhIh
+DoDLKvbdGAoRZJzm
+DoCjjvbdhlFDnUcZ
+EPDLKvbdmpZyVkYb
+DncKjvbdTpqPUuIN
+DncLKvbdHDjvJaij
+EPDLKvbdYlRcsmkm
+EPDLKvbdvlvAMdFN
+DncKjvbdIsZArmYM
+EOcLKvbdegjuqnQg
+EOcLKvbdZQmFJNFR
+DoCjjvbdZxdJmcMS
+EPCkKvbdlZTSTYgU
+DoDKjvbdqceJPnWB
+DncLKvbdVgwuxGxz
+DncKjvbdDnbkLXDE
+EPDLKvbdatbHYKsh
+DncKjvbdEzsqFLbi
+EPDLKvbdnVVZkKRf
+EOcKjvbdKeegbBQu
+EPCkKvbdKfGHaaRV
+EPDKjvbdmIctRVRa
+EPCjjvbdRMxBxnUz
+DnbjjvbdJYTbILpp
+EPCkKvbdTAEiHbPE
+EOcLKvbdfelZnGgA
+DoCjjvbdOStWGeUp
+EOcLKvbdemGXHNJk
+DoDKjvbdYTMAmUOx
+EPCkKvbdpyOhGpcx
+EPCkKvbdAMgxsWzY
+DnbjjvbdYkrETnMN
+EPDLKvbdUQqPUtgm
+DncKjvbdehKurNqH
+DoCjjvbdZMSETnLm
+DoDKjvbdIHGyyXwg
+EObjjvbdXGYzUAPT
+DoCjjvbdhbPCeWqR
+DoCkKvbdKNADzGuB
+DnbjjvbdFeirOJTq
+DncLKvbdaRecHtFk
+DnbkKvbdzoPpeClY
+EObkKvbdZRMeJMeR
+DnbjjvbdYfvdAPSi
+DncLKvbdJcKCqJcY
+EOcLKvbdqvokbhyR
+DoDLKvbdrRuLNjaN
+DoCjjvbdTlWPBWOi
+DoCkKvbdjvWnEBxX
+DoDLKvbdTkunaVoJ
+DoCkKvbdQZNAHTSK
+EObjjvbdqwPkbhyR
+EOcLKvbdNHDPlpUk
+DncLKvbdIHHZxxYH
+DncLKvbdtkxXAtAw
+DncLKvbdSCEFMJZL
+DnbjjvbdZQmEhldq
+DoCjjvbdNGbolotk
+DnbjjvbdnCKWwnmu
+DncLKvbdzHZMANEw
+DoDKjvbdmttykJrG
+DnbkKvbdlrZUzSci
+EPDKjvbdSKyGVHKs
+DoCjjvbdKVuGEFGi
+EPCjjvbdCIkBkIej
+DncLKvbdzHZMAMeX
+DnbkKvbdaSFbgsek
+DncLKvbdHDjujBij
+DoDKjvbdGZVUaDwb
+DnbjjvbdZnnJFEzK
+DoCkKvbdtcDUwWOo
+DoCkKvbdlBMoNALA
+EOcKjvbdNsUWHFUp
+DoDLKvbdVUNUFlVj
+DnbkKvbdhkdcnUcZ
+DncLKvbdLiBkqYAS
+EOcKjvbdzoPpdcLx
+EPDKjvbdijGIJmXr
+EOcKjvbdZisHofaf
+DoDLKvbdeOdrkUUS
+DoDLKvbdnPyxvKxb
+EPDKjvbdIxUBhMRQ
+DncLKvbdlhctRUqa
+DoDLKvbdmgFXlnGy
+DncKjvbdCJKbKiGK
+EOcLKvbddndrjtUS
+DnbjjvbdkDLjqGuH
+DncKjvbdmIcsptqa
+DoCkKvbdvvlAvBWV
+EObjjvbdjblLQftg
+DnbjjvbdCEQBWKMf
+DnbjjvbdBdPaVilf
+DoCkKvbdZxcjODLr
+DoCkKvbdEObjjwCd
+EPDKjvbdyTNhlqbH
+EPCkKvbdUMVoAvPJ
+DncKjvbdUxhUZjoO
+DncKjvbdqqtjmkAm
+DncKjvbdKfGICBRV
+EPCjjvbdVrOXaeLc
+EPDLKvbdwXLaWBWV
+EPCkKvbdjblKqHUg
+DnbjjvbduDCuWuoP
+EPDKjvbdNGbpMouL
+EObjjvbdBcoaVjNG
+DncLKvbdrWpMDIxq
+DncLKvbdhaoCdwRR
+DnbkKvbdFxtuBDwb
+DncKjvbdIjEAKPgE
+EOcLKvbduCbuXVoP
+DoDKjvbdZtIiZDsO
+DnbjjvbdEztRElCi
+DncLKvbdxmsHwsJD
+DnbjjvbdRbEElIxk
+DoDKjvbdWHwvXgYz
+EOcKjvbdQlwbYnUz
+EOcLKvbdVTltFkuj
+DncKjvbdliETptqa
+DnbkKvbddoErjtTr
+DoCkKvbdgPazvdXh
+DncKjvbdySmhlqag
+DoCjjvbdbPgHDkzd
+DoCkKvbdFWZPomKF
+EObjjvbdssSSxydc
+EObjjvbdzQnliJwA
+EObkKvbdKCjCpibx
+EPCjjvbdpyOhHREY
+DncLKvbddjJqutzn
+EObkKvbdBdQAujMf
+EPCkKvbdLAjflbXq
+DncLKvbdLBLGlaxR
+DoDLKvbdrpWPJbuf
+DoCjjvbdEKHiuxKA
+DoCjjvbdXsMAlsnx
+EObkKvbdptTgSSLU
+DoDKjvbdnHFXmNfy
+DncKjvbdCJKbKhej
+EPCjjvbdhlEdOUby
+EOcKjvbdKWUfEFGi
+DoDKjvbdZQmFJMdq
+EPCjjvbdiGjDZWKV
+EObkKvbdVAbQrprZ
+DoDKjvbdfekzNgHA
+DoDLKvbdnHEwlmgZ
+DncKjvbdwzHeexEr
+DoCjjvbdmpZxujyC
+EPDKjvbdwMvAMcdm
+DoCjjvbdfHkVrNqH
+EPCkKvbdYzbfRiuy
+EPCkKvbdZtIiZDrn
+DnbjjvbdjvWnDbYX
+DoCjjvbdOStVgEtp
+EPDLKvbdZMSETmlN
+EPDKjvbdBhjajhej
+EPCjjvbddoFTLUUS
+DnbkKvbdsQVoJcWG
+EPCjjvbdrEFJQNvB
+DoCjjvbdMpYRWOGs
+EOcLKvbdZirgpHBf
+EPDLKvbdyOTIXsJD
+DoCkKvbdKRZdnfNe
+DnbjjvbdbBWFFoow
+EPCjjvbdgFlZnHHA
+DnbkKvbdGGJrOIsq
+DoDLKvbduDCtwWPP
+EObjjvbdNddUIhjd
+DnbjjvbdxsNiMqag
+EObjjvbddeOrCWbj
+EObjjvbdPxmAGsRj
+EOcLKvbddeOrCXDK
+DoDLKvbddeOrBwCj
+DoCjjvbdVqnYCElD
+DnbkKvbdUyIUZjoO
+EObjjvbdeFOrCXDK
+EObkKvbdVrNxCFLc
+EObjjvbdTfzmkwWF
+EOcKjvbdIHGzZYYH
+EPDKjvbdtbbuXWPP
+DoCjjvbdZisIQHBf
+EObjjvbdbsCkUDjB
+EPCkKvbdVwJXudFH
+EPDKjvbdrouoKDVf
+EPCkKvbdFyVVBEYC
+DncLKvbdZnnIeEzK
+EPDLKvbdxVNFQxkn
+DoDKjvbdpxnggRDx
+DoDLKvbdqZOgfpcx
+DncKjvbdCIjakJGK
+EPCkKvbdCJLBjhej
+DoDLKvbdnPzYvKxb
+EOcKjvbdqTsgSRkU
+EOcLKvbdLBLGlaxR
+DoDLKvbdcbTMrAUN
+DncLKvbdzitoodSt
+DoDKjvbdJvUfDdfi
+EOcLKvbdHDjvKCJj
+EPCkKvbdeOeTKssr
+DnbkKvbdlYrqsYft
+DncLKvbdiiehKMxS
+DncKjvbdURQoVUhN
+DnbkKvbduMYXBUAw
+DoDLKvbdSPtHJfEX
+EObkKvbdqBJFAWgd
+EOcKjvbdFpATWgFy
+DoDLKvbdBsBDTfXS
+DncKjvbdjhHLfFmk
+DoCjjvbdCJKakIfK
+DnbkKvbddoFSjtTr
+EObkKvbdANIYsWzY
+EObjjvbdCTAbtFvr
+EObjjvbdrRtkOLAm
+DnbkKvbdkxsSTYgU
+DoCjjvbdnBiwXnmu
+EObjjvbdwtmEqYlO
+EPDKjvbdrylQTAhO
+DoDLKvbdtbbtvvOo
+EPCjjvbdZLrETmlN
+EPDLKvbdWXJYWDdg
+DoCkKvbdKQzFOfOF
+EPCjjvbdwzIFfXeS
+DncKjvbdRjyFuHLT
+EPDLKvbdULunaWPJ
+DncKjvbdUxhTykOn
+DnbkKvbdJcKCqKDY
+EPDLKvbdcbSmSATm
+DnbkKvbdegjurNqH
+EPDKjvbdZjTIQGbG
+EPCjjvbdiLddNuCy
+DoCjjvbdZQldiNEq
+EOcLKvbdakMGPODA
+EObjjvbdnHEwlmgZ
+EOcLKvbdBsAcUGXS
+EPCkKvbdiVZdwSUb
+EOcLKvbddCTNSAUN
+DnbkKvbdEXxMUUUM
+DncKjvbdYpldiMeR
+DoDKjvbdNddTiIjd
+DoDLKvbdZLqdUNlN
+EPCkKvbdiBncFWpq
+DncLKvbdiCPDEvqR
+EOcKjvbdUyHszKoO
+DncKjvbdhtydvqtb
+EPCjjvbdpxoHgQcx
+EObkKvbdkWWnDaxX
+DnbjjvbdBhkBkJFj
+DoCkKvbdRacdkhyL
+EOcLKvbdZjTHpHCG
+EPCkKvbdMowqWOGs
+DncLKvbdegjurNpg
+EObjjvbdfMfWfmKL
+EPDLKvbdZirgpGaf
+DoDLKvbdiZuFlQnG
+DncLKvbdFxuVAcxC
+EObkKvbdZisHofaf
+EOcKjvbdJSyBSmYM
+EPDLKvbdVYgtZkPO
+EOcKjvbdRbEFMJYk
+DncLKvbdrEFIonWB
+DncKjvbdKDJbqJcY
+EOcLKvbdhfjCxuiu
+EObjjvbdLLAhWAKZ
+DoCkKvbdRXNcblID
+DoDLKvbdcbSmSATm
+EOcLKvbdwWlAvAuu
+EObkKvbdiBnbdvpq
+DoCkKvbdNQXpumgT
+DncLKvbdkVwOECYX
+DnbkKvbdfoazwDxI
+DoDLKvbdbBWFFpPw
+DoDLKvbdvBDxsPEh
+EPDKjvbdJqZdoFme
+DoDLKvbdIryArmXl
+EPCjjvbdANIZSwZx
+EPCkKvbdVhYVxGxz
+DncKjvbdLAjgNCYR
+DncKjvbdxxIjCQZk
+DncKjvbdbiNKKewY
+EPCjjvbdlrZVZsEJ
+EPDKjvbdIryAsMwl
+DoCkKvbdtAHRIAAr
+EPDKjvbdJmAEZfuB
+EPCkKvbdZjSgogBf
+DoDLKvbdOXnuzcnU
+DnbkKvbdehKvRnQg
+EObjjvbdZyDimbkr
+DoDKjvbdmajWwoOV
+EOcKjvbdkMalZeHP
+EOcKjvbdIjEAJpHE
+EPCkKvbdDihKVxKA
+DncKjvbdNddUIiKd
+EObjjvbdqdFIpOWB
+DoCkKvbdxnShXsJD
+DoDLKvbdjmBkzEfo
+EOcLKvbdatagYLTh
+DoCjjvbdVhYVxHYz
+DnbjjvbdJbjDRKDY
+EPCjjvbdLBLHNCYR
+DnbjjvbdnGeYNOGy
+EOcLKvbdUsmTekvK
+EPCjjvbdtkxXBTaX
+EPCjjvbdzoPqFCkx
+DncKjvbdCIjbKhej
+DncKjvbdZLqdTmkm
+DoDKjvbdsPunicVf
+EOcKjvbdmgFXmNgZ
+EObkKvbdiMFENuCy
+DoDKjvbdhanbeXRR
+EObkKvbdACqwiyhp
+DncKjvbdZisIQHBf
+EPCjjvbdgQBzwDwh
+DnbjjvbdyYJJaoyk
+DoDKjvbdxUldqZMO
+EObkKvbdkClLQgVH
+EPCjjvbdZQldiMeR
+EPDLKvbdZyEKOClS
+EPDLKvbdcIlikFvx
+DoDKjvbdrzMQTBHn
+DnbjjvbdVYgtZkPO
+DoDLKvbdHEKuiajK
+EPCkKvbdczZQXxqC
+DoDKjvbdrDdiQNua
+DncLKvbdcImKLGWx
+DoCjjvbdVYgtZkPO
+EPDLKvbdZnnIeFZj
+EPDKjvbdMIakqYAS
+DoCkKvbdSLYfUgLT
+EPDLKvbdiCObdvpq
+DnbjjvbdRpUHKFcw
+DoDLKvbdIHHZyYXg
+EPCjjvbdypoMhiwA
+DnbkKvbdCEPaVjMf
+DnbkKvbderAvzlDP
+DnbkKvbdZQleImFR
+EOcKjvbdKRZdneme
+DoDLKvbdiBnbeXQq
+DncLKvbdEPDKjvcE
+EOcLKvbdauCGwkTh
+DncLKvbdEvZQPmJe
+EPCkKvbdURQnuVIN
+DncLKvbdegjvSOQg
+EPCjjvbdKaKgMawq
+DnbkKvbdRzKISbvA
+DncLKvbdiLdcnUcZ
+EPDLKvbdkDMKpfuH
+DoDLKvbdRbDdkhyL
+DnbjjvbdDwxMUUTl
+DnbkKvbdrpWPKCuf
+DnbkKvbdNVSqjmAX
+DoDKjvbdRbDeMIxk
+EOcLKvbdcyxpXyRC
+DncLKvbdRMwbYnUz
+EObjjvbdqlzJxlHi
+DoCkKvbdJYUCIMQp
+DncLKvbdLZQjSzuG
+EOcKjvbdxVNEqYkn
+DnbkKvbdZoOIeFZj
+DoCjjvbdBraCtFwS
+EOcLKvbdliDsqVSB
+EPCkKvbdeATqNXif
+DncLKvbdkMbLydgP
+EObjjvbdZxdJmbkr
+DoCjjvbdraellHLZ
+EObkKvbduDCuWvPP
+DoCkKvbdpstGrSLU
+DoCjjvbdLGFgbBQu
+DnbkKvbdhtzFWquC
+EObjjvbdoAKztHdO
+EPDLKvbdatafxKtI
+EPDKjvbdkWXNcaww
+DoCkKvbdwkXEHzzG
+EObkKvbdmgEwmNgZ
+DncKjvbdBiLCLJFj
+DoCjjvbdeOdsKssr
+EOcLKvbdfILWSORH
+EObkKvbdCDpAujMf
+EPDKjvbdKDKDQibx
+DoDKjvbdVUMtGLuj
+EObkKvbdrXQMCiYq
+DncKjvbdePEsLTtS
+DncLKvbdDxYLtUTl
+EPCkKvbdGYuVBEYC
+DncLKvbdNeEUIiKd
+EPCkKvbdpxoIHRDx
+EObjjvbdFkEsDHlu
+EObjjvbdssSSxzFD
+DoCkKvbdUtNTfMVj
+DnbjjvbdJcKDRKDY
+DncKjvbdqiAKEmOe
+DoDKjvbdtlXwAtBX
+DnbkKvbdxmsIYTIc
+EObkKvbdLrXMzUpz
+DoCjjvbdkxsSSxft
+DncKjvbdQlwaxnUz
+EObkKvbdjhGlFfNk
+EPCkKvbdxsNhmRag
+DoDLKvbdMfcPmQUk
+DoDKjvbdQvnEDLhD
+EObjjvbdVgxVxHYz
+DoDLKvbdlrYtyrdJ
+DoCjjvbdezvYeIsw
+DncLKvbdNddTiIjd
+EPDLKvbdGGJrNiUR
+EPDLKvbdRzJhTDWA
+EPCjjvbdvvkaWBVu
+EOcKjvbdRXNdCkgc
+EOcKjvbdQZNAHTSK
+EPCkKvbdsCGNLfkZ
+EOcLKvbdDwwktTsl
+EOcLKvbdqlzJyLgi
+EOcLKvbdxsNiMqag
+EOcLKvbdhzVFlROG
+EOcKjvbdEztRFMCi
+DnbkKvbdqiAJdmPF
+EPDLKvbdjcMKqGtg
+EObkKvbdTlWOaWOi
+EPDLKvbdURRPUuHm
+DoDKjvbdelfWgNKL
+EOcLKvbdGAnqZJzm
+EObjjvbdGZUuAdXb
+DoDLKvbduLwwAtAw
+DoCjjvbdZjTIQGbG
+EPCjjvbdRNXbYnUz
+EPDLKvbdiLeENtby
+EObjjvbdMowpunGs
+EOcKjvbdbiNJjevx
+DoDKjvbdEYYLstTl
+DoDLKvbdqUTfrRjt
+DoDKjvbdbsCkUEJa
+DoDKjvbdXsMBNUPY
+EPCjjvbdRNXaxnUz
+DoDLKvbdNGcQNQUk
+DnbjjvbdEARiMywX
+EPDKjvbdSKxfUfkT
+DncKjvbdhtyeXRtb
+DncKjvbdZLqcsnLm
+EObkKvbdZnmheEzK
+EObjjvbdtbcUvuno
+DnbjjvbdrzMQTBHn
+DnbjjvbdDwwktTsl
+EPDKjvbdkxsSTYgU
+DoDKjvbdIryArlxM
+DoDKjvbdnBivxOnV
+DoDKjvbdeATplwif
+EOcLKvbdKeegbApu
+EPCjjvbdMgDQMotk
+DoCjjvbduCbtwWOo
+DnbkKvbdyNsHwrhc
+DnbkKvbdtvNxJpsA
+EOcLKvbdqAheAWgd
+DoCkKvbdURQoUtgm
+EOcKjvbdqceIpOWB
+DoCkKvbdVwIwudFH
+DnbkKvbdbLMFnmcA
+EOcLKvbdZjTHpHBf
+EOcKjvbdRXNdCkhD
+EPDLKvbdiHJcZViu
+DoCjjvbdxxIjCPzL
+DnbkKvbdBcpBWJmG
+EPCkKvbdZyEKOCkr
+EPDKjvbdOTUWHFVQ
+DoCjjvbdIGgZxwwg
+EPDLKvbdFjeSbhMu
+EPDLKvbdhgKCxvJu
+EOcLKvbdNsUWGdtp
+EPDKjvbduVnXipsA
+DncLKvbdGYuVBEXb
+EPDLKvbdZtIhyESn
+DoDKjvbdZxdJmcLr
+DoCjjvbdUsltGLuj
+DoDKjvbdDoDLKvbd
+DncLKvbdrDdhpNvB
+EPDLKvbdKCjDRJbx
+DoDLKvbdxLWdHzyf
+EObkKvbdrzMQTAhO
+EOcLKvbdOFDtJJKd
+EPCkKvbdrSVKmjaN
+EOcKjvbdWWiYVdEg
+EOcKjvbdWWhwvDdg
+DncKjvbdpstHRqjt
+EPCkKvbdKWVFceGi
+DoCkKvbdZjShPfbG
+DoCkKvbdSxKlNzkY
+EPDLKvbdIwtCHkqQ
+EOcKjvbdsCGNLgLZ
+DncKjvbdzaAOfgCM
+DoDLKvbdxmrhYSiD
+DncLKvbdfMfWgMjL
+EPDKjvbdqFdEsuaI
+EOcLKvbdiLeDnUcZ
+DoCjjvbdKVuFceHJ
+DoCjjvbdfekzNgHA
+EOcKjvbdOFEThiLE
+EPDLKvbdqceJPnWB
+DoDLKvbduCbtwWOo
+DncKjvbdTqROtuIN
+DncKjvbdpedFUWBI
+DoDLKvbdrEFJQNua
+DoDLKvbdyXhjCPyk
+EPCkKvbdJYUBhLqQ
+EPCkKvbdtcCuXVno
+DoDLKvbdZLrEUOLm
+EPCkKvbdpstGrRjt
+DncLKvbddePSCXCj
+EObkKvbdauCHXjsh
+DoDLKvbdkHfkefNk
+EObjjvbdMRwMzUpz
+EObjjvbdaMkCTVNH
+DoCkKvbdGGJrNhtR
+EPDLKvbdvBDxrneI
+EPDLKvbdIHHZxwxH
+EOcLKvbdrJAJdmPF
+EOcKjvbdGZUuAdXb
+EOcLKvbdbUbHYLUI
+DnbjjvbdJzofYEAN
+EPDKjvbdFxtuBDxC
+DnbkKvbdQvnDbkgc
+EPDKjvbdJmADzGta
+DoDKjvbdZRMdhleR
+DnbkKvbdsrqsZZeD
+EObkKvbdrovPJbuf
+EPCjjvbddeOqbXCj
+EObjjvbdtcDVXVoP
+DncKjvbdMfbpNQVL
+DoCkKvbdhbPCeXQq
+DoCkKvbdNHComQVL
+EObjjvbdvBDxroFI
+EPCjjvbdnBivwoNu
+EObjjvbdbhljKewY
+EPDKjvbdZyDimcMS
+EObkKvbdWSOXbElD
+EOcKjvbdTfznMXVe
+EPCjjvbdZtJJYcsO
+DoCjjvbdRjxfVHLT
+DoCkKvbdVTltGMVj
+DncKjvbdYfwEAOri
+DncKjvbdYkrEUOMN
+EObkKvbdqGEEsuaI
+DncLKvbdjJfHimXr
+EPDLKvbddndsLUTr
+DnbkKvbdqBJFAWhE
+EPDLKvbdEOcKjwDE
+EPCkKvbdtvOYJqTA
+DncLKvbdkyTRsZHU
+DoCjjvbdTppnuVIN
+DncLKvbdwyhFeweS
+DncKjvbdsBelkgKy
+DoCjjvbdKDKCqJcY
+DoCjjvbdkClKqHVH
+DoCjjvbdcTCjtDia
+EPDLKvbdUVkpJtAq
+EPDLKvbdRyjITCvA
+DnbjjvbdJuuFcdgJ
+DoDKjvbdrJAJdmOe
+DncKjvbdJcJbqKCx
+DoDLKvbdJcJbqJcY
+DoDKjvbdeEoSCXDK
+DoDLKvbdSwjlNzkY
+EObjjvbdzitopDrt
+DoCkKvbdKWVGEEgJ
+DncKjvbdpssfqrKt
+EOcLKvbdUMWPBVoJ
+DncKjvbdyzdmrIIh
+EPCjjvbdxUldqZLn
+DoDLKvbdySnImRbH
+DoCjjvbdGdKvJaij
+DoCkKvbdxZgeewdr
+EObkKvbdiLddNuDZ
+DnbjjvbdSCDdkiZL
+DncKjvbdznpREcMY
+EOcLKvbdaRebhTfL
+DnbjjvbdZQldiMdq
+EPCjjvbdbrbjtEKB
+EOcKjvbdEARiMzXX
+DoDLKvbdXrkaNTnx
+EPCkKvbdQZNAHTRj
+DoDLKvbdEzspeLcJ
+EPCjjvbduVnYKRTA
+EObjjvbdJXtBhMQp
+EPDKjvbdeOdrjssr
+EPCjjvbdLqwMytpz
+EPDKjvbdUMVoBVoJ
+DncKjvbdRpUGifDw
+EPDLKvbdZyDinDLr
+DnbkKvbdNrsufeVQ
+EPCkKvbdZMSDtNlN
+EPCkKvbdySnJNSCH
+EPCjjvbdfMevfljL
+DncLKvbdXsMBNTnx
+DnbkKvbdpxoHfqDx
+DncLKvbdUQpntthN
+DncKjvbdIsZArlwl
+DoDLKvbdZGwEAOsJ
+EOcKjvbdVvhwvDdg
+EOcLKvbduWNxJqTA
+EPCjjvbdHEKvJaij
+DoDKjvbdrpWOjCuf
+DncLKvbdrpWOjDVf
+DoCjjvbdIHGzYwwg
+DoDLKvbdpxoIGqEY
+DoDLKvbdJcJbqKDY
+DoCjjvbdRWmdClHc
+EPCjjvbdFWYopNJe
+DncKjvbdmfdwlmfy
+DoCkKvbdxUleQxlO
+EObjjvbdnGdxMnGy
+EPCjjvbdvvlAvBVu
+DncLKvbddndsKssr
+EObjjvbdZMRcsnLm
+EOcKjvbdFxttaEXb
+DncKjvbdVUNTfMVj
+EOcLKvbdNrtWHFUp
+DoDKjvbdwuMdqYlO
+EPDLKvbdrXPkbhxq
+EObjjvbdrEFIpNua
+EObjjvbdziuQQDrt
+EOcLKvbdqYoIGpcx
+DnbjjvbdsQVoJcVf
+EObkKvbdkDMKpgUg
+EObjjvbdvBDyTPFI
+DncKjvbduCbuWvOo
+EPCjjvbdkVvnECYX
+DncLKvbdZGvdAOri
+DoCkKvbdrXPlDJZR
+EOcLKvbduCcVWvOo
+DoDKjvbdCEPaWJlf
+EPDKjvbddoErjssr
+DncKjvbdACqxKZiQ
+EPCjjvbdUVlPitAq
+EPDKjvbdjJfHjMxS
+EObkKvbdAMhYsWzY
+DoDKjvbdnBivxOmu
+EOcLKvbdbiNKKfXY
+EPDKjvbdYqMeIleR
+EObkKvbdJmADygUa
+EObjjvbdEPDLLWcE
+EPCjjvbdrXPkcIxq
+EOcLKvbdliDtQtqa
+DoCjjvbdmoyxujyC
+EPDLKvbddoFTLTsr
+EOcLKvbdCWzdJEpW
+DnbjjvbdrEEhpOWB
+DoDKjvbdZLrDtNkm
+EOcLKvbdLFfHbAqV
+EOcKjvbdmttzLKSG
+EOcLKvbdmbJvwoOV
+EOcKjvbdUaCQrqSZ
+DnbjjvbdmgExMnGy
+EPDKjvbddndrkUUS
+EObkKvbdDwwkstTl
+DoCkKvbdcJMjLFwY
+DnbjjvbdaNLBruMg
+DoDLKvbdQYmAHTRj
+DnbkKvbdsQWOicWG
+EObkKvbdMRwMzUpz
+DoDLKvbdZshiZDrn
+EPDLKvbdnPzYujxb
+EOcKjvbdCEQAujMf
+EPDLKvbdKefHbApu
+DoDLKvbdYpldiNFR
+DoCkKvbdFWZQQNJe
+DncLKvbdznpQeCkx
+EOcKjvbdnQZxvKxb
+DoCkKvbdVBBprpqy
+DnbkKvbdZirhPfaf
+DnbkKvbdegjvSNqH
+EOcLKvbdqdEiPnWB
+EObjjvbdBhkCKiGK
+EObjjvbdxZgfGYFS
+DnbjjvbdNQYQumgT
+EPCjjvbdxsNhlrBg
+DoCkKvbdQdDApRDr
+DoCkKvbdxxIiaoyk
+EPDKjvbdFeirNhtR
+DoCjjvbdegjvSOQg
+EObkKvbdqcdiQNvB
+DncLKvbdiMEdNtcZ
+DncLKvbdTqRPUthN
+EPCkKvbdwygeexFS
+DoDKjvbdyTOJMrBg
+DncLKvbdeEoRavbj
+EPCjjvbdtbcUvvOo
+EObjjvbdKCicRJcY
+EObjjvbdZyEKODMS
+DnbjjvbdmJDtQtrB
+DncLKvbdEARhlyvw
+DnbjjvbdIxTbILqQ
+EOcLKvbdwygefYFS
+DoCjjvbdznoqFCkx
+DoCjjvbdRpUGjGDw
+DncKjvbdhzVGMQnG
+EPCjjvbdhkeDnVCy
+EObkKvbdOEdUIiKd
+DncKjvbdrDeIomua
+DncLKvbdiHJbxuiu
+EPDKjvbddxZstRez
+EPDLKvbdmSYuZrdJ
+EObkKvbdVUNUFkvK
+EPDLKvbdNeEUJIjd
+DoCkKvbdiMEdNuCy
+DoDLKvbdRDcApQcr
+EPCjjvbdTlVoBVoJ
+EObjjvbdLBKgNBwq
+EPCkKvbdsCFllHKy
+EObjjvbdnVUzLJqf
+DoDKjvbdqrVLNkBN
+DoCkKvbdqFcdtWBI
+DncLKvbdbVCGxLTh
+EOcLKvbdeFPSCXCj
+EOcLKvbdRpTgKFdX
+EObjjvbdznpQeDLx
+EOcKjvbdjvXNcaxX
+DnbjjvbdHDkWJbJj
+DncKjvbdhkeENuDZ
+DnbkKvbdnUtyjjSG
+DoDKjvbdSQUHJfDw
+DncKjvbdbUbHYLUI
+EOcLKvbdNsTvGduQ
+EPDLKvbdSZigsCvA
+DncKjvbdMfcPlpUk
+DoDLKvbdxrnIlrBg
+DncKjvbdiLdcnVCy
+EPCjjvbdmfeYNOHZ
+DoCkKvbdjvWmcaxX
+DoDKjvbdbUbHXkUI
+DncKjvbdBhkBjiFj
+DoDLKvbdNHColpVL
+EOcKjvbdrykosAhO
+DncLKvbdqGDeUVaI
+DnbkKvbdhgJcZViu
+DnbjjvbduLxXAtBX
+EPCjjvbdYpleJNFR
+EPDLKvbdQvmdClHc
+DnbjjvbdJYTbIMRQ
+DncLKvbdznpRFDMY
+EOcLKvbdZnmiFEyj
+DnbkKvbdrRuLOLAm
+EObkKvbdhkeEOUby
+DncLKvbdYlSEUOLm
+DoCjjvbdhkdcmtby
+DncLKvbdddnrCXDK
+DoDLKvbdKaLHNCYR
+EOcKjvbdcyxpYZQb
+EPDLKvbdACqwjZhp
+DoCkKvbdBsBDTevr
+EObkKvbdeKJqvUzn
+EObkKvbdcImJkGWx
+DncLKvbdYSlAltOx
+DncLKvbdlrYtyrdJ
+EObkKvbdKxqJrztf
+EOcKjvbdsQWPJcVf
+DoDKjvbdkySqrxgU
+EObjjvbdeEoRbXCj
+EOcKjvbdHDkVjBij
+DoDLKvbdCTBCsfXS
+DoCjjvbdKCjDQibx
+DoCjjvbdlhdTqUrB
+DoDKjvbdTulQKTaR
+DoCkKvbdRjxetfkT
+EPCjjvbdEuyQQNKF
+EPCjjvbdDoDKkXDE
+DoCjjvbdsQWPJbuf
+DoDKjvbdhuZdvqtb
+EPDLKvbdiHKCyWJu
+EPDLKvbdLFegaaQu
+DoCjjvbdqZPHgRDx
+DncKjvbdUWMPjUAq
+DoDLKvbdTYKkmzjx
+DoDKjvbdegjvSOQg
+DnbkKvbdUtNTekvK
+EObkKvbdNsTvGeVQ
+DoDLKvbdfNFvgMjL
+EOcLKvbdZQmEiNEq
+EPDKjvbdBraDTfWr
+EPDKjvbdNGcQNQVL
+EPDLKvbdZyEKODMS
+EOcKjvbdBvzdIdpW
+EPCjjvbdACqwiyiQ
+DoCjjvbddePRawCj
+EPDKjvbdWWiXucdg
+DoDKjvbdWexzUAPT
+DnbjjvbdwXMBWBWV
+EOcLKvbdUyHszLOn
+EPCkKvbdOYOuzcnU
+EPCkKvbdhancEwQq
+DnbkKvbdjggLefOL
+EPCkKvbdFjdsDIMu
+DoDKjvbdrSUjmkBN
+DoDLKvbdZjTIQGaf
+DoDKjvbdMgDPmPtk
+EPDLKvbdWRmwbFMD
+DoCkKvbdzROmJKXA
+DnbkKvbdrDdiQNvB
+DnbjjvbduDCtwVoP
+EOcLKvbdCIjbLJFj
+EPDKjvbdXrkaMsnx
+EPDKjvbdVhXvXfxz
+DncKjvbdhbPDEwRR
+DoCkKvbdpxoHgQcx
+DoCkKvbduMXwBUBX
+EObjjvbdNeEThhjd
+DoCjjvbdirzhrkJz
+DoDLKvbdaMkCTUlg
+DncLKvbdWRnYBeLc
+DnbjjvbdGBPRZJzm
+EOcLKvbdeOeSjstS
+DoDLKvbdmIctRVSB
+DoCjjvbdZxdJnDMS
+DoCkKvbdRpTgKFcw
+DncLKvbdTukojTaR
+DnbjjvbdKRZdoFme
+DnbkKvbdURQoVUhN
+DoDLKvbdyYJKBozL
+EObkKvbdfNFwHMjL
+DoDLKvbdZisIQHBf
+EObkKvbdqFcdsuaI
+DncLKvbdzoPqFDLx
+DoDKjvbdSKxeuHLT
+EPDKjvbdsBemLfjy
+DoCjjvbdJbjCqJcY
+DoCjjvbdNPxRVnGs
+DncLKvbdGcjvJbKK
+EOcKjvbdrWpMDIxq
+EOcLKvbdQdDApQcr
+DoDKjvbdZMRdTnLm
+EOcLKvbddxZssrFz
+EObjjvbdUtNTfLuj
+EPCjjvbdLLBIWAKZ
+DoCkKvbdgFlZmfgA
+EPCjjvbdUVkoitAq
+DoDKjvbdDncKjvcE
+DoDLKvbdRpUHJfEX
+EPDKjvbdLqvlzVQz
+EPDKjvbdZMRdUOLm
+EOcLKvbdCJLBkIfK
+DncKjvbdaSFbhUFk
+EPDLKvbdZoNheEzK
+DncKjvbdUVlPjUAq
+DnbkKvbdKNADyfuB
+EObkKvbdZdwfzghb
+EPDLKvbdZtIhxcrn
+EObkKvbdGckViajK
+DncLKvbdFfJqmiUR
+DncKjvbdKWUfDdgJ
+DoDKjvbdMtrqjmAX
+EOcLKvbdsQWPKDVf
+DoCjjvbdwtleRZMO
+EObjjvbduaDxsPEh
+EPDLKvbdKxqJrzuG
+EOcKjvbdVAaprprZ
+EObjjvbdEuxopMjF
+DnbjjvbdyOTHwriD
+EPDLKvbdrpVnibvG
+EPDKjvbdkWWnDaww
+DncLKvbdrXPkbiYq
+DoDLKvbddxZssqez
+EOcLKvbdHDkWJbJj
+DncLKvbdEPCkLWcE
+DnbkKvbdEXwkstTl
+EObjjvbdqiAKEmOe
+DncLKvbdjAQGaQGj
+EPCjjvbdNeDtJJKd
+EPCjjvbdvwMBWBVu
+EPDKjvbdFejSOItR
+EOcLKvbdNPwqWOHT
+EPDKjvbdbsCjscia
+EObkKvbdyYIiaoyk
+DoDKjvbdLZQirzuG
+EObjjvbdSLZGVGjs
+DoCjjvbdAMgxsWzY
+DoDLKvbdEObjjwCd
+DnbkKvbdsPvOicWG
+EPCkKvbdrJAKElne
+EPCkKvbdauCGwjsh
+DncLKvbdegkWRnQg
+EPCkKvbdYpmEiNFR
+DoDKjvbduaDxsPFI
+DoCjjvbdcyxoxYqC
+DoCkKvbdkMakzFHP
+DnbjjvbdJbibqJbx
+DnbkKvbdWWhxWDeH
+DoCjjvbdssRsYzFD
+DoDKjvbdpyPIHRDx
+DncLKvbdwNWANDeN
+DoDKjvbdJYUBglRQ
+EObkKvbdXnRAYVVt
+DoCjjvbdUWLpKTaR
+DoDKjvbdTqROttgm
+EPCkKvbdVqnXaeMD
+EObjjvbdADRwiyiQ
+DoDKjvbdlrZUyrci
+EPDKjvbdvAdZSndh
+DoCkKvbdzoQQeDLx
+DnbkKvbdSQUGjFdX
+EOcLKvbdqBJFAXIE
+EObkKvbdSCEFLiZL
+DnbjjvbdzoQQdcMY
+DnbkKvbdpxngfqEY
+DncLKvbdbsDLUEKB
+DoCjjvbdXrlBMtOx
+EObjjvbdKCjDQicY
+DncLKvbdLrWlzUpz
+EObjjvbdaaWEfQQX
+EObjjvbdtlYWaTaX
+DnbkKvbdMowpunGs
+EObkKvbdSLYeuHKs
+EObkKvbdTAEhhCOd
+EPCkKvbdmSYtyrci
+DncLKvbdYkqcsnLm
+DoDLKvbdrylQTAgn
+DncLKvbdJXtCIMRQ
+EObkKvbdSBdElIyL
+DoDLKvbdwygefYFS
+DncKjvbdyXhibPzL
+EPCjjvbduaDxsPFI
+EObjjvbdZoNiFEzK
+EPCjjvbdkNBkyeHP
+EPCkKvbdWRnXadlD
+DncLKvbdRWmdDLhD
+DnbkKvbdmSYtzTDi
+EOcKjvbdkVwODbXw
+DncLKvbdQlxCZOUz
+EObjjvbdbhlijfXY
+EOcLKvbdXmqAXtut
+EOcLKvbdmbKXXnnV
+DoDKjvbdkHgMFfOL
+EPCkKvbdfekymgHA
+DoCjjvbdeKKRvUzn
+DoDKjvbdkHfkefNk
+DoCjjvbdyqPMiKXA
+DnbjjvbdUQqOtuIN
+EOcKjvbdEPCkKwDE
+DoDLKvbdZRNFIleR
+DnbjjvbdRacdlJZL
+EOcLKvbdTukoitAq
+EOcLKvbdZLrDtOMN
+EOcLKvbdgKfzcGAE
+EObjjvbdzjVQQESt
+EOcLKvbdcIlijevx
+EOcKjvbdGKdsDHmV
+DncLKvbdKkBHvAJy
+EOcKjvbdZMRctOLm
+EPCkKvbdADRxKZiQ
+EObjjvbdDwxLsssl
+EPDLKvbdUxgszLPO
+EPCkKvbdSQTfiedX
+EPCjjvbdNeEUJIkE
+DoDLKvbdpyPHfqDx
+DnbkKvbdyOShXsJD
+DncLKvbdLiBkpxAS
+DoDKjvbdaaWEepQX
+DoCjjvbdWSOYBeLc
+EOcKjvbdLFegbAqV
+EPDKjvbdffLzOGgA
+EObkKvbdFkErbglu
+DncLKvbdiZuFlROG
+DncKjvbdegkWRnQg
+DoDLKvbdQdDApRDr
+EOcLKvbdeYZtURez
+EObjjvbdrXQLcIxq
+DoDLKvbdxZhGGXeS
+DoDLKvbdGGKSOItR
+EObjjvbdjhHLfFnL
+EOcLKvbdUQpoUuHm
+DoCkKvbdXrlBNUPY
+DoDKjvbdJXtCIMRQ
+DnbkKvbdZMSDsnLm
+DncKjvbdCTBDUGWr
+DncKjvbdbhlikGXY
+DoDKjvbdXmqAYVWU
+DnbjjvbdliDsqVRa
+DnbkKvbdmajXYOnV
+EObjjvbdJpyePGNe
+DnbkKvbdCTAcUGXS
+DoDLKvbdCDpBVjNG
+EOcLKvbdxwhiaoyk
+DoDKjvbdxVNFQyMO
+EPCkKvbdVvhwvEEg
+DnbkKvbdFWYoomJe
+EOcKjvbdlrZUysEJ
+EPDKjvbdqquKnKaN
+DoCkKvbdTkunaVoJ
+EOcLKvbdfHkVrOQg
+EPDLKvbdiUzFWrUb
+DoDLKvbdtAGqIABS
+DoCkKvbdZRMdhmEq
+DnbkKvbdNsUVfeVQ
+EPDLKvbdqwPkbiZR
+DoCkKvbdNUsSLNAX
+DncKjvbdmpZxvKyC
+EPCkKvbdLYqKSztf
+EPDKjvbdZyEKODMS
+EPDKjvbdNGbomPuL
+DncKjvbdZMSDtNlN
+EPCjjvbdTXjkmzjx
+EObkKvbdBdQAvKMf
+EOcLKvbdkySrTYgU
+DnbkKvbdZoOIddzK
+DoCkKvbdZMSDsmkm
+EPCkKvbdCWzdIdpW
+DncLKvbdBvzdIdov
+DoCjjvbdaRfDHtFk
+DnbkKvbdWeyZtAOs
+DoDLKvbdnCJwYPOV
+DoCjjvbdEYYLstUM
+EOcLKvbdwtldqZMO
+EPCjjvbdFVxoomKF
+EObkKvbdyqPMhiwA
+DoDLKvbdkxrrSxgU
+DoCjjvbdeATqNYKG
+DncLKvbdJKEAJpHE
+DoCkKvbddndsLUTr
+DnbjjvbdqFceUWBI
+DoDLKvbdhkddOUby
+DncKjvbdGKdrcIMu
+EPCkKvbdelevflik
+DoDKjvbdhaoDFWqR
+DoCjjvbdYlSDsmlN
+EPCjjvbdiZuGLpmf
+EObkKvbdnCJvxPNu
+DnbkKvbdhzUelRNf
+DnbkKvbdZeYGzgiC
+DoCkKvbdDnbkLWbd
+DnbkKvbdnHFYMmfy
+DoCjjvbdePEsKtTr
+DnbjjvbdZQmEhleR
+DnbkKvbdTkunaVoJ
+DnbkKvbdFWZPpMjF
+DoDKjvbdSwkMNzkY
+EOcLKvbdwtldpyMO
+EOcKjvbdhkdcmtby
+DoCjjvbdNQXqWNfs
+EPDKjvbdzjUpPdTU
+DnbjjvbdqceJPnWB
+EPDKjvbdUyHsyjoO
+EPCkKvbdZshhxcsO
+DncKjvbdqAiFAWgd
+EObkKvbdgFkzOGgA
+DncKjvbdmgFYNNgZ
+DoDLKvbdDjHjWYKA
+DnbjjvbdJbicRKCx
+DnbkKvbdfNFwHMjL
+EPCkKvbdWSNxBdlD
+EPDLKvbdCJKbLJFj
+EPDKjvbdEOcKkXDE
+EPCkKvbdVrOYCElD
+DnbjjvbdCIkBjhej
+DoDLKvbddoFTKstS
+DnbjjvbduDDVXVoP
+EObkKvbdxwiKCPzL
+DnbkKvbdZGvdAPTJ
+DoDLKvbdBdPaVjNG
+EOcKjvbdIHGzYwxH
+DoCjjvbdGFjSNhsq
+DnbjjvbdlYsSSxgU
+EPCjjvbdqrUjnKaN
+EOcLKvbdtvOXipsA
+DoDLKvbdrounjCuf
+DoCkKvbdFVyPomKF
+EOcKjvbdNHCpNPtk
+EPDLKvbdWeyZtAPT
+EPDKjvbdjcLkQfuH
+EOcLKvbdzHZMAMeX
+DoCjjvbdUMWPBVni
+EOcKjvbdHELWKBjK
+DoDKjvbdMgComQUk
+DnbkKvbdiGjDZWJu
+DncKjvbdyqOmJKXA
+DoDKjvbdVZITyjoO
+DoCjjvbdzQoNJJwA
+EOcLKvbdGAoQxizm
+DoDKjvbdatagYKsh
+EPDKjvbdSBceMJYk
+DoDLKvbdMpYQvOHT
+DncKjvbdiCOcFWpq
+DoCjjvbdUGznLvvF
+EPDLKvbdANIYrvyx
+EPCjjvbdIwtCHkpp
+EObkKvbdJSyBSmYM
+EObkKvbdwuMdqYlO
+EObjjvbdmuVZkKSG
+DncLKvbdSPsfjFdX
+DoDLKvbdSQUHJedX
+DoDKjvbdiVZdwSUb
+EPDLKvbdRjxfVGkT
+EObjjvbdmpZyVkZC
+DncLKvbdhzUelROG
+EPCkKvbdxVMeRZMO
+EOcKjvbdxxIiapZk
+EOcKjvbdJSyBTNYM
+EPDKjvbdMSXMzUpz
+EPCkKvbdNddThhjd
+DoDKjvbdznpREcLx
+DncLKvbdqYoHgREY
+DnbjjvbdiCPCdvqR
+DoCjjvbdsQVoKDVf
+DoCjjvbdqFcdtWBI
+EPCkKvbdFkFTDIMu
+DnbkKvbdQvmdCkgc
+DnbjjvbduCbtwWOo
+DoCjjvbdaNKaruNH
+EOcLKvbdrpWPKCvG
+DoCjjvbdEKHiuwjA
+DoDLKvbdsBfMlHKy
+EObjjvbduCcVWuno
+DoCkKvbdNddUIiLE
+DoDLKvbdVrNwbElD
+EPCkKvbdTqQoUuHm
+DoCjjvbdcJMikFvx
+EOcKjvbdijGIJmYS
+DncKjvbdtvNwipsA
+EPDKjvbdGQASwGey
+DoCkKvbdmJEUQtqa
+DncKjvbdpxnggQcx
+EOcLKvbdDnbjjwDE
+DnbjjvbdxVMdqZLn
+EPCkKvbdTkvPAvOi
+DnbkKvbddijRvUzn
+DnbjjvbdJuuFceGi
+DoDLKvbdeATplxJf
+EObjjvbdiLeDmuDZ
+EObkKvbdzHYlANFX
+EObkKvbdSBdFLiYk
+DncLKvbdMgCpNPuL
+DncLKvbdNsTufeVQ
+EPCjjvbdUQqOtuIN
+EPCkKvbdKDJcQicY
+DnbkKvbdsCFmLfjy
+DnbjjvbdNdctJIjd
+DoDLKvbdzjUpPdSt
+EPDLKvbdMoxRVmgT
+EOcKjvbdbsCjscia
+DoCjjvbdrDeIpOWB
+EPDKjvbdOTUVgFVQ
+EOcLKvbduWNwipsA
+DoDKjvbdJcJcRKCx
+DncKjvbdGZUtaDwb
+EPCjjvbdZtJJYdSn
+DoDLKvbdtcDVWuoP
+EObjjvbdKaLGmCXq
+DoCjjvbddZxoxYpb
+DnbkKvbdWRmxCEkc
+EOcLKvbdNrsufduQ
+DoDLKvbdqlzJxlIJ
+DoCkKvbdFVyPoljF
+DnbkKvbdjggMGGOL
+DoDLKvbdLAkHMawq
+DncLKvbdwuMdpxlO
+DoDKjvbdtSqrxydc
+DoCjjvbdSLZGVHKs
+DnbjjvbdrMzKYlIJ
+DnbjjvbdTAFIhBnd
+EPDLKvbdIxTbIMRQ
+DoDLKvbdbBVeGQPw
+DnbkKvbdvlvANEEm
+EPDLKvbdEOcKkXCd
+DoCkKvbdYqMdhmFR
+EObjjvbdnUtzKiqf
+EPCkKvbdtunXjQsA
+DnbkKvbdddoSBwDK
+DnbjjvbdTqROttgm
+EPCkKvbdzQnmJJwA
+EObjjvbdfpBzwDwh
+DncKjvbdRotHJecw
+EPCjjvbdhtzFWrVC
+DncLKvbdqdEhpNvB
+DnbjjvbdkWWmcbYX
+EOcLKvbdYSkaMsoY
+EObjjvbdDjIKVxKA
+DnbkKvbdrounjDVf
+EObkKvbdJzpFwdAN
+DoDLKvbdsBelkgLZ
+DoDLKvbdwtmEqZMO
+DncKjvbdxmrgwriD
+EOcKjvbdDoDLLWbd
+EPDKjvbdIwtBhLpp
+EPDLKvbdUaBqTRRy
+DoCjjvbdjKFhJlwr
+DoCkKvbdGLFTDIMu
+EPCjjvbdrbFmMHKy
+DoDLKvbdehKurOQg
+DncKjvbdijFhJlwr
+DoCjjvbdjvXOEBww
+EPCjjvbdTXjkmzkY
+EOcKjvbdaSFcHtGL
+EPDLKvbdpyPIHQcx
+EOcKjvbdmaiwXoNu
+DoDKjvbdSBdFMJZL
+DoDKjvbdjKGIKMwr
+DncLKvbdyXiKBozL
+DoCkKvbdqlzJxkhJ
+EObkKvbdrNZiyLhJ
+DoCkKvbdrpWPKCvG
+DncLKvbdVrOXbEkc
+DnbkKvbdOAIrtJrA
+DnbkKvbdrXQMChyR
+EOcLKvbdDnbjjwCd
+EPCjjvbdjvXOECXw
+EPCkKvbdMgDPmPtk
+DoDLKvbdYfwEAPSi
+EPCjjvbdzGxlANEw
+DoDKjvbdmbKWwoNu
+EOcLKvbddZxpXxqC
+DoDLKvbdLGGHbApu
+DoCjjvbdVTltGLuj
+EPCjjvbdOEdThiKd
+DoCjjvbdUyHtZkPO
+DncLKvbdHELWJajK
+EOcKjvbdcarmSAUN
+EObjjvbdqiAJdmOe
+EObkKvbdZQleImFR
+EObkKvbdQccBQRDr
+DoCkKvbdLAjfmBwq
+DncKjvbdSKxeuHKs
+DncLKvbdmJDsqUrB
+EOcLKvbdGFirNhtR
+DncLKvbdEARiMywX
+DnbjjvbdZxcjNblS
+DncLKvbdWXIwudEg
+DoDLKvbdhkeDmuCy
+EObkKvbdUslselWK
+DoCkKvbdLhakqYAS
+DoCjjvbdIMBzmvpk
+EPCjjvbdKaKgMbXq
+EPCjjvbdiLeDmtcZ
+DnbjjvbdsPvPKCvG
+DncLKvbdnVUzLKRf
+DoDLKvbdiUyeWrVC
+EOcLKvbdjblLRGuH
+DnbkKvbdhtydvqtb
+EOcKjvbdTqQnuVIN
+DoCjjvbdMtsRkNAX
+EPCjjvbdGKdrbglu
+DncKjvbdMoxQvOGs
+DoDKjvbdiHKDZWKV
+DoDKjvbdULvPAvPJ
+DnbkKvbdEvZQPmKF
+EObjjvbdkxrrTZGt
+EObjjvbdKCicQibx
+DoCjjvbdKkAgvAKZ
+EOcKjvbdNxOuzcmt
+EPDLKvbdbsCjsdJa
+EObjjvbdHDkVjBjK
+EPCjjvbdYqMdiMeR
+EPCkKvbdczYoxZRC
+DncKjvbdnPzYujxb
+DnbjjvbdMpYRWOHT
+DncLKvbdLFegbBRV
+DncKjvbdxVMdqYlO
+DoDKjvbdFkErbhNV
+DncKjvbdLLBHvAJy
+DoDKjvbdTfzmkwWF
+EPCjjvbdyXiKCQZk
+DoDKjvbdqUUGrSLU
+EObjjvbdGcjuiaij
+EOcLKvbdZRMdhmFR
+DoCjjvbdZoNiEdzK
+DoCjjvbdEARiNZwX
+DoCkKvbdwXMBVaWV
+EPCjjvbdVZHsyjoO
+DoDKjvbdyXhjBpZk
+EObkKvbdtkxWaUAw
+DnbkKvbdLrWmZuQz
+DncLKvbdySnJNRbH
+EPCjjvbdezvYdhsw
+DoDLKvbdhancFWqR
+EObjjvbdyzeORgiI
+EPCjjvbdyXiJbPyk
+EObjjvbduVnXiqTA
+DnbjjvbdZjTHofaf
+EPDLKvbdLrXMyuQz
+DnbjjvbdHffyxxXg
+DoDLKvbdOStWGdtp
+DnbjjvbddijRvUzn
+DoCjjvbdYNqAXtut
+EPCjjvbdUQpntuHm
+DoDKjvbduWOXjQsA
+DoDLKvbdtTRsYydc
+DncKjvbdpfDeUVaI
+DoDLKvbdULuoAvOi
+DnbjjvbdqmZjYkhJ
+EPDKjvbdZMSETmkm
+DoDLKvbdZshhyETO
+DncLKvbdQdCaQQcr
+DncKjvbdQccBQRES
+EOcKjvbdrNZjYlIJ
+EPDKjvbdjAQHBPgK
+DoCjjvbdnUuZkJqf
+DoDKjvbdLAjfmBxR
+EObjjvbdUsltFkuj
+DoDLKvbdZQleJMeR
+DnbjjvbdBraCtGXS
+DoDLKvbdaSFbhUGL
+EObjjvbdrbGMkgLZ
+EPCkKvbdJYUCHlRQ
+EOcKjvbdgFkzNfgA
+DoCjjvbdaRecHtFk
+EPDKjvbdnUuZkKSG
+EPDLKvbdkWWmdBww
+EObkKvbdypoNJKXA
+EOcKjvbdZxdJmblS
+DncLKvbdZirhPgCG
+DoDLKvbddeOrCXCj
+DoCjjvbdOXoVzcnU
+DncLKvbdSBdFMJZL
+DncKjvbdrzMPraHn
+DncLKvbdqZPHfpcx
+DncKjvbdVAbQsQqy
+DoDKjvbdySnJNSCH
+EPDLKvbdtSqsZZeD
+DncLKvbdtvOYKRTA
+DncLKvbdLGGICBQu
+DoDLKvbdDncLKwDE
+EObjjvbdNrtVgEtp
+EOcKjvbdUQqOtthN
+EObjjvbdZtIiYcrn
+EOcKjvbdmuVZjjRf
+DnbjjvbdcJNKKevx
+DoCkKvbdDxXlTtUM
+DncLKvbdqZOhHQcx
+EPDKjvbdIsZBSlwl
+EOcKjvbdNUsRkNAX
+DoDLKvbdRbEFMJYk
+DnbjjvbdiBncFWqR
+EOcLKvbdRzKIScWA
+EOcKjvbdRbEFMIyL
+EPDKjvbdsPunjDVf
+DoCjjvbdhzVFkpmf
+EOcKjvbddxZtUSFz
+DncKjvbdnVUykJrG
+EOcLKvbdEPCkKvbd
+EPCjjvbdnUuZkKSG
+DnbjjvbdnCKWxOmu
+DnbkKvbdYzcFrKVy
+DoDKjvbdvmWAMcdm
+EObkKvbdhkdcmuDZ
+DncKjvbdNsUVgFVQ
+EPDLKvbdYzbeqiuy
+EOcLKvbdUxgszLOn
+DnbjjvbdZQmEiMeR
+DoCjjvbdkHflFemk
+EPDLKvbdhbPCdwRR
+DoDLKvbdWXIwucdg
+DoCjjvbdOYOuzcnU
+DoDLKvbdcSbkTdJa
+EOcKjvbdEvYpQMjF
+EPDLKvbdrykosAhO
+EObkKvbdrovPJbvG
+DoDLKvbdkHflGGNk
+DoCjjvbdZtIiYcsO
+DoDLKvbdZnmiEdzK
+EObjjvbdZMSDsnLm
+EPCjjvbdLAjfmBxR
+DncLKvbdptUGrRjt
+EOcLKvbdNQXqVmgT
+DoDLKvbdCIkCLIfK
+EPDLKvbduVmxKRTA
+EPDKjvbdHbLzEzAD
+EPCjjvbdbUbGxKsh
+DoCkKvbdjlbLzEgP
+EPCkKvbdXGYzUAPT
+DnbkKvbduLxXAsaX
+EObkKvbdJvUfEFHJ
+EOcKjvbdmbKXXoNu
+EPDKjvbdQvnDbkgc
+DoDLKvbdiUzFWrVC
+EObkKvbdZyEKNcLr
+DoDKjvbdrEEhpNua
+DnbkKvbdzitoocsU
+EPCjjvbdmbJvxOnV
+EOcLKvbdNddTiIjd
+DncKjvbdfpBzvdYI
+EObkKvbdBhjbLIfK
+DoCjjvbdFjeTDHmV
+EOcKjvbdRjyGVGkT
+DoCkKvbdZQldhmFR
+EPDKjvbdqlzKZLhJ
+DnbkKvbdZoOIeEyj
+DncKjvbdBdPaVjNG
+EPCkKvbdTulPjUBR
+EPDLKvbdGGJqmiTq
+DoDLKvbdGGJqmhsq
+EOcKjvbdIryBTNXl
+EPDLKvbdIsYaSmXl
+DoCjjvbdVwJXudEg
+EPCkKvbduDCtvuoP
+EOcLKvbddBsMrAUN
+DncLKvbdrouoJcWG
+DoDKjvbdCgLfHAzc
+DncLKvbdhtzEvqtb
+DoDKjvbdZtIiYcsO
+DncKjvbdMfbomPtk
+DncKjvbdYqNEiMdq
+DnbkKvbdCTBCtFvr
+DncLKvbdhtzEvquC
+DoCjjvbdAMhZSvyx
+DoDKjvbdjlbLzEfo
+EOcKjvbdZLrETmkm
+DncKjvbdULvPAuni
+DoCjjvbdtcCtvuoP
+EPCkKvbdOTTugEtp
+EObjjvbdhtzEvquC
+DoCjjvbdkHgLfFmk
+DncKjvbdmoyyVkZC
+DnbkKvbdsBemLgKy
+DoDKjvbddCTMrAUN
+DoCjjvbdmuUykJqf
+DnbjjvbdbQHGckzd
+DoDLKvbdyOShXriD
+EPDLKvbdZRNFImFR
+EOcLKvbdDoDKkWcE
+EPCkKvbdwMvAMcdm
+DnbjjvbdbKlFoNcA
+DoCkKvbdMfbpMpVL
+DncLKvbdhkeDnUby
+DoDKjvbdMSWmZtpz
+EPCjjvbdmfeYMmgZ
+DnbjjvbdqiAKFMoF
+DoCkKvbdSBdElIxk
+EOcLKvbduoTzpkPU
+DncLKvbdDoCjjwCd
+EObjjvbdLGGHbBQu
+DnbkKvbdQcbaQRDr
+EPDLKvbdyNrgxTJD
+EObjjvbdtSqryZdc
+DoDLKvbdegkWSNpg
+EOcKjvbdZLrDsnLm
+EObjjvbdFkEsCgmV
+DoDKjvbdatagXjtI
+DncLKvbdGZUuBDwb
+DoDLKvbduDDUvuno
+EObjjvbdURROtuIN
+DnbkKvbdyXhjBpZk
+DoDLKvbdKaLGlaxR
+DoCkKvbdlZTRrxgU
+EPDLKvbdUsltFlWK
+DncLKvbdGGKRnIsq
+DnbkKvbdijFhKNXr
+DoDKjvbdrWokbiYq
+EObjjvbdUaCRSqRy
+EObjjvbdRkYfVHKs
+DnbkKvbdQvnDcMID
+EObjjvbdvBEYrneI
+DnbkKvbdySmiNRbH
+EPDKjvbdjuvmcaxX
+DoCjjvbdVTmUGLuj
+EPDLKvbdxVMeRYlO
+DnbjjvbdNPwpvNgT
+DoDKjvbdJTZArlxM
+EPDLKvbdjbkkRHUg
+DnbkKvbdSBdFMIyL
+EPDKjvbdMgColpUk
+DncLKvbdVAbQsQrZ
+DncLKvbdyTOJNRag
+DnbjjvbdmgFYMmgZ
+EPDKjvbdTAFIgbOd
+EObkKvbdFWYoomJe
+DoDKjvbdIxUBhMRQ
+DoCjjvbdFWYopNKF
+DoDKjvbdNdcshiLE
+EOcLKvbdwWlBWAuu
+EPCkKvbdYpldiNFR
+EPDLKvbdQwODbkgc
+EPCkKvbdqZOhHQcx
+EObjjvbdHDjujCKK
+DoDLKvbdnBjWwnmu
+EPDLKvbdUQqPUuHm
+DnbkKvbdIryBSlxM
+DnbkKvbdjhGlFfNk
+DnbkKvbdqlyiyMHi
+EPDLKvbdxmsIYTIc
+EPCjjvbdNrsufduQ
+DncLKvbdaaWEepPw
+DnbjjvbdkVvnDaxX
+EOcKjvbdUQpntuIN
+EOcKjvbdQdDAopcr
+DoCkKvbduMXvaUAw
+DnbkKvbdMRwNZuQz
+DoCkKvbdNGcQMotk
+EPDLKvbduWOYJpsA
+DncKjvbdZtJIxcrn
+DnbjjvbdwyhFfXeS
+EOcLKvbdIryAsNYM
+EObjjvbdyTNiNRag
+EPCkKvbdiZuGLqOG
+DncKjvbdHELWJbKK
+DoDKjvbdIGfyxwxH
+EPCkKvbdeOdrkTsr
+DoDKjvbdpstGrRjt
+EOcKjvbdZtJIxdSn
+EObjjvbdZtIiZDrn
+DnbjjvbdOEctIhkE
+DncLKvbdKDJbqJbx
+DncKjvbdEOcLKvcE
+EOcLKvbdgLGzcGAE
+DoCjjvbdGBPQxizm
+EPCjjvbdeFOqbXDK
+EObkKvbdehKuqnQg
+DncKjvbdRosgKFcw
+EOcLKvbdUsmUGLuj
+EOcLKvbdrXQMCiZR
+DoDKjvbdjcMLQftg
+EPDLKvbdHEKvKBjK
+EPDKjvbdbVCHYLUI
+DncKjvbdFfKSOItR
+DncKjvbdYSkaNToY
+DncLKvbdQvmccLhD
+EOcKjvbdnVUykKSG
+DoCkKvbdbsDKsdJa
+EObkKvbdGLFTChMu
+DoCkKvbdqGEFTuaI
+EPCkKvbdddoRbXCj
+EPCjjvbdMfbpNQVL
+DoDKjvbdFjdrbgmV
+EPCkKvbdmRxuZsDi
+DncKjvbdaRfChUGL
+DncLKvbdMJBkqYAS
+EObkKvbdxUmEqYlO
+EPDLKvbdtbbtvuoP
+DoDKjvbdxsOJNSBg
+EPDKjvbdZtIhyDrn
+DncLKvbdKCicRKDY
+EPDLKvbdUtNUFlVj
+EPCjjvbdeATqMxJf
+EOcLKvbdaNLBsUmH
+DoDKjvbdJcJcQjDY
+EPCkKvbdiMEdNtby
+DoCjjvbdiGibyWJu
+DncKjvbdeEnrCXDK
+EPCjjvbdUVlPisaR
+DncLKvbdXGZZtAPT
+DoDKjvbdddoRbXDK
+DoDLKvbdSBdElIyL
+DoCjjvbdRNXbZOUz
+DnbjjvbdTAEhhCPE
+EObjjvbdUMVoBWOi
+DnbkKvbdFjdrcHmV
+DoCjjvbdfIKurORH
+DoDLKvbdVBCRTQrZ
+EOcLKvbdZoNhddzK
+DoCkKvbdULvOaVoJ
+DnbjjvbdZirhPgCG
+EOcKjvbdVBBprqSZ
+DoDLKvbdaSFcIUGL
+DoDLKvbdfIKuqnRH
+DncKjvbdijGIKNXr
+EPDLKvbdrzMPsAgn
+EPDKjvbdNUsSKmAX
+EPCkKvbdLLAhWAKZ
+DncKjvbdkWWnDaww
+DnbkKvbdJYUCHlQp
+EPDLKvbdNwoVzdNt
+DoCjjvbdSLYetfjs
+DoDLKvbdptTgSSLU
+DncKjvbdxVMdqZLn
+DncKjvbdZyDinDMS
+DnbkKvbdnPyxujxb
+EPCkKvbdSiZjRABM
+EPDKjvbdPyNAHSqj
+DncLKvbdqwPlChyR
+EPDKjvbdGckWJbKK
+DoDLKvbdbBWFFoow
+DoCkKvbdkCkkRGuH
+DncLKvbdmJDtQuSB
+EObkKvbdQdCaQQdS
+DncKjvbdKfFhBaQu
+DncKjvbdaNKaruMg
+EOcKjvbdnPzZWLYb
+EObjjvbdxUldqZMO
+DnbkKvbdGckWJaij
+DncKjvbdkVwODaww
+EObjjvbdGKdsDHlu
+EObkKvbdKQyeOfOF
+EPCkKvbdGdKvKCJj
+DnbkKvbdGdKuibKK
+DoDKjvbdOFDtJJKd
+DoCkKvbdwuMdpxkn
+EObjjvbdZjShPgBf
+DoDKjvbdcyxpYZQb
+DnbjjvbdrbGMkgLZ
+DnbjjvbdxsNiMqbH
+DoDKjvbdWSOXbFLc
+EPCjjvbdrDeIomvB
+EOcKjvbdEuxopNJe
+DoDKjvbdKDKCqKCx
+DoCkKvbdkIHLfGNk
+EOcKjvbdnUuZjirG
+DncKjvbdIryArmXl
+DoDKjvbdraemMGkZ
+DncKjvbdEJgivYKA
+DoDLKvbdbhmJkGWx
+DnbjjvbdZyDimcMS
+EOcKjvbdhuZeWrVC
+DnbkKvbdRbEFMJZL
+EPCkKvbdeOdrkUTr
+DoCkKvbdlhdUQuRa
+DnbjjvbdZtIiZDsO
+EPCjjvbdZyEJmcMS
+DnbjjvbdFpATWgGZ
+EOcLKvbduaDxroEh
+DnbkKvbdpeceUWBI
+EOcKjvbdjcMLQftg
+DncLKvbdnPzZWLZC
+DnbjjvbdZyEKNcMS
+DoDKjvbdZMSDsnLm
+DnbjjvbdOAIsTjSA
+DoCjjvbdWSNxCFLc
+DoDKjvbdkClLRHVH
+DncKjvbdZxdJmcLr
+EPCjjvbdOYOuzdOU
+DncKjvbdWHxVxHYz
+DoDLKvbdwXMBWBVu
+EObjjvbdZxdJmcMS
+EOcKjvbdrEFJPmvB
+EOcKjvbdQcbaQQcr
+EPCkKvbdfHkWRnRH
+EOcKjvbdrEEiQNvB
+EObkKvbdcTCjtDia
+DoCkKvbdnCJvwoOV
+DoDLKvbdxnTIYSiD
+EOcKjvbdGQASvfey
+DoDKjvbdUtNTekvK
+DoDLKvbdbUbHXkTh
+DncKjvbdaNLBsVNH
+EPCkKvbdmtuZjirG
+EPDKjvbdvlvANEEm
+DnbkKvbdcIljLGWx
+EOcKjvbdJSyArmYM
+EObjjvbdVTltFlVj
+DncKjvbdTAFIgbOd
+EOcLKvbdUsltGLuj
+EObjjvbdZRNEhmFR
+EOcKjvbdUGznMXVe
+DnbjjvbdTqQoUthN
+DncLKvbdZRNEhmEq
+EObkKvbdKxpirzuG
+EOcKjvbdiVZdvqtb
+EOcLKvbdatbGxKtI
+DnbkKvbdpfDdsvBI
+DnbjjvbdpyPIGqDx
+DoCkKvbdqUUGrRjt
+DoCjjvbdfHjuqmqH
+EPDKjvbdqlzJyLgi
+DoCjjvbdznpREcMY
+EObjjvbdjuvnEBww
+DoCkKvbdQwNdCkgc
+DoCjjvbdxsNhlqag
+EOcKjvbdbsDKtEJa
+EPDLKvbdfIKuqnQg
+DncLKvbdJXsbILqQ
+DoDLKvbdiUydwRuC
+EOcLKvbdUtMsfMVj
+DnbkKvbdfNGWflik
+DoDLKvbdqwQLcJZR
+DncLKvbdYqMeIleR
+DoCjjvbdzaAPGgBl
+EPCkKvbdauBgYLUI
+EPDLKvbdiUydvqtb
+DnbjjvbdRyjITCvA
+DncLKvbdIwsahLqQ
+EPCjjvbdRacdkiYk
+EOcKjvbdRbEFMJZL
+DoCjjvbdrzLoraHn
+EObkKvbdxxIiaozL
+EOcLKvbdJcJbqJbx
+EPCjjvbdZisHogBf
+EOcKjvbdVTmUGMWK
+EPDKjvbdrylQSaIO
+DncLKvbdSCEEkiYk
+DoDLKvbdhtyeXRuC
+EObjjvbdQvmcblID
+DoDKjvbdauCGwjtI
+DnbkKvbdGYtuBEYC
+DoCkKvbdkyTSSxft
+EPDLKvbdIGfyyYYH
+EObjjvbdjlbLzEgP
+EPCjjvbdIwsbHkpp
+EPDKjvbdmuUyjjSG
+DoCkKvbdUQpoUtgm
+EObkKvbdUQqPVVIN
+DncLKvbdXrkaMsnx
+DncLKvbdaMjbTUlg
+DncLKvbdhgJbyVjV
+DnbkKvbdURQoUuIN
+DnbjjvbdFWZQQMie
+EPCjjvbdnCJwYPNu
+EOcLKvbdBcpBVimG
+DoCkKvbdyqPMiKXA
+EObkKvbdnVUzKjRf
+DnbkKvbdVgwvXgYz
+EObkKvbdZsiJZDsO
+EPDKjvbdiCPCdwRR
+EObkKvbdGYuUaEYC
+DnbkKvbdpyPIHREY
+DnbjjvbdiZtfLpnG
+EPCkKvbdVUNTelWK
+DnbkKvbdTppoVUhN
+DnbjjvbdxrnIlrBg
+EPDKjvbdmIdUQtrB
+EObjjvbdkNBkzFGo
+DncKjvbdhbOcFXQq
+DoDLKvbdNGcPmQVL
+EPDKjvbdZoNheEyj
+DnbkKvbdjlbLzEfo
+DoCjjvbdZRMdiNEq
+EObjjvbdczYoxYqC
+EPDKjvbdLAkHMaxR
+DoDLKvbdsPunibuf
+DoDLKvbdNdcshhkE
+EPDKjvbdhkdcnVCy
+EPCkKvbdVZHtZkOn
+DnbjjvbdsrrTYzFD
+DoCjjvbdatbGxKtI
+EOcLKvbdnGdxMnHZ
+EPDLKvbdmaivwoOV
+EObkKvbdjJegjMwr
+EPDKjvbdYfwEAOri
+EOcKjvbdpxngfpcx
+DnbjjvbdEPCjkXCd
+EPDKjvbdxsOImRag
+EObjjvbdEPDKjwDE
+DnbjjvbdYlSETnLm
+DncLKvbdBiLBjhej
+DoDKjvbdrpWPJcVf
+DncKjvbdRpTfiedX
+DoDKjvbdakMGOnDA
+DnbjjvbduVmxKQsA
+DncKjvbdKfFhCBRV
+DnbkKvbdpfEFTvBI
+DncLKvbdqwQLcIyR
+EOcKjvbdlhdTpuSB
+DncKjvbdqwQLbhxq
+DnbkKvbdnHEwlmgZ
+EPDKjvbdDoCjkWbd
+EObkKvbdANIYsWyx
+EObjjvbdpfEEsvBI
+EPDKjvbdCJLCKiFj
+DoDKjvbdqcdhonVa
+EPCjjvbdzjUpQESt
+DncLKvbdZQleImEq
+EPCjjvbdEPCkLXCd
+EPDKjvbdYlRdUNlN
+EObkKvbdxwiKBozL
+DnbjjvbdFjdsChNV
+EObjjvbdwtleRYlO
+DoDLKvbdeOdsLUUS
+EPDKjvbdZLqctOLm
+DoDLKvbdjlbLyeHP
+DoCkKvbdaNLCTVMg
+DnbkKvbdEKHjWXjA
+DnbkKvbdZshhyDsO
+DnbjjvbdsPunibuf
+EPCkKvbdwWkaWBVu
+EPDLKvbdFpATWfey
+EObjjvbdzoQQdcMY
+EPDLKvbdpxngfpcx
+DnbjjvbdgPazwDwh
+EPDKjvbdKVtfEEfi
+EOcLKvbdhkeENuDZ
+EObkKvbdIwtCILqQ
+EPCjjvbdyNrhXsJD
+DnbkKvbdMSWmZuQz
+EOcLKvbdsPunicWG
+DncLKvbdULvPBWPJ
+DoCkKvbdKfFhCApu
+EOcLKvbdTAEhhCOd
+DnbkKvbdSKxetfjs
+DoCjjvbdUtNTfLuj
+EObjjvbdhzVGMROG
+DoCkKvbdxsNhmRag
+DnbjjvbddZyPwxpb
+EObjjvbdEuxooljF
+DncLKvbdVTlsfLuj
+DoCkKvbdZjShQGaf
+EPDKjvbdrSVKnKaN
+DnbkKvbdFxuVBDwb
+DoCkKvbdJXtBhLpp
+EPCjjvbdHffzZXxH
+DoCjjvbdqZOgfqDx
+DncLKvbdqwQMChyR
+EObjjvbdaSGDIUFk
+EPDLKvbdZxdKNcMS
+EObjjvbdhuZdwSUb
+EPDLKvbdfMfWgMik
+DncLKvbdZRNFJMdq
+EOcKjvbdJKEAKPfd
+EPCkKvbdcyxoxYqC
+EOcKjvbdCSaCsevr
+DoDLKvbdKQzEoGNe
+DoDLKvbdjhHLefOL
+DoCjjvbdRjxeuGjs
+DncKjvbdyOTIXsIc
+DnbkKvbdBdQBWKMf
+EOcKjvbduLxXBUBX
+EObkKvbdrSUkNkAm
+DoDKjvbdKfFhBaRV
+EPCjjvbdddoSBvcK
+DncKjvbdyOTHxTJD
+EOcLKvbdiLeENuDZ
+DoCjjvbdJbjDRKCx
+EPDKjvbddoErkUUS
+DoCkKvbdBiKakJGK
+DnbkKvbdCIjbKiFj
+DoCjjvbdIsZBSmXl
+EOcLKvbdBhjajiFj
+DnbjjvbdrzMQTBIO
+EObjjvbdrWolChyR
+EPCkKvbdEARiMzXX
+DoDLKvbdrWpMDJYq
+EOcLKvbdKRZdoGOF
+DoCjjvbdBsAcUFvr
+DoCjjvbdBraDUGXS
+DoCkKvbdIwtBhMQp
+EObjjvbdeATqMxKG
+EPDKjvbdYzbfRjWZ
+EOcLKvbdsCGNLgKy
+DoDKjvbdhficZWKV
+EObjjvbdZQldhldq
+EPDKjvbdsQVoJbvG
+EPDKjvbdsQVnicWG
+DoDLKvbdVZITyjoO
+EPCjjvbdILazmvpk
+EPCkKvbdZMSDsmlN
+DoCjjvbdZGvdAOri
+DoDKjvbdwuMeRYkn
+DnbjjvbdZyEJmblS
+EPDKjvbdhkeENuDZ
+EPDLKvbdGdKvKCKK
+EPCjjvbdjuwOECXw
+EObkKvbdZeXfzghb
+EObjjvbdJmAEZgUa
+EOcLKvbdtcCuWvOo
+EPCkKvbdiiehJlwr
+DoDLKvbdwtldpyMO
+DoCjjvbdjblLQfuH
+DncKjvbdNPwpunGs
+DnbjjvbdSLZFtgLT
+EPDKjvbdyXhjCPyk
+EObjjvbdliETpuSB
+Dnbjjvbdqlyixkgi
+DoDLKvbdmbJvxOnV
+DoCjjvbdZjSgpGaf
+DoCjjvbdqdEhpNua
+DoDLKvbdelfXGmKL
+EPDKjvbdIGgZyYYH
+DncLKvbdfMfXHMik
+DoCjjvbdZoNheEyj
+EPCkKvbdsZlPsBIO
+EOcKjvbdLAjgMbXq
+DncKjvbdVZITykOn
+DnbjjvbdpyOgfqEY
+EPDKjvbdbUagYKtI
+EObkKvbdrSUjnLBN
+DncKjvbdQwNdDLhD
+EOcLKvbdrykosBIO
+EPDKjvbdsPunicWG
+EPCjjvbdliDtQuRa
+EOcKjvbdcSbkTdKB
+EOcLKvbdKaKgNCXq
+DnbjjvbdZshhxcrn
+DnbkKvbdcbTMrAUN
+EPCkKvbdsQWPKDVf
+DncKjvbdijGHjMwr
+EOcLKvbdULvPBVni
+EPCjjvbdffLynHHA
+DoCjjvbdTqQntuHm
+DoDLKvbdjuwNdCXw
+DoCkKvbdVZITzLOn
+EPDLKvbdqrUkOLAm
+EPDLKvbdZQmEhmFR
+DoDKjvbdwjvdHzyf
+EPDKjvbdePErjtTr
+EObjjvbdmozYvLZC
+DnbjjvbdACrXizIp
+EOcLKvbdTvMQJtAq
+DncLKvbdssSTZZeD
+DnbjjvbdmozZVjxb
+EOcLKvbdtSrSxzFD
+EPDLKvbdZyDjOCkr
+DnbkKvbdbBWEeopX
+EOcLKvbdkWWmcbXw
+DoCkKvbdkVwNdBww
+DncKjvbdEzsqFMCi
+DncLKvbdACqxJyhp
+DoDKjvbdYpmFIleR
+DncKjvbdGKdsCglu
+DoCkKvbdZnnJFEzK
+DoDKjvbdBsBCtGWr
+EPDKjvbdBcpAuimG
+DnbjjvbdIGfzYxXg
+DnbkKvbdGLEsCgmV
+EPCkKvbdySnJNSBg
+DoCkKvbdPyNAGrqj
+EPDKjvbdmaivxPNu
+DnbjjvbddoFSkUUS
+DoCkKvbdySmiNRag
+DoDLKvbdEYXlUUUM
+EObkKvbdCTBCtFwS
+DoDLKvbdoznDkXoA
+EOcLKvbdBvzciEov
+DoCjjvbdSPtHJfEX
+EPDLKvbdtvOYJqTA
+EPDKjvbdZisHpHBf
+EPDKjvbdILazmvqL
+EOcKjvbdRpUHKGDw
+DncKjvbdWXJYWDdg
+EPDLKvbdIwtCHlQp
+EPDKjvbdUtNTfLvK
+DncLKvbddZxpXxqC
+EOcLKvbdkNBlZdgP
+EObkKvbdqYnhGqEY
+EPDLKvbdfpBzwDwh
+DncLKvbdTkuoBVoJ
+DnbkKvbdvvlBWAvV
+DoCjjvbdrXQMCiYq
+EPCjjvbdFeiqmiUR
+DncLKvbdzjUopDsU
+DncKjvbdhkeDmuCy
+EPCjjvbdVqnYBdlD
+EOcLKvbdSCDeLiYk
+DoCjjvbdJvUeceHJ
+EPCjjvbdjgfkfFnL
+DnbjjvbdkVwNdBww
+EObkKvbdczYowyRC
+EPCjjvbdZoNhddyj
+EPCjjvbdOSsugEuQ
+EObkKvbdZMRcsnLm
+EObjjvbdrMzJyLgi
+EPDKjvbdrSUjnKaN
+EPDKjvbdSLYfUfkT
+EPDKjvbdUVlQKUAq
+DoDLKvbdJcKCqJbx
+DnbjjvbdeFPRbWcK
+DoCkKvbdVAbQsQqy
+DncLKvbdpeceTvBI
+DoDLKvbdcIlikFwY
+DoDLKvbdbsDLTdJa
+EPCkKvbdRXOEClHc
+DnbjjvbdbKkennDA
+DncLKvbdEzsqEkcJ
+EPCjjvbdJvUedEgJ
+EOcLKvbdzitpQDsU
+DncLKvbdQvnDblHc
+EOcKjvbdbQGgDkzd
+DnbkKvbddZyPxYpb
+EPDLKvbdLrXNZuQz
+DoDKjvbdDjIJvYKA
+EPCjjvbdbVCHXjsh
+EOcLKvbdsPunicVf
+EOcLKvbdEzspdlCi
+DoDLKvbdmRxtzSdJ
+DnbjjvbdsBfNLfjy
+DoCjjvbdcTDLUDia
+EPDLKvbdidjgVPAO
+DoCkKvbduVmxKQsA
+EObjjvbdxLXDgzzG
+EPCkKvbduaEZSoFI
+EOcLKvbddneSjssr
+DoCkKvbdWXJYVdFH
+DncLKvbdHkaznWqL
+DncKjvbdbVCGxKsh
+DnbjjvbdiMEcmtcZ
+DoDKjvbdqAheAXHd
+EPCkKvbdMIalQxAS
+DnbjjvbdVviXucdg
+DnbjjvbdMpXpumgT
+EObkKvbdMJCLqYAS
+EObjjvbdczZQYYqC
+DncLKvbdUxgtZjoO
+EOcLKvbdjuwNdCYX
+DncKjvbdSwjlNzkY
+EPDLKvbdrWpLbhxq
+DoDKjvbdnBjWwoOV
+EPCjjvbdmSYtyrdJ
+DoDLKvbdzeZnzdzQ
+DncLKvbdMowqWOGs
+EPCkKvbdqTsfqrLU
+EObkKvbdraemMHKy
+EOcLKvbdJcJbpjCx
+DnbjjvbdmuUzKjRf
+DncKjvbdNeEThhkE
+DoDKjvbdHakydzAD
+EOcKjvbdXsLaNUPY
+EObjjvbdLFfHbBQu
+DncLKvbdbKlFoODA
+DoCjjvbdRpTfiecw
+DnbkKvbdRkYetgLT
+DoCjjvbdegkVrOQg
+DoDLKvbdhlFEOUby
+DoCkKvbdFyUtaEXb
+DnbjjvbdAMgxsXZx
+EOcLKvbdUQqOtuHm
+EPDKjvbdxrmiMrCH
+EOcLKvbdREDApQdS
+DoDLKvbdWRmxBdlD
+DnbjjvbdiHKCyVjV
+EPCkKvbdxwhjCPyk
+EObjjvbdLKaHvAJy
+EPDLKvbdZtJJYcsO
+DoCjjvbdbPfgDkzd
+EObkKvbdUaBqTRRy
+EPDKjvbdGYtuAcwb
+DnbjjvbdQcbaQRDr
+EPCjjvbdsBfNMHKy
+EPDKjvbdZyDimblS
+DoDKjvbdJXtBglRQ
+EObkKvbdpssfrSLU
+EOcLKvbdMRwMytpz
+DoCjjvbdEYYMUTtM
+DoCkKvbdeAUQmXif
+DncLKvbdUaBqSpqy
+EObkKvbdVAbQrqRy
+EObkKvbdwXMAuaWV
+DncLKvbdCIjakIfK
+DncLKvbdjmBkzEfo
+EOcLKvbdKVtfDeGi
+EObkKvbdnQZyVjxb
+DncLKvbdzRPMhiwA
+DncKjvbdJpydnfOF
+EPDKjvbdqTsfrRkU
+EPDLKvbdEuyQPlie
+DnbjjvbdfSBWzlCo
+DnbkKvbdqiAKFMne
+EPCjjvbdatbHYLUI
+EOcKjvbdNsTugEtp
+EPCkKvbdmgFXmNgZ
+EPDLKvbdMSXNZtpz
+DoDKjvbdUaBprqRy
+DnbjjvbdXmqAXtvU
+EOcKjvbdHlBznWpk
+EOcKjvbdVqmwbElD
+DoCkKvbdqrVLOLAm
+DnbkKvbdZshiYcrn
+DoCkKvbdZoNhddyj
+EOcLKvbdEuxooljF
+DnbkKvbduCcVXVoP
+EPCkKvbdmuVZjirG
+DncKjvbdRzKHrbvA
+EObkKvbdeKJqutzn
+EObkKvbdyOShXsIc
+EPCjjvbdRbDdlJZL
+DoDKjvbdSBdFMIxk
+DncLKvbdKaKgMawq
+EObkKvbdCDpAuilf
+DnbkKvbdRWnDcLgc
+DncLKvbdqlzJxkhJ
+EPCjjvbdNHDQMpUk
+EOcLKvbdRMwbZNtz
+EPDKjvbdOEdThiLE
+DoDLKvbdUyHszKoO
+DnbkKvbdZisIPgCG
+DncKjvbdwzHeeweS
+DncKjvbdQwODcLhD
+DoDLKvbdqdFJPmua
+EOcLKvbdvwMAvBVu
+EPDLKvbdbVBfwjsh
+DoCkKvbdRyjHrcWA
+DoDLKvbdWIYVxGxz
+DnbkKvbdbiMjLGXY
+EOcLKvbdBhjbKiFj
+EObjjvbdCDpAvJmG
+EPDKjvbdLBKfmCYR
+DoCkKvbdbiMijevx
+DnbkKvbdyOSgwriD
+EPDLKvbdlYrqsZHU
+EOcLKvbdwyhGFxFS
+EPDLKvbdRyjHsCvA
+EPCkKvbdHgGzYxYH
+DoDLKvbdGFjRmhtR
+EPDKjvbdFyUtaEYC
+DncLKvbdeFOrCWbj
+DoDLKvbdJSyArlwl
+EOcKjvbdZyEKODLr
+EOcLKvbdemGXGmJk
+DnbjjvbdSCDeLhyL
+DoDLKvbdYTLaMsnx
+DoCjjvbdxKwEHzyf
+EOcLKvbdiVZdvquC
+DnbkKvbdUaBqTQqy
+EPCjjvbdGZVVBEXb
+DoDLKvbdCEQAvKMf
+DoDLKvbdRWmdCkhD
+EPDKjvbdRotHJecw
+DoCjjvbdZxcimblS
+EOcLKvbdtbcUvvOo
+DnbjjvbdZsiJZDsO
+EOcKjvbdRyjHsCvA
+EOcKjvbdxLWdHzzG
+DoCjjvbdFjdrbhMu
+EPCkKvbdxVNFRYlO
+DoCkKvbdmIcsqUqa
+EPDLKvbdfMfWgMjL
+EPDKjvbdTqQoUthN
+EOcKjvbdtkwvaUAw
+DoDKjvbdBdPaVilf
+DoDLKvbdZMRdTmkm
+EPDLKvbdelewGlik
+DoCkKvbdwzHfFxEr
+EPCkKvbdvAcyTPFI
+EObjjvbdQdDBPqES
+DoDKjvbdZtIiYcrn
+EOcKjvbdypnlhiwA
+DoCkKvbdNrtWGduQ
+DncKjvbdxsOIlqbH
+EPCjjvbdANIYrvyx
+DnbjjvbdNwnuzdOU
+EPCkKvbdFyUuBEXb
+EOcLKvbdaaWFGQQX
+DncLKvbdraelkfkZ
+EPCjjvbdTpqPVUhN
+DncKjvbdySmiNSBg
+EPDKjvbdrpWPJbvG
+EObjjvbdwNWANEFN
+EObjjvbdZeYGzhJC
+DoCjjvbddndsKstS
+EPDLKvbdegkWSORH
+EPCjjvbdvwMAvBVu
+EPCjjvbdkySqrxgU
+EPCkKvbdHkaznWqL
+EPCjjvbdqlzKYkhJ
+DncLKvbdZxdJmcMS
+EPCjjvbdqGEFTvAh
+EObjjvbdTYKkmzkY
+EPCkKvbdZisHofbG
+EOcLKvbdzoPpdcLx
+EPDKjvbdZjTHpHCG
+EOcKjvbdKWVGEFHJ
+EPCjjvbdhyuFlROG
+EPCkKvbdFjeTDIMu
+DncLKvbdOYPVzcnU
+DoCjjvbdSZjISbvA
+DoCkKvbdZoNiEdyj
+EPCjjvbdrWpMDJZR
+EObkKvbdkVvnDaxX
+EObjjvbdcSbjtDia
+DnbjjvbdLGGICBRV
+EPDLKvbdkWWmcbXw
+EObjjvbdnHExNOHZ
+DncKjvbdUtNUFlVj
+EObkKvbdEvZPomKF
+DoCkKvbduoTzpjnt
+EOcLKvbdURQoVVHm
+DnbkKvbdTAEiIBnd
+DncKjvbdQwOECkgc
+DnbjjvbdRbDdkiZL
+DoCjjvbdEPCkLWcE
+EPDKjvbdzjUpPdSt
+EPDKjvbdZMSDsmkm
+DoDLKvbdBdPaWJmG
+EPCkKvbdwjwEHzyf
+DnbjjvbdhuZeXSUb
+DoCkKvbdlYrqsYft
+DoCjjvbdEXxMTssl
+DoDKjvbdzoPpdbkx
+DncKjvbdWRnXbFMD
+DoDLKvbddijRutzn
+DncKjvbdnCKWwnmu
+EOcLKvbdZMSDsmkm
+EOcLKvbdUaCRTRSZ
+EObkKvbdkCkjpgVH
+DnbkKvbdirziTKiz
+DoDLKvbdJpyeOenF
+EObkKvbdGKdsDHmV
+EObjjvbdoAKzshDn
+EPDLKvbdlrZVZrci
+DncLKvbdRzKHsDWA
+EObkKvbdKkAhWAKZ
+EPDLKvbdVAaqSqRy
+DoCkKvbdjAPgApHK
+EPCkKvbdBcpBWJmG
+DncKjvbduCbuXWOo
+EOcLKvbdqiAKEmOe
+EPDKjvbdYpldhleR
+DnbjjvbdEPCjjwCd
+DnbjjvbdbsDKtEJa
+EObjjvbdKfGICBRV
+DoDLKvbdRadFMIxk
+DoDKjvbdGGJqmhsq
+EPCjjvbdJbicQjDY
+DncKjvbdbiNKKfWx
+EOcLKvbduLxXAsaX
+EPCjjvbdEKIJuwjA
+EPCjjvbdWRmwadlD
+DnbjjvbdfMewGmJk
+EOcLKvbdNxOuzdOU
+DnbkKvbdfIKvSOQg
+DncLKvbdQZNAHSqj
+DnbjjvbdZLqdUNlN
+EPCjjvbdSLYetgLT
+DncKjvbdeEoSCWbj
+EPDLKvbdsCFmMGjy
+EPDLKvbdLGGHaaRV
+DncLKvbdEuxpQMjF
+EObjjvbdVYhTzLPO
+EPCkKvbdaSFbhTek
+DnbkKvbdDihJuwjA
+EObjjvbdFjeTDIMu
+EObjjvbdhkeDnUby
+DoDKjvbdxUmEpyLn
+DncLKvbdiVZdvqtb
+DoCkKvbdunszqLPU
+DnbkKvbdSBcdkiYk
+EObjjvbdbhmKKevx
+DnbjjvbdVZHtZkOn
+DoDLKvbdZirgogCG
+DoDLKvbdqBIeAWhE
+EPCjjvbdwtmEqYkn
+DncKjvbdKCjDRJbx
+EOcKjvbdTvLpJsaR
+DoDKjvbdyXhjBozL
+DnbjjvbduDDUwVoP
+DoDKjvbdzaAOfgBl
+DoCjjvbdWSOYCElD
+EOcLKvbdqwQMDJYq
+DoCkKvbdNHColpUk
+EPCkKvbdCEPaVimG
+EOcKjvbdjKFhJlxS
+EOcLKvbdxUleRYkn
+DnbkKvbdrNZjZMHi
+DoDKjvbdmuUzLKSG
+EObjjvbdfIKurOQg
+EPDKjvbdQlwbZNtz
+DncKjvbdhkeDnUby
+EObjjvbdwuMdqZMO
+DncKjvbdliDtQtrB
+EPCjjvbdNPwqWNgT
+DncKjvbdjAPgApGj
+EObkKvbdMpYRVmfs
+DnbkKvbdGKeTChNV
+DoDLKvbdHbMZdzAD
+EObjjvbdQlwayOUz
+EPDKjvbdVqnYCFLc
+DoCkKvbdmpZyVjyC
+EObkKvbdUslsfLuj
+DoDLKvbdlhdURVSB
+EOcLKvbdmSZVZrci
+DoCjjvbdYzberJuy
+EPDLKvbdhzVGLpnG
+EPCjjvbdsPvOicVf
+EObkKvbdeOeTLUUS
+DncLKvbdmfdxMnHZ
+EPDKjvbdHffzYwxH
+EPDLKvbdrylPsAgn
+EOcKjvbdwWlBWAvV
+EPDKjvbdVAbQsQqy
+DnbkKvbdsZlPsBIO
+DncLKvbdEzspdkbi
+DncLKvbdhyuGMROG
+DoCkKvbdFaOpxizm
+DoCkKvbdZsiIxcrn
+DoCkKvbdijGHjMwr
+DnbkKvbdcyxpYZQb
+DnbjjvbdEzspdkbi
+DncLKvbdNQYRVnGs
+EObkKvbdkClKpgVH
+EOcLKvbdkClKqHVH
+EOcKjvbdhanbdvqR
+EPCkKvbdmfdwmNfy
+EObkKvbdYTMAmUPY
+DoCkKvbdIGgZxxXg
+EOcKjvbdnHEwlnHZ
+DncLKvbdCDpAuilf
+EPCjjvbdmbKXXoOV
+EObkKvbdapGfdLzd
+EPCkKvbdRjyGVHLT
+DoCkKvbddoFTLTtS
+EPCjjvbdGLFTCglu
+DoCjjvbdiLeENtcZ
+DoCkKvbdKCicQjCx
+EPCkKvbduoTzqLPU
+EPCjjvbduVmwiqTA
+EPCjjvbdWIXuxGxz
+EPCjjvbdpxngfqDx
+EOcKjvbdeOdrkTsr
+DoDLKvbdNrsufduQ
+EOcKjvbdIHHZyXwg
+DoCjjvbdpfEEsvBI
+EOcKjvbdhgKDYvKV
+DnbjjvbdmbJvxOmu
+EPDKjvbdGdKujCKK
+DoDLKvbdfkGzcGAE
+EPCkKvbdZoNiEeZj
+EPDLKvbdaMjbTUlg
+EPCkKvbdSPsgJfEX
+EPDKjvbdDxYLstUM
+EPCjjvbdKVtfDeGi
+EOcLKvbdpeceTvAh
+EObjjvbdHffzYwxH
+DnbjjvbdffMZnHHA
+EOcLKvbdsQVnibvG
+EOcKjvbdZirgpGbG
+EObjjvbdJSxaTMxM
+EOcLKvbdbrcLUEKB
+EPCjjvbdGZUuAcwb
+DnbkKvbdpssgRrLU
+DnbkKvbdKVteceHJ
+EPDKjvbdmajXYOmu
+EPDKjvbdNwoVzdOU
+DnbjjvbdrpVnicWG
+DoDKjvbdjhGlFfNk
+EObjjvbdEXwlTtTl
+DoDLKvbdkCkkQftg
+DncKjvbdDxYLtUTl
+DncKjvbdNQYQunGs
+DoDLKvbdZQleImFR
+DoDKjvbduVmxKRTA
+DoDLKvbdsrqsZZdc
+DoDLKvbdZLqctNlN
+EPDLKvbdNsUVfeVQ
+DncLKvbdhuZeXRuC
+EPCkKvbdiCObdwRR
+DoDKjvbdIwsbIMQp
+EObjjvbdtcCtvvPP
+EOcLKvbdpyOhHRDx
+EObjjvbdmgEwmOHZ
+DoCkKvbdelevgNJk
+DoCjjvbduLwwBTaX
+DoCkKvbdXrlBNTnx
+EPDLKvbduCcUvuoP
+EPDKjvbdURRPVUgm
+EObkKvbdBsBCsfXS
+DoDLKvbdZjSgogCG
+EObkKvbdhgKDZViu
+EPCkKvbdEYXkstUM
+DncLKvbdrMzJyLgi
+DnbjjvbdaSFcIUFk
+EPDLKvbdnBjWxOnV
+EPDLKvbdssRryZeD
+EOcKjvbderAvzkbo
+DoCjjvbdZirhQHCG
+DnbkKvbdBraCtFvr
+EOcLKvbdxZgfFxFS
+DoDKjvbdJuuFdFGi
+EPDKjvbdUQqPUtgm
+EPDLKvbdNHCpMpUk
+EPDKjvbdnCKXYOnV
+DoCkKvbddZyQXyQb
+DnbjjvbdpxoHgREY
+EPCkKvbdfNFwHNJk
+DncLKvbdVBCQsQqy
+EPCkKvbdUxhTzLOn
+EObjjvbdSQTgJfEX
+DoCkKvbdrWpLbiZR
+DoDLKvbdtcDUwWOo
+DoCkKvbdwzHfGXeS
+EPDLKvbdrzMPraHn
+EPCkKvbdDoCjjvcE
+DoDLKvbdbhlijewY
+EObkKvbdUxgsyjoO
+DoDLKvbdbUafxKsh
+DoCjjvbdULuoBWOi
+EPCkKvbdVBBqSqRy
+DoCjjvbdhkeENtcZ
+EPCjjvbdqYnggRDx
+DncLKvbdjhHMFfOL
+EOcKjvbdZxcinDMS
+DoDLKvbdvBDySndh
+DncKjvbdirziTKiz
+DncKjvbdJXsaglRQ
+DncKjvbdhfjDYvJu
+DncLKvbdjuvnDbYX
+EOcKjvbdKaLHMaxR
+DoCjjvbdiGjDZWKV
+DnbjjvbdEObjkWbd
+DnbkKvbdJmADygVB
+EPDKjvbdJvVFdEfi
+EPDLKvbdnGeXmOGy
+DoCjjvbdpssgSSKt
+EPDKjvbdwtldqYlO
+EPDKjvbdmfeXmNgZ
+DoCjjvbdqvokbiZR
+DoDLKvbdqUUHSRjt
+EObkKvbdmbKXYOnV
+EOcKjvbdaSGChTfL
+EPCkKvbdWWiYWDdg
+DoCjjvbduoTzqKnt
+DnbjjvbdHDkVjBjK
+EOcKjvbdbVBfwjtI
+EOcKjvbdjvXOEBxX
+DncKjvbdZLrETnMN
+EObkKvbdfNGXHMjL
+EPCkKvbdkDLkRHUg
+EObjjvbdZjTIQGbG
+DoDKjvbdZsiIyDsO
+DnbkKvbdbrbjscjB
+EPCjjvbdmbJwYPOV
+DoCkKvbdKDJcQicY
+DoDLKvbdZxcinCkr
+DoDKjvbduoTzqLPU
+EOcKjvbddndsKstS
+DnbjjvbdNQXqWNfs
+EOcKjvbdIidAKQGd
+DoDLKvbdTkvOaVni
+DoCjjvbdsPvPJcVf
+DoDKjvbdVqnXbElD
+EOcKjvbdIHGyyXxH
+DnbkKvbdUxgszLOn
+EPDLKvbdwuMdpxkn
+DnbkKvbdqrVLNkBN
+DncKjvbdijFgjMwr
+EPCkKvbdSQUGjFcw
+EObjjvbdRWmdCkgc
+DnbkKvbdVTltFkvK
+EOcLKvbdJbjCqKDY
+EObkKvbdfMfXGmKL
+EObjjvbdzRPNJKXA
+EPCjjvbdBsAbtGWr
+DoDKjvbdJXsahLqQ
+DnbkKvbdlBNOmALA
+DoDLKvbdlrYtzTDi
+EPDLKvbdZtJIxdTO
+DncKjvbdmbJvxPOV
+EPDLKvbdaMkBsUmH
+EPCkKvbdNsUVgFUp
+DoCjjvbdWfYytAPT
+EObjjvbdNHCpMpVL
+EPCjjvbdMgComPtk
+EOcLKvbdeqaWzlDP
+DoCkKvbdFVxopNKF
+EOcKjvbdYkrDsmlN
+DncKjvbdWWiYWEFH
+DoDKjvbdSLYfUfkT
+DnbjjvbdhkeEOVCy
+DoDKjvbdJXsagkpp
+DoDLKvbdZoOIdeZj
+DncLKvbdLiCMRYAS
+DncKjvbdyOTHwsJD
+DncKjvbdvmWANDeN
+DoDLKvbdtTSTYydc
+DoCkKvbddneSjtTr
+EObkKvbdkDMKpftg
+DnbjjvbdbhljKewY
+EPCkKvbdIsZBSlwl
+EPCjjvbdlqxuZsDi
+DnbjjvbdNrtWGeVQ
+EOcLKvbdvBEZSndh
+EOcKjvbdrJAJdmOe
+DoCjjvbdyOTHxTIc
+DoCjjvbdmfdwlnGy
+EOcLKvbdkDMKpgVH
+DoCkKvbdRECaQQdS
+DncKjvbdaMjartlg
+EPCjjvbdVviXuceH
+DnbkKvbdNsUVgFVQ
+DoDKjvbdFkEsDIMu
+EOcKjvbddZyPwyQb
+DoDKjvbdqmZixlIJ
+DoDKjvbdrEEhomvB
+EOcLKvbdlZSqsZHU
+EPCkKvbdehKuqmqH
+DoDLKvbdFxtuBDwb
+EPCjjvbdKjaHvAJy
+DncLKvbdBcpAujMf
+DoCjjvbdNQYRWOHT
+DoCjjvbdHakzEzAD
+EPCkKvbdJTYaSlwl
+DoCjjvbdzitpQETU
+DoDKjvbdvBEZSoFI
+DncLKvbdnBjXXoOV
+DoDLKvbdiZuGMROG
+DoDKjvbdKVtecdfi
+DnbjjvbddjJqvUzn
+EPCkKvbdaMjbStlg
+EOcKjvbdSZjHsDWA
+DnbkKvbdUaCRSqSZ
+DoDLKvbdxZgefXeS
+DncKjvbdjhGkfFnL
+DncKjvbdIjEAJogE
+EPCkKvbdNGcPlpVL
+DncKjvbdUMWPAvOi
+DnbkKvbdatafxKsh
+EObkKvbdjcMLQgUg
+DoDKjvbddeOqavcK
+EOcLKvbdoznELXoA
+EPDLKvbdeOdrjtUS
+DnbkKvbdjKFhJmXr
+EPCkKvbdpxoHfpdY
+DoCjjvbdZLrDsnMN
+EPCkKvbdwyhFexFS
+EOcKjvbdkClKpftg
+DoDKjvbdxnTIYSiD
+DncKjvbdxnShYSiD
+DoCkKvbdFxtuBDwb
+EObjjvbdYkrEUNkm
+DnbjjvbdNQYQvNfs
+EPCkKvbdhlFDnUby
+EOcLKvbdiCObdwRR
+DoCjjvbdVwJXvEFH
+DnbkKvbdBvzchePv
+EObkKvbdZHWdAPSi
+DncKjvbdHgGzYxXg
+DoCkKvbdMJCMQxAS
+EPCkKvbdZLqdTmkm
+DoDLKvbdnCJwYPNu
+EPCjjvbdOSsvGdtp
+DncKjvbdlYrqsZGt
+EOcLKvbdJYUBhLqQ
+DoCjjvbdZisHpGaf
+DnbjjvbdVgxWXfxz
+EPDKjvbdkWXNdBxX
+DoCkKvbdlZTSSyHU
+DncKjvbdjggLeenL
+DnbjjvbdKNAEZfuB
+DoCjjvbdLAkHMaxR
+EOcLKvbdZRNFJNFR
+DoDLKvbdjAQGaPfj
+EObjjvbdjggMGFmk
+DoDLKvbdyfyMAMeX
+DncLKvbdjbkkRHVH
+EOcLKvbdOTTugFVQ
+EOcKjvbdWHxWXfxz
+EPCkKvbdvwMBWBVu
+EPCjjvbdnHEwlnHZ
+DoDKjvbdHEKuiaij
+DoCjjvbdVwIwvEEg
+EPDLKvbdehKvRnRH
+DncLKvbdnVUyjirG
+EObjjvbdfMevgNJk
+EPDKjvbdjbkjqHVH
+DncLKvbdrJAKEloF
+DoCkKvbdGckWJaij
+DnbjjvbdTvMQJtAq
+EPCkKvbdhkddNtcZ
+DnbkKvbdrzMQTBIO
+DncKjvbdsZlQTAgn
+EPDLKvbdOFDtJIjd
+EOcLKvbdnBivwoOV
+DncKjvbdJXtBhLpp
+EPCkKvbdJTYaSmXl
+EOcLKvbdLGFgbBQu
+DncKjvbdnHEwlmgZ
+DoCjjvbdACrYJzJQ
+EPCkKvbdiZuGLqNf
+DnbjjvbdnGdxMmfy
+DnbkKvbdRkZGUgKs
+DoDLKvbdZisHofaf
+EPDLKvbdJKEAJpGd
+DnbkKvbdBsBDUFwS
+EObjjvbdtcDVWuno
+EOcKjvbdBsAbsfWr
+EPDKjvbdrWpMChyR
+DoDLKvbdVTltFkuj
+EPDKjvbdGFjSOJUR
+EOcKjvbdBsAcUGXS
+EPCkKvbdcJNKKfWx
+EPDLKvbdnQZyWKxb
+EPCkKvbdqTtGrSKt
+EObkKvbdjJfIKNXr
+EOcLKvbdVqmxBdkc
+EOcKjvbdFWYopMjF
+DnbjjvbdqdFJPnWB
+DoCjjvbdehKvRnRH
+EPDKjvbdkyTRsZGt
+EObjjvbdozmckYPA
+DnbjjvbdbrcLUDjB
+DoDLKvbdrMyixkhJ
+DoDLKvbdrpWOjCvG
+DoDKjvbdLFehCAqV
+DncKjvbdrWpMCiYq
+EOcKjvbdVTmUFkvK
+EObkKvbdhficZVjV
+EPCkKvbdIsZAsNXl
+DoCjjvbdmfdxNOHZ
+EPDKjvbdznopdblY
+DnbjjvbdLiCMRYAS
+DncLKvbdePEsKstS
+DoDLKvbdUMVoBVni
+DncKjvbdWRnXaeLc
+EObjjvbdrDdiPmvB
+DoDKjvbdDoDKkXDE
+DncKjvbdOAIrtJrA
+EPCkKvbdwzIGGXdr
+EOcLKvbdUQqPUtgm
+EPDLKvbdhlFEOUby
+DncKjvbdZirhPfbG
+EOcLKvbdKVuGEEgJ
+DoDKjvbddePSBvbj
+EPDLKvbdfHjuqmqH
+EPDKjvbdZjSgpHBf
+DncLKvbdunszpjoU
+EPCkKvbdqTtHRrKt
+EObjjvbdfNGXGljL
+EObjjvbdUGznMWue
+DnbkKvbdsPuoJbvG
+EObjjvbdnQZxujxb
+EPDLKvbdczZPwyQb
+DoCkKvbdWXIwvDdg
+EOcKjvbdQvmdDLhD
+DncLKvbdCIkBjiFj
+EObjjvbdjJegjNXr
+DncLKvbdcIlikFvx
+EPDLKvbdRkZFtfjs
+DoCjjvbdczYoxZRC
+EOcLKvbdatagXjsh
+DncLKvbdjcLjqGuH
+DoCjjvbdMSWlyuQz
+DoCkKvbdjuvnDbYX
+DnbjjvbdiMEdOUcZ
+EPCjjvbdcTDKtEKB
+DnbjjvbdwzHeexEr
+EPDLKvbdemGWgNJk
+EObjjvbdakLfOnDA
+EPDLKvbdTfznLvvF
+DoDKjvbdaNLBsUmH
+EOcLKvbdhzVFkqNf
+DoDKjvbdZRNFIldq
+DoDKjvbdlrZVZsEJ
+EObkKvbdbUagXjtI
+DoDLKvbdUyHsykPO
+EObjjvbdkVwNdCYX
+EPDLKvbdUVkpJtBR
+EPDKjvbdrMzJxkgi
+EOcKjvbdSLYfUgLT
+DoCjjvbdMRwNZtpz
+EPDLKvbdIxTaglRQ
+EPDLKvbdJqZdnenF
+DoDLKvbdZMRdTmkm
+DnbkKvbdANHxrvyx
+EPCjjvbdFkErbhNV
+EOcLKvbdWSNxCEkc
+EPCjjvbdiCPCdwQq
+DnbkKvbdbAvEeoow
+EOcKjvbdeFOrBvcK
+DnbkKvbdaRecHtGL
+DnbkKvbdZshhxcrn
+EOcKjvbdqTtHRrKt
+EObjjvbdauBgXjtI
+EOcKjvbdQdCaQRDr
+DoCjjvbdFVxopMjF
+EPDLKvbdIGgZyXwg
+DoDLKvbdRpTfjFdX
+DnbkKvbdSQUGifEX
+DnbjjvbdpxoIHREY
+DoDLKvbdqiAJeMne
+EOcLKvbdCIkBkJFj
+DncLKvbdFfKSNhsq
+DoDKjvbdwWkaVaVu
+EPDLKvbdNeETiJKd
+DnbjjvbdhbOcEvpq
+DoCkKvbdrbGMlHLZ
+DnbjjvbdLAjgMawq
+DncLKvbdlqyUzSdJ
+DncLKvbdYkqdTnLm
+EOcKjvbdYkrDsnMN
+EOcLKvbdnCKXXnnV
+DoCjjvbdDncLLWbd
+DoDKjvbdYpmFJMdq
+EPDLKvbdFpATXHFy
+DoDKjvbdJvUfEEfi
+EPDLKvbdmJEURVSB
+DncLKvbdtbcVWuno
+EOcLKvbdbUagYKtI
+EObkKvbdcJMjKevx
+DnbjjvbdKVuGEFGi
+DoCkKvbdZMRctNkm
+EOcLKvbdYpmEiMdq
+DoDKjvbdYpmEhmEq
+DncKjvbdzjVQQDrt
+EPCjjvbdzHYlAMdw
+EPDLKvbdYkqcsnMN
+EObkKvbdiiehJmYS
+DnbjjvbdDwwktUUM
+EObkKvbdrounjCuf
+DnbjjvbdGGKRmiUR
+EOcLKvbdwzIGFxEr
+EPDKjvbdOEdUJJLE
+DoCkKvbdfNFvgMjL
+DoDLKvbdOEdThhjd
+DnbkKvbdyTOImSCH
+EOcLKvbdzitpQESt
+DoDKjvbduDCuWvPP
+DoCjjvbdTppnuUhN
+DoCkKvbdIBlZdzAD
+DoCjjvbdZQmFJMeR
+DnbkKvbdJXsaglQp
+DoCkKvbdSZigrcWA
+EObjjvbdZsiIyETO
+EPDKjvbdZLqctOLm
+DncKjvbdwyhGFxFS
+DncLKvbdqwPkcIyR
+EPDKjvbdRkYfUgLT
+DoCkKvbdxxIjBpZk
+DncLKvbdqlyjYlIJ
+EPCjjvbdRaceLiYk
+EPDKjvbdjlbLyeHP
+EPDKjvbdrbFmLfkZ
+EPCkKvbdvBEYsPFI
+DncKjvbdSBdElJYk
+EPDKjvbdpxoIHREY
+EPCkKvbdjhHMFfNk
+EPCkKvbdANIYsXZx
+EObjjvbdnGdxNOHZ
+EObjjvbdKQzFPGOF
+DoCjjvbdtunYKRTA
+DnbjjvbdLFfHbBRV
+EOcKjvbdpedEsuaI
+DnbjjvbdYkqcsmkm
+EPCkKvbdbrcLUEKB
+DnbkKvbdNQYQunGs
+DoDLKvbdJcJbqKCx
+EPDLKvbdIxTbHlRQ
+DnbkKvbdvwMAvBWV
+EOcKjvbdfHkVqnQg
+EOcLKvbdbKkfPNcA
+EPDLKvbdVAbQrpqy
+DncLKvbdWRnXaeLc
+EPCkKvbdFpATXGey
+DoDLKvbdyfxlANFX
+DoCkKvbdFVyQQMjF
+EOcLKvbdxnShXrhc
+DoCjjvbdmaivwoOV
+DnbkKvbdbsDLTdJa
+DoCkKvbdUtMtGMVj
+DnbjjvbdNVSqkNAX
+EPDLKvbdWfYytAOs
+EPCkKvbdZyEJnDLr
+EObkKvbdyXhjCQZk
+EObkKvbddoFSkUTr
+EOcKjvbdeATqMxKG
+DnbkKvbdnPyyWKyC
+DncKjvbdkySrTZHU
+DnbjjvbdmfdxNNfy
+EPCkKvbdHlBznXQk
+EPDKjvbdZisIPgCG
+DncLKvbdrEEhonVa
+DoDLKvbdrykosBHn
+EObkKvbdqvpLbiZR
+DoCjjvbdhkeDnUcZ
+DoCkKvbdVwIwudEg
+DncLKvbdyXiJaozL
+DoCkKvbdyzeOSIIh
+EPCjjvbdkVwNcbYX
+DncLKvbdTkuoAuoJ
+EPCjjvbdijFgimYS
+DncLKvbdliEURUrB
+DoDKjvbdURQoUuIN
+DoDKjvbdrMzJxkhJ
+EPCkKvbdqYngfqEY
+EPDLKvbddwzUTrFz
+DoCkKvbdyYIjBpZk
+EPCjjvbdssSSxzEc
+EObkKvbdFejSNiUR
+EPCkKvbdrEFJPmua
+DnbkKvbdiifIJmXr
+EPDLKvbdZLrEUOLm
+EObjjvbdGFiqnItR
+DoCkKvbdjuwNcaww
+DncKjvbdmpZxukYb
+DoDLKvbdqdFJQNua
+EPDKjvbdNQYRWOGs
+DoCjjvbdZeYGzhIb
+EObjjvbdZjSgpHCG
+EObjjvbdhfjDYvKV
+EPCkKvbdJpzFOeme
+DnbkKvbdlhcsptrB
+DncLKvbdFeiqnJTq
+EObjjvbdZxcinCkr
+EPDLKvbdFVyQPmKF
+EObkKvbdelfWfljL
+EOcKjvbdJpydnenF
+DnbkKvbdbVCGwkUI
+EObkKvbdemFwGmJk
+DoCkKvbdBsAbsfWr
+EPDLKvbdJYTbHkqQ
+DncKjvbdyNrgxTIc
+DoDKjvbdGQASvfey
+EOcLKvbdRNYCZOUz
+EOcKjvbdyzeORgiI
+EOcLKvbdZQmEhleR
+EPCjjvbdmttyjjRf
+DnbjjvbdLBLGmBwq
+EOcLKvbdKVuFdFGi
+EPCkKvbdxmsHwsJD
+DoDLKvbdyOTIXriD
+EPDLKvbdZsiJYcsO
+EPCjjvbdjvXOEBxX
+DoCkKvbdlZSqsZGt
+DoDKjvbdADRxKZiQ
+EOcKjvbdzoQREcMY
+EObkKvbdGGKRmhsq
+EObjjvbdJutfDdgJ
+DoDLKvbdUsltFkvK
+EObkKvbdHDkWKBjK
+DncKjvbdLqwMzVQz
+EObjjvbdaRecITfL
+DoDKjvbdakMGPNcA
+DnbjjvbdwXMBWAvV
+EOcKjvbdQwOEDLhD
+EOcKjvbdAMgxrwZx
+DnbjjvbdqqtkNkAm
+DoDLKvbdbhmKKewY
+DoCjjvbdQmYBxnUz
+DnbkKvbdvPTzqKnt
+EPCkKvbdJqZePGOF
+DoDLKvbdTfznMXVe
+DoCkKvbdFyVUaDwb
+DncLKvbdFxuUaDwb
+EObkKvbdhlEcnUby
+DnbjjvbdCJLCKhfK
+DoCkKvbdPyNAGrrK
+EOcKjvbdVgxVxGxz
+EObkKvbdSxKkmzjx
+EOcLKvbdemFwHMjL
+EObjjvbdrEEiPnVa
+DoCkKvbdDjIJvXjA
+EPCjjvbdYTMAmToY
+DoCjjvbdbLMFnmcA
+DoCkKvbdrounjCuf
+EPDKjvbdrJAJeNOe
+DncLKvbdJbicQjDY
+EPCjjvbdmpZxvLZC
+DncLKvbdVrNxCElD
+DnbkKvbdDoDLKwCd
+DoDKjvbdsZkpSaIO
+EPCjjvbdNQYRVnGs
+DoCkKvbdVrOXbFMD
+DoCjjvbdlYrqryHU
+DoDLKvbdVTltGMVj
+DncLKvbdwzHfGXeS
+EPCkKvbdmajXYOnV
+EOcLKvbdZLqdTmlN
+DoDLKvbdqdFJQOWB
+EObkKvbdVgwvXgYz
+EPDKjvbdkMakzFHP
+DoDKjvbdakLfPNcA
+EObjjvbdyYJJbQZk
+DoDLKvbdDigivXjA
+DoDLKvbdHELWJajK
+EObjjvbdZGvdAPTJ
+EOcKjvbdUGzmkvue
+DncLKvbdSZigsCvA
+DoDLKvbddBsMrATm
+EObkKvbdmSZUzSdJ
+DncKjvbdjAPfaQGj
+DoDKjvbdlBMoNALA
+DnbkKvbdJTZArlxM
+EObjjvbdHgHZyXwg
+EPDLKvbdhzUekpnG
+EPDKjvbdEOcKjvbd
+DoCkKvbdjcLkRHUg
+EObjjvbdBiLBkIej
+DnbjjvbdZMSEUNkm
+DoCkKvbdzRPNJJwA
+EPCjjvbdGdKuiajK
+EPDLKvbdrEFIpOVa
+EPCkKvbdKfGHbApu
+EPDKjvbdUtMsfMVj
+DoDLKvbdbVCHYKsh
+EPDLKvbdEztRFMCi
+EOcLKvbdJmADzGta
+DnbjjvbdtSrSxydc
+DoCjjvbdACrYKZiQ
+EPDKjvbdsrqsYzEc
+DoCjjvbduLxXAtAw
+DoCjjvbdEztQdkbi
+DoDLKvbdkClKpgVH
+DoDLKvbdSCDeMJYk
+DoDLKvbdpxoIGqDx
+DoCkKvbdDigjVxKA
+EPDKjvbdGGKSOJUR
+EOcLKvbdiLeDnVDZ
+DnbjjvbdyOSgxShc
+EPDLKvbdNsUWHEuQ
+EOcLKvbdYpmFImEq
+DoDKjvbdZLrDtOLm
+DncKjvbdJvVGEFHJ
+EOcKjvbdZirgogCG
+EPCkKvbdKCjCqJbx
+EObjjvbdgKfzcGAE
+DncKjvbdZjTIQHBf
+DoDKjvbdRDcBQQcr
+DnbkKvbdZQmEiNFR
+EObkKvbdSiZjRABM
+EObkKvbdURROttgm
+EObjjvbdlZSrSxft
+DoCjjvbdNxPVzdOU
+EPCjjvbdqAheAWhE
+EPCkKvbdwXLaWBWV
+DoCkKvbdKDKDQjCx
+EOcKjvbdehLVqnQg
+DoCkKvbdZxdJmcMS
+DncLKvbdDjHjVxKA
+EObkKvbdXrlAmToY
+EOcLKvbdwtleRYlO
+EPCjjvbdtlYWaUBX
+EPCkKvbdiUzFXSVC
+DoCjjvbdcJNJkFwY
+EObkKvbdaRebhUGL
+EOcKjvbdNHDQMotk
+DoDLKvbdyTNhlqbH
+EOcLKvbdKfGIBaRV
+EObkKvbdKaLHMawq
+DoCkKvbdnCKWwoNu
+EPDLKvbdHffzYwxH
+DncKjvbdnGdxMmgZ
+EPCjjvbdNPwpvNgT
+DoDLKvbdYkrEUOMN
+DoDKjvbdTqROuUgm
+DoDKjvbdvBDyTPEh
+DnbkKvbdJKEAKQHE
+EObjjvbdiBoCeWqR
+DnbkKvbdmRyUyrci
+DnbkKvbdJuuGEFGi
+EOcLKvbdFyVVBEXb
+EObkKvbdwyhGFwdr
+EObkKvbdCTBDTevr
+DoDKjvbdjbkkQftg
+EOcKjvbdVAbQrqRy
+EObjjvbdLAkHMawq
+EObjjvbdEztQeLcJ
+EPCjjvbdcIlikFvx
+DncKjvbdZyEJmcLr
+EObjjvbdqceJPmua
+DncKjvbdZnmiEdyj
+EOcLKvbdiGicYujV
+DoCkKvbdFeirNhtR
+DoCkKvbdDjHjVxKA
+DnbkKvbdqFdEsvBI
+EOcKjvbdcImKKevx
+EPDLKvbdQmXbZOUz
+DncKjvbdqcdhpNvB
+EObkKvbdsPvOjCvG
+DoDKjvbdFVyQPmKF
+EOcKjvbdqYnhGpcx
+EPDKjvbdKfGIBaRV
+EPCkKvbdnGeXmNgZ
+DncKjvbdKVtedEgJ
+EObjjvbdCTAbsewS
+DnbjjvbdeEoRavcK
+EPCkKvbdNsUVfeVQ
+EPDLKvbdGdLWKCKK
+DnbjjvbdKfFhCBRV
+DoCjjvbdZLrDtOLm
+EPDLKvbdhtydvrVC
+DoDLKvbdZjTIPfaf
+DoCjjvbdbrcLTdKB
+DncKjvbdzoQRFClY
+DnbjjvbdSKyFuHKs
+EOcKjvbdZQldiMeR
+DncLKvbdkySrTYft
+DnbkKvbdSLZGUgKs
+EPCkKvbduCbuWvOo
+DoDKjvbdsCFlkgLZ
+DoCjjvbdrDdiPmvB
+EPDLKvbdySnJNRbH
+EPDLKvbdDoDKkXDE
+EPCjjvbdijGHjMwr
+EOcLKvbdeJjSWUzn
+EPCkKvbdKWVFdEgJ
+DoDLKvbdVYhTykPO
+EObkKvbdeJiqutzn
+DoCjjvbdRjyFuGkT
+DoDKjvbdHDkWJajK
+EPCkKvbdbKlFnnDA
+EPDKjvbdQwOEDMHc
+DoDLKvbdZshiZESn
+EObjjvbdkyTSSyGt
+DoCkKvbdxUmEpyLn
+EObjjvbdMuSqkNAX
+DncLKvbdbiNJkGWx
+DoCjjvbdWIYVwfxz
+DncLKvbdkVwNcaww
+DoDLKvbdOFEThhjd
+DoDLKvbddndrkUTr
+DnbkKvbdyzeNrHiI
+EPCjjvbdZRNEhldq
+DncKjvbdhlEdNuDZ
+DoCjjvbdqquKmkAm
+DoDKjvbdFyVVBDxC
+EPCkKvbdJuteceHJ
+DnbkKvbdiBoDEvqR
+DoDLKvbdLqvlzUpz
+EPCjjvbdrRuKnLBN
+DnbkKvbdZjShQHCG
+DnbkKvbdcScLTcjB
+EOcKjvbdyNrgxSiD
+EOcKjvbdZirhPfbG
+DoDLKvbdkIGkefOL
+EPDLKvbdkCkkRGtg
+EPDKjvbdbUafxLTh
+EObkKvbdhfjDYvKV
+DoCjjvbdpecdsvAh
+EOcKjvbdpfDeUWAh
+DnbkKvbdPxmAGsRj
+DnbjjvbdZMSEUNlN
+EOcLKvbdqFdFTvAh
+DoCjjvbdWXJXvDeH
+DoCjjvbdqUTfqrLU
+EPCjjvbdvOszqLPU
+EObkKvbdmtuZkJqf
+EOcLKvbdjgfkefNk
+DoCjjvbdhaoCeWqR
+EObjjvbdKaLHMbXq
+DoCjjvbdSLZFtfjs
+DoCjjvbdFfKSOItR
+DnbkKvbdqUUHSSKt
+EPCkKvbdHEKujBjK
+EObkKvbdIsZBSmXl
+EOcKjvbdRDcApQcr
+DoDKjvbduDDVWvPP
+EOcKjvbdLBLGlaxR
+DoDLKvbdIxTbHlQp
+EPDLKvbdrRtkOKaN
+DoCjjvbdRjyFtfkT
+EPDKjvbdGQASwHGZ
+EPDKjvbdMgDPlouL
+EObkKvbdJXtCILqQ
+EObkKvbdrEFJQNvB
+DoCkKvbdeOeTKtUS
+EObkKvbdSQTgJfDw
+EPCjjvbdSQUGiedX
+DoCjjvbdqUUGrRjt
+EPDKjvbdTqRPVUgm
+EPCkKvbdIMBznWqL
+EObkKvbdhancEwRR
+EOcKjvbdrMzJxkgi
+EPCjjvbdhbPDEvqR
+EPDKjvbdZHXEAOsJ
+EPDLKvbdxnShXriD
+DoCkKvbdLLAgvAKZ
+DoCkKvbdhficYvJu
+EObjjvbdZRMeIleR
+DncLKvbdYfwEAOri
+DoDLKvbdDwxMTtUM
+DoCkKvbdWRmwbFLc
+DnbkKvbdNQYRVnHT
+DnbjjvbdjmCMZeHP
+EPDKjvbdaNKbTUlg
+EPCkKvbdidkHVPAO
+DoCjjvbdHfgZxwxH
+EObjjvbdxwhibPyk
+EPDKjvbdFjeTDHmV
+DoDKjvbdiCOcFWqR
+DoCkKvbdJmADyfuB
+EOcLKvbdhficYujV
+DncLKvbdYzbfSJuy
+DoCjjvbdbUagXjtI
+DoDKjvbdjKFhKNYS
+EOcLKvbdCIkCLJGK
+DoDKjvbdZshiZESn
+EPCkKvbdSQTfjFcw
+EObkKvbdiMEcnUcZ
+EPDLKvbdyOTHxSiD
+EPCjjvbdFjeTDHmV
+DnbjjvbdJuuGEFGi
+EPDKjvbdhkeDnVCy
+EPCkKvbdVAaqSprZ
+DncLKvbdVUNTelVj
+DoCkKvbdfILVrNpg
+DncKjvbdNHDQNPuL
+EOcLKvbdLZQirztf
+EObjjvbdGckWKCJj
+EObkKvbdIHGyyXwg
+DncLKvbdiUydwSVC
+DoDLKvbdpecdtWBI
+EOcLKvbdLGFgaaRV
+EOcLKvbdezuxeJUX
+EObkKvbdgGLymgHA
+DnbjjvbdEvZQQNJe
+DncKjvbdJcJbpjDY
+DoDKjvbdIxTahLqQ
+DncKjvbdBcpAvJlf
+EObjjvbdnPyyVkYb
+EObjjvbdfNGWfljL
+DnbjjvbdieLHVPAO
+EOcKjvbdRNYCYmtz
+EPDKjvbdiHJcYuiu
+EObkKvbdMowqVnHT
+DoCjjvbdiUydvrUb
+EObjjvbdZMRcsnLm
+DnbkKvbdaSFcIUFk
+DnbjjvbdZyEKNcLr
+DnbkKvbdZnnJFEzK
+DncLKvbdJSyBSlxM
+DoCkKvbdXsMAmUOx
+EPCjjvbddneSkTtS
+EOcLKvbdVwIxWEEg
+EPCjjvbdxsOJMrBg
+DncKjvbdkIHMGGOL
+DncLKvbdGFjRmhsq
+DnbkKvbdySmiNRag
+EPDKjvbdpyPHgREY
+DnbjjvbdGZUuAcxC
+DnbjjvbdiHKDYvJu
+DoCjjvbdtlXwBUBX
+EObkKvbdTkvPAvPJ
+EOcKjvbdSxLLmzkY
+DncKjvbdhgJcZVjV
+EOcLKvbdZirgogBf
+EOcKjvbdTukpKUBR
+EPDLKvbdQlwaxmtz
+DoCkKvbdNxOuzdNt
+EPDLKvbduCbuXWPP
+EPCkKvbdmbJvwoNu
+EObkKvbdKDKCqJbx
+EPCjjvbdyNsIXrhc
+EPCkKvbdSCEEkiYk
+EObkKvbdOFDshiLE
+DoDKjvbdZnmiFEzK
+EObkKvbdJbjDRKDY
+EObkKvbdYfvdAOri
+DncKjvbdkDLjpfuH
+DoCkKvbdsrqsZZdc
+DoDKjvbdLBLHNBwq
+DncLKvbdDjHjWYKA
+DoDKjvbdZQleIldq
+DoDKjvbdatbGxKtI
+EObjjvbdUWMQKUAq
+EOcLKvbdlhdUQtrB
+EPCjjvbdAMhZTWyx
+DoCjjvbdjhGlGFmk
+DoDLKvbdHgGzZXxH
+EOcKjvbdrykoraIO
+DoDKjvbdjJehJlwr
+EObkKvbdrEEhonWB
+EPCjjvbdiUyeWrUb
+DnbkKvbdNQYRVmgT
+EPCjjvbdVUNUFkuj
+DnbjjvbdEYYMTtUM
+DoDKjvbdYpldhldq
+EPCjjvbdtlYWaTaX
+DoCjjvbdozmdLXoA
+DnbjjvbdZnnJFFZj
+EObjjvbdZshiZDrn
+EPDLKvbdZjShPfaf
+DoCkKvbdrpVnibvG
+DoCkKvbdQwNcblHc
+EObkKvbdxZgefXdr
+DoDKjvbdNddUIhkE
+DncKjvbdcImJkFwY
+DoDKjvbdZirhQGaf
+DoDKjvbdqwPkcJZR
+EPDLKvbdkHgLfFnL
+DncKjvbdlqxuZrci
+DncKjvbdRadFLiYk
+EPDKjvbdIHGyxxXg
+EObkKvbdmpZyVjyC
+EPCkKvbdUaBqSpqy
+EOcKjvbdqZOgfqDx
+EObkKvbdkNBlZeGo
+EObjjvbdOAIrsjSA
+EPDLKvbdEvZPpNKF
+DnbjjvbdczYoxZRC
+DoDKjvbdvAdZTPEh
+DncKjvbdqUTfqrKt
+EPCkKvbdZGwEAPTJ
+EPDLKvbdZMSEUNkm
+EPCjjvbdYkqctNlN
+DnbkKvbdeEnqawDK
+DoCjjvbdKVuGEFHJ
+EOcKjvbdzitopDsU
+DnbjjvbdsBfNLgLZ
+DnbjjvbdcImJkFvx
+EPCkKvbdMgCpNQUk
+EOcLKvbdZQmEhleR
+EPDLKvbdtTRrxzEc
+DncLKvbdKVuFceHJ
+EPCkKvbdyfxlAMdw
+DnbkKvbdsZkosBHn
+EPDLKvbdwWlAvBVu
+DoDLKvbdlqxuZrdJ
+EPDLKvbdMRwMzUpz
+EObjjvbdFkFTCgmV
+EObkKvbdHEKvJbKK
+DncLKvbdkNCMZdfo
+DoCjjvbddoFSkTtS
+EPCkKvbdRpTfjFdX
+DoDKjvbdIGgZyYXg
+EPCkKvbdBiLCLIfK
+DoCjjvbdKQydnfNe
+EPCjjvbdHgGzZYYH
+DnbjjvbdYNqAYUvU
+DncKjvbdGckVjBjK
+DoCjjvbdjhHMFemk
+DnbkKvbdkIGkeenL
+DncLKvbdmaivwnmu
+EPDLKvbdmuVZkJqf
+EPDKjvbdNddUIhjd
+DoCkKvbdRDbaQRES
+DncLKvbdTvLojUBR
+DncLKvbdtSrSxyeD
+DncKjvbdjgflGFmk
+DoCkKvbdQwNdDLgc
+DoCkKvbdEXwksssl
+DoDKjvbdtAHRIAAr
+DoDLKvbdSPsgJecw
+EObkKvbdjggLfGOL
+DoCjjvbdSBdFLhxk
+DoCkKvbdiMEdNuDZ
+DoCjjvbdhtzFWrUb
+EPCjjvbdSKxetgKs
+DoDLKvbddndsLTtS
+DncKjvbdtcCtwVno
+DoDLKvbdACrYJzJQ
+EOcLKvbdyOShXrhc
+EObjjvbdqquKnKaN
+DoCkKvbdnCJvxOnV
+EPDLKvbdFWYpQMjF
+DnbjjvbdnCJvwoNu
+EObkKvbdhfjCyWKV
+DoDKjvbdrNZjZLhJ
+DnbkKvbdyNrgwsIc
+EPCkKvbdSZjITDWA
+DncLKvbdqiAJeNOe
+DoCkKvbdhaoDEvpq
+EOcLKvbdtkwwAtAw
+DncKjvbdsPvOicWG
+DoCjjvbdWXJYVcdg
+DoDLKvbdmIdUQuSB
+DnbkKvbdauBgYKtI
+EOcLKvbdJbicRKCx
+DoDLKvbdsPuoJcVf
+EPCkKvbdfILWRnRH
+EPCkKvbdAMhYrvzY
+DoCjjvbdKWUedEfi
+EPCkKvbdhaoDEvqR
+EObjjvbdxVMeRZMO
+DncKjvbdFaOqZJzm
+DncKjvbdIryArlwl
+EObkKvbdRWmccLgc
+EPCkKvbdsPunibvG
+EOcKjvbdQccBPpcr
+EPDKjvbdssRsYzFD
+DncLKvbdySmiMqbH
+EObkKvbdZLqdTmlN
+EPDLKvbdVAaqTQqy
+DncLKvbdFWZPomJe
+DoDKjvbdUVkojTaR
+DncKjvbdULvPBWPJ
+EObjjvbdUslsfLuj
+DoDKjvbdsBfMlHKy
+DoCjjvbdkySrTYgU
+EPDKjvbdYgXEAPTJ
+EOcLKvbdrzMPsAhO
+DoCkKvbdcyxpXyRC
+DncLKvbdkIGkeemk
+EObkKvbdVqnXbElD
+EObkKvbdMuSqkNAX
+DncLKvbdkNCLydfo
+EOcLKvbdUVlQJsaR
+EOcKjvbdczZPxYqC
+EObkKvbdWIXvXfxz
+DoCkKvbddndsLTtS
+DnbkKvbdFfJqmiUR
+DncKjvbdURROuVIN
+EObkKvbdddnrCXDK
+DncLKvbdZyEJmcLr
+EPCkKvbdVgxVxHYz
+DoDKjvbdFfKRmiTq
+EPDKjvbddCTNSAUN
+DoDLKvbdUxgsykOn
+DoDLKvbdBhjbLIfK
+DoCkKvbdFejRmiTq
+EPDLKvbdmuUykJqf
+DoCkKvbdVTmTfLuj
+DoCjjvbdkNCLydgP
+DnbjjvbdHffzYxYH
+EObkKvbdpxngfpcx
+EPCjjvbdKQzFOfOF
+DncLKvbdOEdThiKd
+EOcKjvbdJSyBTNXl
+DncLKvbdyNsIXriD
+EOcLKvbdJYTagkpp
+DoCjjvbdkMakzEfo
+DoDLKvbdZjSgpGbG
+DnbjjvbdSQUHJfDw
+DncKjvbdRpTgJedX
+DncKjvbdrykosBIO
+EObkKvbdGYttaEYC
+DoCkKvbdZxcjNcMS
+DoCjjvbdRadElIyL
+DoDKjvbdkySqryGt
+EPDKjvbdiHJbyWJu
+EPCjjvbdwzHeewdr
+EPDKjvbdQwNccLhD
+DoCjjvbdbBVeGPow
+EOcKjvbdddnrCWcK
+EPCjjvbdJXtCHkqQ
+EObkKvbdrbFllHLZ
+DncKjvbdACqxKZhp
+DoCkKvbdJXtCILpp
+DncKjvbdEYYMTssl
+EOcKjvbdwjvdHzzG
+EPDLKvbdemGWgMik
+EPCjjvbdqvokcIyR
+DnbkKvbdUaCQrprZ
+DoCjjvbdKCjCqKDY
+EPDKjvbdYSlBMtOx
+EPDLKvbdyXiKBozL
+EObkKvbdZxdKNcMS
+EObkKvbdCDpBVjNG
+DncKjvbdmgExMmgZ
+EObjjvbdHkaznWqL
+EObjjvbdkNCLzEfo
+EPDLKvbdyNrgwsIc
+DncKjvbdnHFYNNfy
+DoCkKvbdDwwktTsl
+EPDLKvbdTlWOaWPJ
+DoDKjvbdmIctRVRa
+EPCkKvbdeEnqbWbj
+EPDKjvbdTYLMNzkY
+DncKjvbdkHgLfGNk
+DncLKvbdnPyxvLZC
+EOcLKvbdjKGHjMxS
+DoCjjvbdiZtfMROG
+EPDKjvbdFeiqmhsq
+EPDKjvbdDoDKjvbd
+EOcLKvbdKRZeOfOF
+DoDKjvbdzoQQeCkx
+EObjjvbdEOcLKwDE
+DoCkKvbdrafNLgLZ
+EObjjvbdMfbomPuL
+DncKjvbdUQqPUthN
+EOcLKvbddjJrWUzn
+DoDLKvbdvBDySoEh
+DnbjjvbdVUMselVj
+DoCkKvbddndrkUUS
+EObkKvbdmpZxvKxb
+EPCkKvbdmbJvxPNu
+EPCkKvbdmfdwlnHZ
+DnbkKvbdZRMdhmFR
+DnbjjvbdYSlBNToY
+DncLKvbdzoQRFClY
+EPCkKvbdVZITzLOn
+DncKjvbdZtIiZDrn
+DncKjvbdFVxopNKF
+EOcKjvbdtTSSxydc
+EObjjvbdUVlQKTaR
+EPDLKvbdkMbLzEgP
+DoDLKvbdKDJcQicY
+DoDLKvbdJmAEZgVB
+EOcKjvbdCWzdJFPv
+DncLKvbddneTLUUS
+EObjjvbdBcoaWJlf
+EPDKjvbdGcjvJbJj
+DoCjjvbdddoRavcK
+EOcLKvbdAMhZSvyx
+DnbjjvbdajlGOmcA
+DoCkKvbdCIkCLJFj
+DnbjjvbdMSWmZtpz
+EOcKjvbdNGcQMpUk
+EOcKjvbdTqROuUhN
+DoCkKvbdFVxoolie
+DoDKjvbdUQpnuUgm
+EPDKjvbdnBiwXnmu
+DnbjjvbdJuuGDdgJ
+EPCjjvbdZLqcsnLm
+EObkKvbdZnmheEzK
+DoDKjvbdXsMAltOx
+EObkKvbdiMEdOUcZ
+DoDKjvbdZRNEhleR
+DoDLKvbdMIbLpxAS
+DoDLKvbdVwIwucdg
+DoCjjvbdRbDeLiZL
+DncLKvbdZMRctNlN
+DoCkKvbdGcjvJbJj
+DnbjjvbdSZihScWA
+EPDLKvbdkDLjqHUg
+DnbjjvbdZisIPfaf
+EObjjvbdmpZyWLZC
+EOcLKvbdrbGNLgLZ
+DnbkKvbdkVvmdBww
+EObjjvbddoFSjstS
+EObjjvbdxwiJbPyk
+EPDKjvbdTvLoitAq
+DoCkKvbdZLrDsnMN
+DoDKjvbdOAJTUJrA
+EObkKvbdURQntuHm
+EObkKvbdkIGkefOL
+DncLKvbdsCFllHKy
+EPCkKvbdatafxKtI
+DoCjjvbdiifHjMxS
+DnbkKvbdZsiIyDsO
+DncKjvbdieKgUoAO
+EPCjjvbdBhkCLIej
+DnbjjvbdDxXktTsl
+EObkKvbdKCjCqKCx
+EOcLKvbdIwsahLqQ
+EPDLKvbdhzUfLpnG
+EObjjvbdbAvEepPw
+EOcLKvbdSLZFuHKs
+DnbkKvbdIidAJogE
+DnbjjvbdJbjDQicY
+EPDLKvbdQwODblID
+EObkKvbdqZOgfqEY
+EObjjvbdkWWnDbXw
+DncLKvbdEvZPpMjF
+EPDLKvbdKQydnfNe
+EObjjvbdUWMQJtAq
+EOcLKvbdqrUjmkBN
+DoDLKvbdJmAEZfuB
+DoCkKvbdhtydvqtb
+DoCkKvbdtAHQhABS
+EPDLKvbdxZhGGXdr
+EPDKjvbdmSZVZrci
+DnbkKvbdZjTHogCG
+EObkKvbdYqMdiMeR
+DoDKjvbddwzUURez
+DoDLKvbdbKlFnnDA
+EPCkKvbdGGKSOJTq
+EObkKvbdLGFgbBRV
+DoCkKvbdKyQjSzuG
+DncKjvbdJcJcRJcY
+EOcLKvbdnBiwYPOV
+EOcLKvbdLGGHaaRV
+EObjjvbddneSkTtS
+DoDKjvbdiLddOUcZ
+EObkKvbdsPvOjCuf
+DnbkKvbdZyEKOClS
+DoCjjvbdyzeORhIh
+DnbkKvbdhkeDmuCy
+EObkKvbdvvkaWAvV
+EOcKjvbdzeZnzdzQ
+DoCjjvbdVAaprqSZ
+EObjjvbdjhGkefNk
+DncLKvbdSKxfVHLT
+EPCjjvbdZRMeImFR
+DncLKvbdFeirOJTq
+DncLKvbdFfJrOItR
+DoDLKvbdmoyyVkYb
+DncLKvbdddoRavcK
+DoDLKvbdauBfxKtI
+EObjjvbdSPtHJfDw
+EPCjjvbdCEQBWJmG
+DoCjjvbdDnbkLWcE
+EPDLKvbdVUNUGMVj
+DnbkKvbdnQZyVjyC
+DnbkKvbdgFkymfgA
+DoDKjvbdRDcBQQdS
+EOcKjvbdtcCuWvOo
+EObkKvbdlrYuZrdJ
+DoCjjvbdZirgogBf
+DoDLKvbdMfcPmPuL
+EOcKjvbdDwwlTtTl
+DncLKvbdwXLaWAuu
+EPDKjvbdUaBqSpqy
+EObkKvbdHlBznXRL
+EPCkKvbdkMakzFHP
+DnbkKvbdqZOgfpcx
+DnbkKvbdUMWOaWPJ
+DncLKvbdMfbolpVL
+EObjjvbdfekynGgA
+EPCkKvbdWWiXvEFH
+DoCjjvbdpxnhGqDx
+DoDKjvbdsQVnjDWG
+EObkKvbdYNqAXtut
+DncLKvbdDnbkLXCd
+EObkKvbdKaLGmBwq
+DoCkKvbdBvzciFPv
+DoDLKvbdjKFgilwr
+EPCkKvbdUaBqTQqy
+DoDLKvbdVgwvYHYz
+EPDKjvbdIHGyyXwg
+EPDKjvbdEXxMTstM
+DnbkKvbdQccBPpcr
+DnbkKvbdMgCpNPuL
+EPDKjvbdSPtHKFcw
+DoDKjvbdkIHMGFnL
+DncLKvbdnGeXmNgZ
+DoDLKvbdhtyeWquC
+EObjjvbdqGEFUVaI
+EOcLKvbdNPwpumgT
+DnbkKvbdZshiYdTO
+DoDKjvbdZMSETmkm
+DncLKvbdRbDdkhyL
+EPCjjvbdTvMQJtBR
+EObkKvbdjvXOEBww
+DncLKvbdrXPkbiZR
+EOcLKvbdFejSOJTq
+EOcKjvbdegjvRnRH
+EPDLKvbdJvVGDeHJ
+EObjjvbdXrlBMtOx
+DncKjvbdFejSNhsq
+EPDKjvbdBiLBjiGK
+EOcKjvbddiirVtzn
+EPDLKvbdVBBqTRRy
+DoCkKvbdeqaWzkcP
+EObjjvbdqYnggREY
+EPDKjvbdEARiNZwX
+EObjjvbdSQTfifEX
+EObjjvbdLBLHNBxR
+EPCkKvbdNHCpMpUk
+EPCkKvbdKVuGDdfi
+EPCkKvbdxrnImRbH
+EOcLKvbdZRNEiNFR
+EOcLKvbdtbcUvuno
+EPCjjvbdJTZAsNXl
+EPDLKvbdFVyQPljF
+DoCkKvbdieKftoAO
+EObkKvbdZMSETnMN
+DoCjjvbddePSBvcK
+DncLKvbdqUUHSSLU
+DoDLKvbdZQldhmEq
+DoDKjvbdOTTugFUp
+DncLKvbdZsiJZESn
+DnbjjvbdtbcUwWPP
+EPDLKvbddwzTtRez
+DnbjjvbdZoNheFZj
+EPCkKvbdKfFgbApu
+DoDLKvbdhytfMQmf
+DnbkKvbdnGeXlnGy
+EPCjjvbdSBcdlIyL
+DncKjvbdbAvFFpPw
+EObjjvbdzoPpeClY
+EOcLKvbdqwQMDIyR
+EPCjjvbdmaivxOmu
+EPCjjvbdIwsahLqQ
+DncLKvbdddoSBwCj
+EOcLKvbdrEEhpNvB
+DoCjjvbdEPCkKvcE
+DncKjvbdePEsLTsr
+DncKjvbdmRyVZsEJ
+DnbjjvbdZLqdTnMN
+EPDKjvbdRbEFMIxk
+EObjjvbdJXsbHlRQ
+DncKjvbdkDMLQftg
+EOcKjvbdOEctJIjd
+DnbkKvbdqTsfrRkU
+EPDKjvbdkIGkeenL
+DoDLKvbdUxhUZjnn
+DncLKvbdwyhFexFS
+EPDKjvbdbLLfOmcA
+DnbkKvbdtbbuXWPP
+EOcLKvbdYpmEhmFR
+DnbkKvbdxmsHxTIc
+DoDKjvbdznoqFDLx
+EObjjvbdmfdxMnHZ
+EObjjvbdYTMBNUOx
+EObjjvbdADRwizJQ
+EOcLKvbdMoxQvOGs
+EOcLKvbdrWolDJYq
+EPCjjvbdeFPRbXDK
+DoDKjvbdrDdhpNvB
+EPDKjvbdZxdKODLr
+EOcLKvbdWSNwadlD
+EOcKjvbdxrmhlqbH
+DoDLKvbdzoPqEblY
+DncKjvbdTkuoBWPJ
+DnbjjvbdrykpSaHn
+EOcKjvbdKWUfDdgJ
+DnbkKvbdZMSEUOMN
+EObkKvbdSBcdkhxk
+DnbjjvbdIGfyyYXg
+EPCkKvbdnBjWwoOV
+EOcKjvbdzaAPGgBl
+DnbjjvbdkVvmdCXw
+DoDLKvbdkDLkQfuH
+DoCkKvbdVqnXbFMD
+DncKjvbdWWiXuceH
+DoCjjvbdBvzdIePv
+DncKjvbdLFfICBQu
+DncLKvbdeFPRawDK
+DncKjvbdjmBkydgP
+EObjjvbdVUMtFkuj
+EPDLKvbdrSUjmkBN
+DoDLKvbdSPsgKFdX
+DoDKjvbduDDVXVno
+DoCjjvbdMuSqjmAX
+EPCkKvbdZyEJmcLr
+DnbkKvbdMfcQMouL
+DoDLKvbdUMWPAuni
+DnbjjvbddZxpYZRC
+EPDKjvbdbAvEeopX
+DnbkKvbddoErkUUS
+DoCjjvbdePErjstS
+EOcKjvbdGKeTDHlu
+EObjjvbdfIKvSORH
+EPCjjvbdUsmTelWK
+EObkKvbdaMkBsVMg
+DoCkKvbdRjxfVHKs
+DnbkKvbdMpYQumgT
+DncLKvbdVwIxWEFH
+DncKjvbdaMkCTUmH
+DoDLKvbdhlFENuDZ
+EPCjjvbdZisIPgCG
+EPCjjvbdZnnJEdzK
+EPDKjvbdGLEsDINV
+EObjjvbdYzcFrKVy
+EPDKjvbdZirhPgBf
+EPDLKvbdKaLGmCXq
+EObkKvbddoErkTsr
+DoCkKvbdRXNdCkgc
+DoDLKvbdEvZQQNKF
+DoCkKvbdZoNhdeZj
+EPCkKvbdhkddNtby
+EPDLKvbdZLrDtNlN
+DncKjvbdRbDdlIxk
+EPCkKvbdEOcKjwCd
+DncKjvbdlqyUyrdJ
+DoDLKvbdNddThhkE
+EOcKjvbdwyhFewdr
+EPDLKvbdiUydwSVC
+DnbkKvbdYzcFqjWZ
+DnbkKvbdiBoCdwRR
+EOcLKvbdpecdsuaI
+EPCkKvbdQlxCYnUz
+EPDLKvbdVvhxWEEg
+EOcLKvbdlZSqryGt
+EPCkKvbdUaCQsQqy
+DoCkKvbdvAdZSndh
+DnbjjvbdmttykKRf
+EPCkKvbdYgWdAPTJ
+DoCkKvbdlYrqsZGt
+DnbkKvbdZsiIxcrn
+DoCjjvbddeOqavbj
+EObkKvbdbVBfwjsh
+EObjjvbdMoxQvOHT
+EPCkKvbdRbEFLiYk
+DoCkKvbdlhdTqUqa
+EOcLKvbdMIbMRYAS
+EObkKvbdDncKkWbd
+DncLKvbdfSAvzkcP
+DnbkKvbdxsOIlqbH
+DoCkKvbdADSYKZhp
+EPCjjvbdZshiZESn
+DoCjjvbdieLGuPAO
+EPCjjvbdkHgMFenL
+EPDKjvbddBrlrAUN
+DncKjvbdddoSCXCj
+EPCjjvbdsQWOibvG
+EObkKvbdKkBHvAKZ
+EObjjvbdkWWmdBww
+EObjjvbdnGeXmNgZ
+EOcLKvbdyNrgwrhc
+DnbkKvbdNddThiLE
+DncKjvbdDjHivYKA
+EObjjvbdWXIxWDdg
+EObjjvbdrMyixlIJ
+EOcKjvbdcyyPxYpb
+DncKjvbdcyxowxpb
+EOcLKvbdhbOcFXQq
+EOcKjvbdHDjuibKK
+DoDKjvbdiVZeXRuC
+EOcKjvbdnBjXYOnV
+DnbkKvbdOTTufdtp
+DoDKjvbdVAbRTRSZ
+DnbjjvbdRXOEDLgc
+EOcLKvbdznopdcLx
+DncLKvbdRNXayOUz
+DncLKvbdSPtHKFdX
+EPDKjvbdxUldqYkn
+DoCkKvbdZRNEiNEq
+EPDKjvbdrbFllGjy
+EPCjjvbdUyHszLPO
+DncLKvbdxwhibQZk
+EOcKjvbdFWYopMie
+EOcKjvbdaNKbTVMg
+DnbjjvbdliETqUrB
+EObjjvbdRXODbkgc
+DnbkKvbdTlWPBWPJ
+EOcKjvbdOFEThiKd
+EObjjvbdMSXMzVQz
+EObjjvbdHDkVjCKK
+EPDLKvbdqFceTuaI
+EOcKjvbdFyUtaDxC
+EOcLKvbdmgExMnGy
+DncKjvbdtlYWaUBX
+DoDKjvbdCDoaWJlf
+EPDKjvbdkyTSTYgU
+DoCjjvbdqqtjnLAm
+DnbjjvbdGYtuAdXb
+DoCkKvbdBhjbLIfK
+EPDKjvbdNPwqVmfs
+DoCjjvbdsrqsYzFD
+EPDKjvbdSPsfjFdX
+EPCjjvbdZyDjNbkr
+EPDKjvbdqZOgfpcx
+EPCkKvbdqGDeUVaI
+DoDKjvbdUVkpKUAq
+DoCjjvbdRpUGjGEX
+DoDLKvbdmgFYMmfy
+EPDLKvbdRpUHKFcw
+DoDLKvbdEvZQPmKF
+DoDKjvbdZshhxdTO
+DoCjjvbdiZuGMROG
+DoDKjvbdfpBzvdYI
+EPCjjvbdmgFYNOGy
+EOcKjvbdNrtWGdtp
+DnbjjvbdWHxVwgYz
+EPCkKvbdJbjDRKDY
+EPCjjvbduWOYJpsA
+DncKjvbdehLVrORH
+DoCjjvbdGFjSOItR
+DoCkKvbdjuwODbYX
+EObjjvbdJTZBSmXl
+DnbkKvbdzQoNIiwA
+EObjjvbdjJfHilwr
+EOcKjvbdJpyeOfOF
+DnbjjvbdqFdEsuaI
+EPDLKvbdUxhTzKoO
+EPDKjvbdBraCsfXS
+DoCjjvbdLAjgNBxR
+EObkKvbdlhdTqUrB
+EPCjjvbdZoOIeFZj
+DnbjjvbdrDdhpNua
+EPCjjvbdIHHZxxYH
+EPCkKvbdiMEdOVCy
+DoDKjvbdhgJbxvKV
+DoDLKvbdUyHsyjoO
+DoDKjvbdGQATXGfZ
+DnbjjvbdvAdYroEh
+EPCkKvbdhtydvrUb
+DoCjjvbdsQWOicWG
+DncLKvbdcJMjLGWx
+DoCkKvbdIwsaglQp
+DoCkKvbdYkrEUOLm
+EObkKvbdVvhxWDeH
+EPDLKvbdZMRdTnLm
+DoCjjvbdADRwizJQ
+DoDKjvbdSwjkmzjx
+DnbkKvbdBiKbLIfK
+EPCjjvbdRyigsDWA
+EPDKjvbdRXOECkhD
+EObjjvbddxZtTqez
+EObjjvbdbBVdfPow
+DncLKvbdMfcQNQVL
+EPDKjvbdVBBqTQrZ
+DncKjvbdZMRctOLm
+DncKjvbdGGJrOIsq
+EPCjjvbdZMSETmlN
+DoDLKvbdhlEdOVDZ
+EOcLKvbdOhAXyAZB
+DoCkKvbdyOTIYSiD
+DoCjjvbdUtNUGMVj
+EObkKvbdWXJYWDdg
+EOcLKvbdBhjbKhej
+EObkKvbdVwIwvDdg
+EPDLKvbdzjUpQDsU
+EOcKjvbdqAiFAXHd
+DoDLKvbdqrUkNjaN
+EOcKjvbdYORAYUvU
+EOcLKvbdcIljLFwY
+DnbkKvbdVwJXvDdg
+DoDKjvbdVBCQsRSZ
+DoDLKvbdmuUzKiqf
+EObkKvbdJYUCILpp
+EPDKjvbdsQVoKCvG
+EPDLKvbdmoyyVkZC
+EPDLKvbdsCGNLfjy
+EOcKjvbdbiNKLGWx
+DoCjjvbdrpVnjDWG
+EObkKvbdfVzxPizs
+DnbkKvbdRXODcLgc
+EPCjjvbdjJfIJlxS
+DoCjjvbdZLqcsnLm
+DncKjvbdjuvnECXw
+DoDLKvbdEPDKkXCd
+DnbjjvbdOSsvGduQ
+DoDKjvbdIMBzmvpk
+EPCjjvbdqrUkOLAm
+EPCjjvbdTkvOaVoJ
+EObjjvbdozmdKwoA
+DncLKvbdDxXkstTl
+EOcKjvbdfMewHMik
+DoDLKvbdGKeTCgmV
+EObjjvbdxnSgwsIc
+EPCkKvbdaaVdepPw
+EObkKvbdqGEFUVaI
+DncLKvbdjblKpgUg
+DoDLKvbdRWnEDLhD
+DnbjjvbdFxuVAcxC
+DncKjvbdqZOhGpcx
+DoCkKvbdfHjvRnQg
+DnbkKvbdwMvANDeN
+EObkKvbdFfKSOIsq
+DoCjjvbdmajXYPNu
+EObkKvbdANHyTXZx
+EPCjjvbdLFfHbAqV
+DoCjjvbdVgwuxHYz
+EPCjjvbdQvmcblHc
+DoDKjvbdaSFbhUGL
+DncLKvbdzHZMANFX
+DncKjvbdySnJNRbH
+DoCjjvbdMpYRVnHT
+EObkKvbddePSBwDK
+EPCkKvbdMfcPmQUk
+EObjjvbdMgCpNQVL
+DoDKjvbdrEFIonWB
+DoDLKvbdFjdsCgmV
+EObjjvbdwtmFRYlO
+DnbjjvbdIwtBgkqQ
+EPCjjvbduaDxrndh
+EPDLKvbdShzKRABM
+DnbjjvbdfHjvRnRH
+EOcKjvbdBiLBjiGK
+EPCjjvbdCEPaWKNG
+DoDKjvbdtbbuWuoP
+DoDKjvbdegkWRmqH
+DnbjjvbdNeETiJLE
+EPCkKvbdjcLkRHUg
+DnbjjvbdjvXOEBww
+EOcLKvbdTlWPAvOi
+DoCjjvbdrMyixkhJ
+EObkKvbdqGEEtWAh
+DncKjvbdbBVeGQPw
+DoDLKvbdpssfqqjt
+DnbkKvbdFWZPomJe
+DoDKjvbdSBcdkiYk
+DoCkKvbdvBEZSoFI
+EOcKjvbdRaceLhxk
+EOcKjvbdJKEAKQHE
+DoDLKvbddZyQYYpb
+EObjjvbdeXzTsqez
+DncLKvbdCSaCtGXS
+EPCkKvbdlZSrSyHU
+EOcLKvbdTJZiqABM
+DncLKvbdvAdYsOdh
+DnbkKvbdcyxoxZQb
+DnbkKvbdhanbdwRR
+EPCjjvbdbBVeFopX
+DncKjvbdGLFTDHmV
+DoCjjvbdiZuGLpmf
+EOcLKvbdJbjCqJbx
+EObkKvbdGdLWJbKK
+DoCjjvbdRkZGVHKs
+DoCjjvbdGckWJajK
+DncKjvbdAMgxrvyx
+EPCjjvbdEPDKjvbd
+EOcLKvbdkDLjqGtg
+DoDLKvbdNPxRVnGs
+DoDKjvbdySmhmRag
+EPCjjvbdVqnXadkc
+EPDKjvbdTulPitAq
+EObjjvbdGLErcHlu
+DoDLKvbdHELWKCJj
+EObjjvbdbVCHYLUI
+DncKjvbdqvpLbiZR
+EPCjjvbdvAdZSoFI
+EOcLKvbdfjfzcGAE
+DnbjjvbdaNKartmH
+EOcLKvbdcTDKsdJa
+DncLKvbdOSsufduQ
+DnbkKvbdyYIiapZk
+DoCjjvbdunszqKoU
+DoCkKvbddndsLTsr
+DoDKjvbdxxJKBoyk
+DoDLKvbdrovOibvG
+EPCkKvbdiLddOVDZ
+EPCkKvbdiBncFWqR
+EOcLKvbdZQldiNFR
+DoCkKvbdOEctJJKd
+DoCkKvbdrMzKZMIJ
+DnbkKvbdVhYVwgYz
+EOcLKvbdQvnDblHc
+DoDLKvbdmJEURVRa
+DoDLKvbdCTBDUFwS
+EPCkKvbdNrsvHEuQ
+DnbkKvbdegkVqnRH
+DoCjjvbddBrlrATm
+DoCkKvbdCJLCLJFj
+EOcKjvbdxZgefXeS
+EPDKjvbdZtJJZDsO
+DoCkKvbdQvmdDMID
+DoDLKvbdRaceLhxk
+DnbkKvbdSBdFLhxk
+DoDKjvbdOTTufdtp
+DoDLKvbdnQZxujyC
+DnbjjvbdZshhyETO
+DoCjjvbdtvOYJqTA
+DncLKvbdRMxBxmtz
+DnbjjvbdEzsqElCi
+EObjjvbdKefHbAqV
+DnbkKvbdmpZyWKyC
+DncLKvbdNQXqWOGs
+EPDLKvbdVTlsekuj
+EPCkKvbdGcjvJajK
+EPDLKvbdIryArlxM
+DoDLKvbdwyhGFwdr
+EPCkKvbdzaAOgGal
+DncLKvbdiHKCxvJu
+EOcKjvbdLBKgMbXq
+DoCjjvbdTppoVVIN
+EPDKjvbdNPxQvOHT
+DnbjjvbdTvLpJsaR
+DncKjvbdnVUyjiqf
+EPCjjvbdVUNTfLvK
+EOcLKvbdDxYLtTtM
+DnbkKvbddePSCXCj
+EPDLKvbdgGLzOHHA
+DoCkKvbdTukpKTaR
+DncLKvbdVUMtGMWK
+EObkKvbdXnRAYVWU
+DncLKvbdyqOmJJwA
+DoDKjvbdFVyQQNKF
+DncKjvbdvOszqLOt
+EPCkKvbdZRMdhmFR
+EPDLKvbdhlFDmuCy
+EOcKjvbdkIHLeenL
+DnbjjvbdqceJQOWB
+DoCkKvbdzitpPdSt
+EPCjjvbdFeiqmhtR
+DoDLKvbdsQVoJcVf
+EPDLKvbdUQpnuVIN
+DoDLKvbdWSNxBdlD
+EPCjjvbdpyPHgQcx
+EOcKjvbdUyHsyjoO
+DoCjjvbdxrnJNSCH
+DoCjjvbdKDKCpjCx
+EPDLKvbdxsOIlrBg
+DoCkKvbdnGdxMnHZ
+EPDLKvbdfHkWSNpg
+DnbjjvbdkHgMGFnL
+EOcLKvbdxmsIYSiD
+DoDLKvbdEXxLsssl
+DoDKjvbdjFLGuPAO
+EOcLKvbdeEoRawCj
+DoDKjvbdyOTIYSiD
+DnbjjvbdIHGyyXxH
+DncKjvbdTqQoUuHm
+EOcKjvbdMfcQNPuL
+DnbkKvbdatbGxKsh
+DoDKjvbdOTUWHEtp
+EPCkKvbdGLFTCgmV
+DoDKjvbdkHfkfGNk
+EObjjvbdJXtBhMRQ
+EObkKvbdRpUHKGEX
+DnbjjvbdiUzFWrVC
+EPCkKvbdliETqUrB
+DnbkKvbdZjTIQHBf
+DoCjjvbdZMSETnLm
+EPDLKvbdFWYoomKF
+EPDLKvbdRaceLhxk
+DoDLKvbdEASJNZwX
+EPDLKvbdGZUtaEXb
+DncLKvbdyNrgxSiD
+EOcKjvbdbVBgXkTh
+EPCkKvbdvOszpkOt
+EObkKvbdKfGHbBRV
+DncLKvbdjvXOEBxX
+EPDLKvbdvAcyTPFI
+EObjjvbdNsUWGeUp
+EPCjjvbdZtIiZDrn
+DoDLKvbdrRtkOLBN
+DncKjvbdptUHSSLU
+DncLKvbdWSOXaeLc
+EPCkKvbdiLeDmuCy
+DoCjjvbdhyuFkqNf
+DnbkKvbdzoPqFDMY
+DoCkKvbdGFirOItR
+DoCjjvbdEObjkXCd
+DnbkKvbdjKFgilwr
+EPDLKvbdVwIwvEFH
+DoDKjvbdfIKvRmpg
+EPDLKvbdOFDsiIkE
+EPDLKvbdGKdrcIMu
+EPDKjvbdZnmiEeZj
+DoDKjvbdKWVFceHJ
+DncKjvbdvBDySneI
+DncKjvbddeOqawCj
+DoCkKvbdEztRFLbi
+EPDKjvbdMpXpumgT
+EPDKjvbdtunYJqTA
+EPCjjvbdegkVqmpg
+EObjjvbdlYsRsZHU
+EOcKjvbdbUagXkUI
+EPDLKvbdANHySvyx
+DnbkKvbdmJEUQtqa
+EPDKjvbdVUNUFlVj
+EPCkKvbdvvlBVaVu
+DoCjjvbdmozZWLYb
+DoDKjvbdwzIFfXeS
+DoDLKvbdNQXpvOGs
+DncLKvbdEYXlTstM
+EPCkKvbdbUbGwkUI
+EOcLKvbdLBLHNBxR
+DnbkKvbdePErkUUS
+EObjjvbdyXiJaoyk
+DncLKvbdVrNxBeLc
+DoCjjvbdaRebhUGL
+EOcKjvbdxsNhmSBg
+EOcKjvbdXrkaMsoY
+EObjjvbdhuZdwSVC
+DoCkKvbdqGEFUWAh
+DoDKjvbdegkVrNpg
+DoCkKvbdtcCtvuoP
+EOcKjvbdmJEUQtrB
+EOcKjvbdWXIwucdg
+DoDLKvbdhgKCyWJu
+EPCjjvbdcSbkUDjB
+EPDKjvbdLrWmZuQz
+EPDLKvbdXrlAlsnx
+DnbkKvbdKNADygUa
+EPDKjvbdyNrhXsJD
+EOcLKvbdIsZBSlxM
+EPCkKvbddndrkTsr
+DnbjjvbdFyUuBEYC
+EPCkKvbdJcKCpjCx
+EObkKvbdbBWFGQPw
+EOcLKvbdFjdrbhNV
+EPDLKvbdrDdiQNvB
+EObkKvbdkHgMGGOL
+EPCkKvbdkySrSyHU
+DncLKvbdaaWEfQQX
+EObkKvbdehKvRmpg
+DnbkKvbdmIdURVRa
+DoDLKvbdvBEZSneI
+DoCkKvbdNdcshhjd
+DncLKvbdZyEKOCkr
+DoCkKvbdVrNwbFMD
+DnbkKvbdnCKXXoNu
+EPDKjvbdSQTgKGDw
+EObkKvbdaRfCgtFk
+EObjjvbdkWXNcaww
+EObkKvbdDihJuxKA
+DncLKvbdnVVZkKSG
+EPCkKvbdVBBqSpqy
+DncLKvbdqGEFUWAh
+DoCkKvbdsPvOjDWG
+DncKjvbdySmiNRbH
+DoDKjvbdraemLfjy
+DoDLKvbdnPzZWKxb
+DnbjjvbdRjxfVGkT
+DoDKjvbdGLEsDHlu
+DnbjjvbdRotHKFdX
+DoCkKvbdRpUGiecw
+DnbjjvbdZjTHogBf
+EPDKjvbdcTCjtDia
+EOcKjvbdrounibuf
+EOcKjvbdVBCRSqRy
+EPDKjvbdEvZPolie
+DnbkKvbdzRPNJKXA
+DncLKvbdBhjbKiGK
+DnbkKvbdqrVKmkBN
+DnbjjvbdBraDTewS
+DnbkKvbdJcKDRJbx
+DoCjjvbdbUbHYLUI
+DoDKjvbdUyITykOn
+DoCkKvbdYlSEUOMN
+EPCkKvbdRpUHKGEX
+EObkKvbdTAFJICPE
+EPDKjvbdrpWPJcVf
+DoCkKvbdZnnJFFZj
+EPCkKvbdkVvmcaxX
+EOcKjvbdyzdnRgiI
+EObjjvbdqAiFAXIE
+DncLKvbdWWiYWDeH
+EPCjjvbdqlzKZLgi
+EObjjvbdauCGwkUI
+DoDLKvbdtTSSxydc
+EObkKvbdbVCGxLTh
+EObkKvbdkWWmdBxX
+EObjjvbdRNXaxnUz
+EOcKjvbdwXLaVaVu
+DncKjvbdqTtGqrKt
+DncKjvbdIjEAJpGd
+EPDKjvbdHffyyXwg
+EObkKvbdSCEFLiYk
+DncKjvbdiVZeXRuC
+DoDLKvbdWWhwudFH
+EPDLKvbdrRuKmkAm
+EObjjvbdxsNhlqag
+EPDKjvbdcJMikFwY
+DoDKjvbdpyPHfpdY
+DncKjvbdwyhGGXdr
+DoCkKvbdkVwODbXw
+DncLKvbdJcJbpibx
+EPCkKvbdsQWPJcVf
+EOcKjvbdZRNEiMdq
+EObkKvbdjvXOECXw
+EObjjvbdZxcjODLr
+DncKjvbdRWmdDMID
+DncKjvbdjvWmcbYX
+DoCjjvbdnBjXXoOV
+DncKjvbdiBnbdwQq
+EPDKjvbdDoDKjwCd
+EPCkKvbdFxuVBEYC
+DncKjvbdFVxopMie
+EOcLKvbdKWUfEEfi
+EPCkKvbdNrtVgEtp
+DoDLKvbdfoazwDxI
+DoDKjvbdqquKmkAm
+EPDKjvbdhbPCeXRR
+DncKjvbdZtIhyETO
+EPCkKvbdQwNdCkhD
+EPDKjvbdhzUfMROG
+DnbjjvbdrpVoKCuf
+EPDLKvbdtlYWaUAw
+EOcLKvbddoErjstS
+DnbkKvbdyzeORghh
+EPDLKvbdZnmhdeZj
+DoCjjvbdcIlikGXY
+EOcLKvbdLAkHNBxR
+DoCjjvbdtkwwBUAw
+DoCjjvbdgGMZnHHA
+DnbkKvbdUsmTfLuj
+EOcLKvbdqZPHgQcx
+EPDLKvbdLqvlytpz
+DoDLKvbdqdFIomvB
+EObjjvbdBhjbKhfK
+EOcLKvbdrMyjYlIJ
+DncKjvbdDncKkXCd
+DnbkKvbdNQXpunHT
+EPDKjvbdZjSgofbG
+DnbjjvbdBiKbLIej
+DoCjjvbdGAoQxizm
+EOcLKvbdwtldqZLn
+DoDLKvbdIrxaSmXl
+DoCjjvbdNHDQMpUk
+EOcLKvbdTkunaWOi
+DncLKvbdNHCpMpVL
+DoDKjvbdelfXHNKL
+EObjjvbdcyxpYYqC
+DoDLKvbdZGwEAOri
+DoDLKvbdIxUCHkqQ
+DoCjjvbdoznEKxPA
+EOcKjvbdbLMGPNcA
+EObjjvbdiiegilxS
+DoDKjvbdZRNFImFR
+DncLKvbdRbDeLhxk
+EPCkKvbdqlzJxlHi
+EOcLKvbdhkeDnUby
+EPCjjvbdhaoDEwQq
+EPCkKvbdFkFScHlu
+EPCjjvbdJKEAKQGd
+DoCkKvbdpxngfqDx
+EObjjvbdUGznLwWF
+EObjjvbdVZHsykPO
+DncLKvbdYlRdUNlN
+EPCkKvbdHDkWKBjK
+DncLKvbdjKFhKMxS
+DnbjjvbdnBjWxPOV
+EObkKvbdtcCtvvOo
+DnbjjvbdTpqPUthN
+DncLKvbdMoxQvOGs
+DnbjjvbdfNGXHMjL
+EPDKjvbdhgJcZVjV
+DoDLKvbdNGbolpVL
+EPDKjvbdatbHYLUI
+DncLKvbdczZPwxqC
+DnbjjvbdZxcimblS
+EPDLKvbdKaKgMbXq
+EOcLKvbdtbcUwWOo
+DnbkKvbdJutfEEfi
+DoCjjvbdmIdURUqa
+EPCjjvbddBrmSATm
+EPCkKvbdXsLaNUPY
+DnbkKvbdNPwpvOGs
+EOcKjvbdIwsaglQp
+DoCkKvbdlhdUQtrB
+DoDLKvbdGdLWJaij
+DoCjjvbdwXMAvAvV
+DnbkKvbdbrbkTdJa
+EPDKjvbdFVxpQNJe
+DoCjjvbdHDkWJbKK
+DnbkKvbdjvXODbYX
+DoCjjvbdemFwGmJk
+DoCjjvbdQdCaPpcr
+EOcKjvbdqcdiQNvB
+DncLKvbdbBWFFoow
+EOcKjvbdKaKgMawq
+EObkKvbdLBKgMawq
+DncKjvbdcbSmSAUN
+DoCjjvbdyOTHwsJD
+EOcLKvbdOStVfeUp
+EObkKvbdHffyyYXg
+EPCjjvbdmuUykJrG
+DoDLKvbdJYTbILpp
+DncKjvbdnGdwlmgZ
+EPDKjvbdZQldhldq
+EObjjvbdUaBpsRSZ
+EOcKjvbdrzLpSaIO
+DnbjjvbdLGFgbAqV
+EPDKjvbdXrlAmUOx
+EPDLKvbdtSqryZeD
+DoDKjvbdtlXwAtAw
+DoDKjvbdaRebgsfL
+EObjjvbdUWLpKUAq
+EObjjvbdQvmccLgc
+EOcLKvbdznopeDMY
+EOcLKvbdIwsbHkpp
+EPDLKvbdziuQPcsU
+EPDLKvbdelevgMik
+DoDKjvbdTAFIgbOd
+DoDLKvbdbBWFGPow
+DoDKjvbdYqNEiMeR
+EOcLKvbdhficYuiu
+EOcKjvbdyTOImRbH
+DncKjvbdiLeDmtby
+EPDLKvbdUsmTekvK
+DoCkKvbdkCkkQftg
+DoCkKvbdVTmUFlVj
+DoCkKvbdTIyjRAAl
+EOcKjvbdbUafxKtI
+EOcKjvbdZsiIxdSn
+DoDKjvbdSCEElIyL
+DnbjjvbdBsAbsfXS
+DoCkKvbdBcpAuimG
+DoCkKvbdVwIwvEEg
+DnbjjvbdajlFoNcA
+EPCkKvbdtSrTYzFD
+DnbkKvbdGFirNhsq
+EOcKjvbdapHHELzd
+DoDLKvbdiUyeXSUb
+DnbjjvbdtAGqIABS
+DnbkKvbdXsLaMsnx
+DoCkKvbdeEnqawDK
+EOcKjvbdDxXkstUM
+DnbjjvbdcyxoxZQb
+DoDLKvbdlrZVZrci
+DoCkKvbdTAEiICPE
+EOcLKvbdpyPHfpcx
+EPDLKvbdVBCRTQqy
+DnbjjvbdmJEUQtqa
+DnbjjvbdkClKqHVH
+EObkKvbdCJKajiGK
+EObkKvbdeAURMxJf
+EPDLKvbdcSbkUDjB
+DncLKvbdsCFmLfjy
+EPCkKvbdIwsahLqQ
+DoCkKvbdrJAJeMne
+DoDLKvbdIHGzYwxH
+DoCjjvbdGckVjBjK
+EObjjvbdegkVqmqH
+DoDLKvbdLKaIWAKZ
+EPDLKvbdaRfChUGL
+DoDLKvbdyYJJaozL
+DoCkKvbdrWpLbhyR
+DoCkKvbdLGGIBaRV
+DoDKjvbdKyRJrztf
+DoCkKvbdjuvnEBxX
+EObkKvbdNeEThhkE
+EPCjjvbdQwNcbkhD
+DoCkKvbdJqZePGOF
+EObjjvbdNGbomQUk
+EObkKvbdkxrqsZHU
+EOcLKvbdrounjDVf
+DoDLKvbdkClLRGtg
+EOcLKvbdbKkfOnDA
+EPCkKvbdRDbaPpcr
+EPDLKvbdkHgLefNk
+EOcLKvbdFVxpPmKF
+EObkKvbdsrrSxzEc
+DnbkKvbdFeirOIsq
+DncLKvbdzitopDrt
+DoCjjvbduWOXjQsA
+EPCkKvbdyXhjCPyk
+DoDKjvbdaaWEfPow
+DncLKvbdvAcySneI
+EObjjvbdADRwjZhp
+EObkKvbdnPyxvLYb
+DncKjvbdijGIJlwr
+EPCjjvbdJcJbqJcY
+DnbkKvbdkMbLydgP
+DoCkKvbdRDbaQQcr
+DoCjjvbdxsOIlrCH
+DnbjjvbdKQydnfOF
+EPDKjvbdcImKKfWx
+DnbjjvbdcImKKewY
+EObkKvbdqdFJPmua
+EObjjvbdajkennDA
+DnbjjvbdZyEKNcLr
+DoCjjvbdKWVFdEgJ
+EPDKjvbdWXIwuceH
+DnbjjvbdqiAJdlne
+EOcLKvbdkyTRryGt
+EPCjjvbdpaJFAWgd
+EPCjjvbdmJDsqVSB
+EPCjjvbdREDAopdS
+DoCjjvbdRpUHKFdX
+DncKjvbdptUHSSKt
+EPCjjvbdiCObdvpq
+DncLKvbdNwnuzcmt
+DncKjvbdqdFIpOWB
+DoDKjvbdjggLefNk
+EObkKvbdrNZiyLgi
+EPCkKvbdaSFcITfL
+DnbjjvbdGLFTDINV
+EPCkKvbdiLeENuDZ
+DncLKvbdZyEJmcLr
+EObjjvbduDCuWvOo
+DoDKjvbdNQXqWNgT
+DncKjvbdVBCRTRRy
+EPCjjvbdSQUGifEX
+EOcLKvbdANIZSvyx
+DoDKjvbdvBDyTPFI
+DnbkKvbdEPCkLWbd
+DoCkKvbdyYIjCPyk
+DnbkKvbdelewGmKL
+EPDLKvbdatbGxLUI
+EPDLKvbdTvLojTaR
+DoCjjvbdhtyeWrVC
+DoDKjvbdzeZnzdzQ
+DnbjjvbdyzdnRhJI
+EPCjjvbduLxWaUBX
+EOcLKvbdkyTRsYgU
+DnbjjvbdCTBCsewS
+EObjjvbdjAPgApHK
+EPDLKvbdwkWdHzyf
+EObjjvbdsPvOicWG
+DoCkKvbdTulPisaR
+DnbkKvbduCcUvuoP
+EObkKvbdZRMdiMeR
+DoCkKvbdSPtHJfDw
+DncLKvbdKaLGlaxR
+DnbkKvbdRpTgKGDw
+DoCjjvbdWXJYWEEg
+EObjjvbdWXJYWDdg
+EOcKjvbdKCjCqKCx
+DnbkKvbdakMGPNcA
+DoDKjvbdwkXDgzzG
+EObkKvbdNHDPlotk
+DncLKvbdyzdmrIJI
+EObkKvbdFkErbhMu
+EPCkKvbdNeDsiIjd
+DoDKjvbdIGfyyXxH
+DoCjjvbdZyDinDLr
+EPCjjvbdemFvfmJk
+EObjjvbdJYTbILqQ
+DnbjjvbdWXIwucdg
+DoCjjvbdiHKCxvJu
+EPDKjvbdfpBzwDxI
+DoCjjvbdaNLCStlg
+EPCkKvbdnVUykJqf
+DoCjjvbdyYIjBozL
+EPCjjvbdzjUpQDsU
+DoDLKvbdZxcjOCkr
+EPCkKvbdeFOrBvcK
+EPDKjvbdKaKflaxR
+EOcLKvbdfMevgMjL
+EPDKjvbdGckWKCKK
+DoCjjvbdKVuFdEgJ
+EObjjvbdfMfWfmJk
+DoDLKvbdMfbomQVL
+EPDLKvbdRkYeuGjs
+EOcLKvbdKfGHaaQu
+EObkKvbdoznDjwoA
+EOcKjvbdUMWPBVoJ
+DoCkKvbdFjeSbgmV
+EPCjjvbdrEFJQOWB
+EOcLKvbdvAcyTOdh
+DnbjjvbdWfYzUAOs
+EObkKvbdTkuoBWPJ
+DnbkKvbdFpASvgFy
+DoCjjvbdczZQXyRC
+DoCjjvbdRDcBQQdS
+DoDKjvbdqYngfqDx
+EObkKvbdWRmwbElD
+EPCjjvbdFyVVBDwb
+EObjjvbdBhjbKhej
+DncLKvbdzaAPGgBl
+EObkKvbdTppoVUgm
+DoCjjvbdbrcLTcjB
+EPCkKvbdGLFTCglu
+DoDLKvbdDwxMUUUM
+EPCjjvbdNQYQumgT
+DncKjvbdmfeXmOGy
+EPCjjvbdwtmFRYkn
+DoCkKvbdsBfMlGjy
+DncLKvbdRpUHKGDw
+EObjjvbdjblLQfuH
+EObjjvbdJYTbHlRQ
+DoCkKvbdmttyjiqf
+DoCkKvbdZQldiMdq
+EPDKjvbdFejSNiUR
+EOcLKvbdjgfkfFnL
+DnbjjvbdMpYQvNgT
+DnbkKvbdUyIUZjnn
+DnbkKvbdJbjDRKDY
+EPCjjvbdeEnrBvcK
+EOcKjvbdyzdnSIIh
+DoDKjvbdDoDKjwCd
+DoDLKvbdCSaDUFwS
+DoDLKvbdIrxaTMwl
+DnbkKvbdRNXayNtz
+DoCkKvbdxxJKBoyk
+DncLKvbdnGdxNOGy
+DnbjjvbdySmhlqbH
+DoCkKvbdxwhjBoyk
+EPCjjvbdZQleIleR
+EPCjjvbdaRfChTek
+EOcKjvbdYTMBNUPY
+DoCjjvbdegkWSNpg
+EObkKvbdziuQPdTU
+EOcKjvbdnCKXYOmu
+DoCkKvbdZnmhddzK
+EObjjvbdzaAPGgBl
+DoDLKvbdePFSjtTr
+EPCkKvbdNrtWGeVQ
+EPCjjvbdelfWfmKL
+DoDKjvbdKxpjSztf
+EPDKjvbdxmsIXsIc
+EPCjjvbddZyPxYqC
+DoDKjvbdvOszqLOt
+DncKjvbdatbGxLTh
+EObjjvbdzoQQdbkx
+DoCjjvbdZRMeImEq
+EOcKjvbdqTtGqqjt
+EOcKjvbdqAheAWgd
+DnbjjvbdySmhmRag
+DncKjvbdjKFhJlwr
+EPDKjvbdqFceUWBI
+DoDKjvbdsBemLgLZ
+EPDLKvbdKQzEoFnF
+EOcKjvbdFjdsCgmV
+EObjjvbdpfEEtWBI
+EPDKjvbdZxcjOClS
+EPDKjvbdnBivwoOV
+EPCjjvbdrylQTAhO
+EPDKjvbdKaLGmBxR
+EPDKjvbdHgGzYwxH
+EObjjvbdkHflGFmk
+DnbjjvbdqGDeUVaI
+EPDKjvbdMgDQNQUk
+DncLKvbdSKyGVHKs
+EOcKjvbdqFdEsvAh
+EOcKjvbdYkrETnLm
+DnbkKvbdqBIeAXHd
+DncLKvbdZQldhmFR
+DncLKvbdFjeSbhMu
+EPCkKvbddePRavcK
+EPCkKvbdssRsYzEc
+EPCkKvbdRadFLhxk
+DnbkKvbdVvhxWEEg
+EOcLKvbdIryArmYM
+EPCkKvbdKfGHbAqV
+DncKjvbdEKIJuxKA
+EPDKjvbdIwsbIMRQ
+EObkKvbdzaAOfgBl
+DncLKvbdeUAUASlv
+DnbjjvbdlqxuZsDi
+DnbjjvbdUWMQKTaR
+EOcLKvbdNGbpNPtk
+EPDKjvbdWSOYCEkc
+DoCkKvbdjggMGGOL
+DoCjjvbdSQUHJecw
+DncLKvbdZyDjODMS
+EObjjvbdfpBzvcxI
+EOcLKvbdTlVoAvPJ
+DnbjjvbdVviYWEFH
+EPCkKvbdZnmiFFZj
+EObjjvbdNGbpNQUk
+DoDLKvbdrbGMkfjy
+DoDLKvbdxnShYSiD
+EObkKvbdJYTahMRQ
+DoDLKvbdoAKzshEO
+DoCkKvbdZxcjOCkr
+EPDLKvbdRWmdCkgc
+EPCkKvbdGFiqnJUR
+DoDKjvbdRzJgsDWA
+DncLKvbdptTfqqjt
+EPDKjvbdmIctRUqa
+EObkKvbdnBiwXoOV
+DnbjjvbdfMevfljL
+EObkKvbdBraDUGWr
+DncKjvbdUxhTzKnn
+DoCjjvbdmfdxMmfy
+DnbjjvbdhuZeWrVC
+DnbkKvbdLiCLpxAS
+DnbjjvbdKfFgbApu
+DnbjjvbdziuPpETU
+DoCjjvbdwuNEqZLn
+EPCkKvbdEXwksssl
+EPCjjvbdhgKCxujV
+DoDKjvbdhlEdOVDZ
+DncKjvbdLAjgMbXq
+DncKjvbdOFEThhkE
+DoCkKvbdANHxrvzY
+EPCjjvbdZtIiZDrn
+DoCjjvbdYpldhmEq
+DncLKvbdqwPlDIyR
+DncLKvbdUtNUFlWK
+EObkKvbdkWXODbYX
+DnbjjvbdRzJhSbvA
+DoCkKvbdEJgjVxKA
+DncKjvbdxnSgxShc
+EObjjvbdbUbHYKsh
+DncLKvbdZoNiFEzK
+EPDKjvbdbiMjKevx
+DnbkKvbdIwsbHlRQ
+EObjjvbdhWyAzzAJ
+EObkKvbdqvpLcIyR
+EObjjvbdGGKSOIsq
+EObkKvbdTpqPUthN
+DncKjvbduaEZTOdh
+EObkKvbdJJdAJofd
+DoCkKvbdEKIJuwjA
+DncLKvbdDnbjkXDE
+DnbjjvbdhbObdwQq
+EObjjvbdunszpkPU
+EPCjjvbdwNWANDdm
+EPDLKvbdozmcjxPA
+EObjjvbdZnmiFFZj
+DnbjjvbduDDUwVno
+EOcKjvbdZjShPfbG
+DncLKvbdADSXiyhp
+DoCjjvbduCcVXWPP
+DnbkKvbdffLzOHHA
+DncLKvbdBdPaWJlf
+EPDLKvbdJvVGEFGi
+EPCkKvbdvwMBWBWV
+EObjjvbdijGHjMxS
+EPCkKvbdaNLCTVNH
+EPCjjvbdbAudeopX
+DoDKjvbdozmcjwoA
+EPCjjvbdYlRctOMN
+DoCjjvbdDoDLKvcE
+EObkKvbdVqmwaeMD
+DnbjjvbdqvolChyR
+EPCkKvbdRkZGVGjs
+DoDKjvbdjvXOEBxX
+DoCjjvbdIHHZyXwg
+DnbkKvbdLBKgNCYR
+EPDKjvbdyNsHxShc
+EOcKjvbdyzdmqhJI
+DnbjjvbdqFcdtVaI
+EObjjvbdrJAKElne
+DncKjvbdTvLpJtAq
+EObkKvbdDoDKjvbd
+EPCjjvbdYlRcsnLm
+DoDKjvbdegkVqmqH
+EPDLKvbdZHXEAPSi
+DoDKjvbdakLennDA
+DncLKvbdrDdiPmua
+DoCjjvbdhbPDEwRR
+EPDLKvbdtcDUvuno
+DnbjjvbdEKHjVxKA
+EOcLKvbdYqMdhmFR
+EPDLKvbdmttzKiqf
+EPDLKvbdTkvPAuoJ
+DncLKvbdVAbRTQqy
+DncLKvbdLBKflbYR
+DoCjjvbdZyDimcMS
+EOcKjvbdFpATXHFy
+EObkKvbdnCJwYOmu
+EPCkKvbdVZHszLPO
+EPCkKvbdCSaDTfXS
+DncKjvbdNVSqjmAX
+EPCkKvbdFjdrbhMu
+EPCkKvbdbsCkUDjB
+EObjjvbdMowpumfs
+DoDLKvbdRotHJecw
+DnbjjvbdTfzmkwWF
+EObjjvbdBcpAvKNG
+DoDLKvbdWHxWXfxz
+EPCjjvbdqUUGrSKt
+DncLKvbdliDsqVSB
+DnbkKvbdBdQAujMf
+DnbkKvbdWXIxVcdg
+DoCkKvbddePSCXCj
+DnbjjvbdZirhPfbG
+DnbjjvbdyXiKBozL
+DnbjjvbdznpREcMY
+DncKjvbdJcKCqKCx
+EPCkKvbdJbibpjDY
+EPDLKvbdkClLRHVH
+EPDKjvbdTvLoisaR
+EOcKjvbdZGwEAPSi
+EPCkKvbdKRZdnenF
+DncKjvbdfMfXGmJk
+EPCkKvbdhfibyWJu
+EOcKjvbdMIbLqYAS
+EPDLKvbdbUbHXjtI
+EObkKvbdCSaDUFwS
+EPDLKvbdGGJqnJUR
+EOcLKvbdDoDKjvbd
+DnbjjvbdFkFTDIMu
+DnbjjvbdgFlZnGgA
+DoCkKvbdakLfPODA
+EPDLKvbdDwwlTstM
+DoCjjvbdMJBkqYAS
+DnbjjvbdiGjCxujV
+EPDLKvbdVwIwuceH
+EPDLKvbdZyEKOCkr
+EPDKjvbddoFTLTtS
+DoCkKvbdXrlAlsnx
+EOcLKvbdZoOIeEzK
+DnbjjvbdaMjbTVMg
+EPDKjvbdeOeTKssr
+DncKjvbdSKxetfjs
+DoCjjvbdpxnhGpcx
+EPDLKvbdmtuZkJrG
+DoCjjvbdYkqdTmlN
+EOcLKvbdJuuGEEfi
+DoCjjvbdhzUfMROG
+DncLKvbdddnrBvbj
+EOcLKvbdWSNwbFMD
+DoDLKvbdtSrTYydc
+EPCjjvbdRjxetgKs
+DncKjvbdFxttaEYC
+EPDLKvbdiBncFWpq
+DnbjjvbdyTOImSCH
+DoDKjvbdcyyQXyRC
+EOcLKvbdZLrEUOLm
+DoCjjvbdXmqAYVWU
+EPCjjvbdUsltFkvK
+DncKjvbdLqvmZuQz
+DnbjjvbdZjTIQGaf
+DoDKjvbdzoPpeCkx
+EPDKjvbdGGKSNhsq
+DncKjvbdtSrSxzFD
+EPCkKvbdyOTHxShc
+DnbkKvbdehKvSORH
+DoDLKvbdWIXvYHYz
+EObkKvbdDoCkLXCd
+DoDLKvbdLBKflaxR
+EPDLKvbdKQzFOenF
+EObjjvbdjFLHVPAO
+EObkKvbdFeiqmhsq
+DoDKjvbdRotHKFdX
+DnbkKvbddZxpYZQb
+DncKjvbdqqtkNkBN
+EPDKjvbdZjShPgBf
+DoCkKvbdNHCpMouL
+EObjjvbdxZgefYFS
+DoCjjvbdNrsvHEuQ
+DoCjjvbdwzHeewdr
+EObjjvbdvPTzpkPU
+EPDKjvbdrounibvG
+DnbkKvbdpstGqqjt
+EPDLKvbdeFOrCXDK
+EOcLKvbdGBPRYizm
+DoDLKvbdNwnuzdOU
+DnbkKvbdRMwaxnUz
+EOcLKvbdDihKWXjA
+EObkKvbdFeirOJTq
+DoDLKvbdSKxeuGjs
+EOcLKvbddndsKssr
+DnbjjvbdiCPDEvpq
+EOcKjvbdMoxQumfs
+DnbkKvbdfNGWfljL
+DnbkKvbdIHGzZXwg
+EObjjvbdTlWPAvOi
+DoDLKvbdnPyyVkZC
+EOcKjvbdkWWmdBxX
+EObkKvbdEJgjWXjA
+DnbjjvbdkMalZdgP
+DnbkKvbdsCGNLfjy
+DnbjjvbdYqMeIleR
+DncLKvbdMgComPtk
+DoCkKvbdMfbolouL
+DncKjvbderAvzlDP
+DnbjjvbdqwQLcIyR
+EObjjvbdcImJkFwY
+EPCjjvbdYzberKVy
+DoCjjvbdEzsqElCi
+EObkKvbdRotGiecw
+EPCkKvbdGLErcINV
+DoCkKvbdYpmEiMdq
+DoDKjvbdJXsaglRQ
+DnbkKvbdFVxpPmJe
+DnbkKvbdxUmEpyLn
+EPCjjvbdLrXMytpz
+DnbkKvbdhtzEvqtb
+EPDKjvbdDxYLstTl
+EPCkKvbdiBoDFXQq
+EPCkKvbdZoOJEeZj
+DoCjjvbduDCuWuoP
+EObkKvbdjcLkQfuH
+DoCkKvbdcImKLGWx
+EPDLKvbdEYXlUUTl
+EOcLKvbdZLqdTnMN
+EOcKjvbdmozYujyC
+DncLKvbdJpzEnfOF
+EOcLKvbdiCPCdvpq
+DncKjvbdADRxKZhp
+DoDLKvbdmJDsqVSB
+EObkKvbdnBiwYPOV
+EObkKvbdqwQMDIxq
+DncKjvbdeFOqbWbj
+EPDKjvbdmfeYMmfy
+DnbkKvbdGLFSbhNV
+DoDLKvbdwkXDgzzG
+EObkKvbdbAvFFpQX
+EPDLKvbdyXhjBoyk
+DoCjjvbdMfbpMouL
+DoCjjvbdREDApRES
+DncLKvbdmajWwnmu
+DoDLKvbdIidAJofd
+DoCjjvbdSZihTCvA
+DoCkKvbduLwvaUBX
+EPCkKvbdiHJbyVjV
+EObkKvbdGYtuAdXb
+DoDLKvbdCTBCtFwS
+EOcLKvbdhlFENtby
+DoCkKvbdySnIlrBg
+EPDLKvbdwuNFQyMO
+DncKjvbdlqxtzTDi
+DoDKjvbdWWhxWEFH
+DoCkKvbdiHJcZVjV
+EPDKjvbdCflGHAzc
+DncLKvbdzROmJKXA
+EPDLKvbdCJLBjhej
+EOcKjvbdVrNwbEkc
+DnbkKvbdUtNUFlWK
+DoDKjvbdLBKflbYR
+EPCjjvbdauBfwkTh
+EPCkKvbdrXQMDJZR
+DnbjjvbdnVUyjjSG
+DncKjvbdiMEdOUby
+DoDKjvbdqiAKFNPF
+EOcLKvbdQdDBQQcr
+DoDKjvbdpxnggQdY
+DncKjvbdtSrTYydc
+DnbjjvbdwzHefXeS
+DoCjjvbdRosfjGEX
+EPCkKvbdnPyxujyC
+EObjjvbdZyEJnCkr
+DnbkKvbdhytelRNf
+EPDLKvbdeYZstSFz
+EObjjvbdTfzmlXVe
+EOcKjvbdbKkenmcA
+DncLKvbdvwMAuaVu
+EObkKvbdwMvAMdEm
+EOcLKvbdkHflFfNk
+EPCjjvbdzoPpeDMY
+DoCjjvbdiLeDmuCy
+EOcKjvbdRpUGjGDw
+DnbkKvbdUslsekuj
+EPCjjvbdmJEURVRa
+DncLKvbdZjSgofaf
+EOcLKvbdaMjasUlg
+DoCjjvbdREDBPpdS
+DnbjjvbdIwsaglQp
+DoCkKvbdkNCLzFHP
+DoDLKvbdaRfChUFk
+EPCjjvbdrRtjnKaN
+EPCkKvbduoTzpkOt
+EOcKjvbdnHFYMmfy
+EOcKjvbdHDkVjBjK
+EObjjvbdEXxMTssl
+DnbjjvbdNPxRWOHT
+EObjjvbdiZtfLpmf
+EObjjvbdTvLojTaR
+DoDKjvbdKkBIWAKZ
+DoDLKvbduCbtwVno
+DncLKvbdmttzKjSG
+DncLKvbdbBVdfQQX
+EObkKvbdyXiKBpZk
+DncLKvbdzGxlAMdw
+DoCkKvbdMpXpvNfs
+DoCkKvbdKQydoGOF
+EPDLKvbdTfzmlXVe
+EPDKjvbdQccBPqES
+EPCjjvbdZtJIyESn
+DoCjjvbdVrOXbElD
+DnbjjvbdbLMGOmcA
+DnbkKvbdnPzZWKyC
+EPDLKvbdmajWwoOV
+EObjjvbdQwOEDMHc
+EPCkKvbdTvMQKUBR
+DoCjjvbdOTUVgEtp
+DoCkKvbdIHHZyXxH
+EPDLKvbdDoDLKwDE
+EObjjvbdiZtfMQmf
+EObjjvbdijGHimXr
+DoDKjvbdVrNxCElD
+EPDLKvbdJutedFGi
+DnbjjvbdmSZVZsEJ
+DncKjvbdqlzKYlIJ
+EOcKjvbdfelZnGgA
+EOcKjvbdYlRctOLm
+DoDKjvbdPxmAHSrK
+EPCjjvbdWWiYWEEg
+DoCjjvbdbAvFFoow
+EOcKjvbdFjeSbglu
+EPDLKvbdlqyVZsEJ
+EOcKjvbdddoRbXDK
+EPCkKvbdaRecHtFk
+DncLKvbdSKyGUgKs
+DoDLKvbdcyyPwyQb
+DoDLKvbdnVUzKjRf
+EObjjvbdYkqdUOLm
+EObkKvbdRbEEkhyL
+DncKjvbdtAHQhAAr
+DnbkKvbdVqmwbFMD
+EOcLKvbdznoqFDLx
+EOcLKvbdEXxLtTsl
+DnbkKvbdtumwipsA
+EObjjvbdmJEUQtqa
+DncKjvbdxwhjCPyk
+DnbkKvbdyfyMANFX
+DncLKvbdiVZeXRtb
+EObkKvbddtAUATMv
+EOcKjvbdxnSgwriD
+EObjjvbdlrZVZrdJ
+EPCkKvbdsBelkfkZ
+DoDKjvbdFVyPomJe
+EPCkKvbdQmYBxnUz
+EOcKjvbdSBdFLhyL
+DncLKvbdmJETpuSB
+DoDLKvbdRECaPpcr
+DncLKvbdIxUBglRQ
+DoCjjvbdpssfrSLU
+DnbkKvbdSQUHJedX
+EObjjvbdkySrTZHU
+EObkKvbdZtIiZETO
+DoCjjvbdtumwipsA
+DoCjjvbddBrlrAUN
+EPCjjvbdKCjDQibx
+DoCjjvbdQccAopdS
+DoDLKvbdSBceLiYk
+EPDKjvbdREDAoqDr
+EOcKjvbdZQleJMeR
+DoCkKvbdEARiMywX
+EPDKjvbdkDLkQgUg
+DncLKvbdFjdsDIMu
+EPCjjvbdlrYtysDi
+EPCkKvbdezuxeIsw
+EObkKvbdyNsHxTJD
+DnbkKvbdemGWgMik
+DoDLKvbdBhkCKhej
+EOcLKvbdjvWmcaww
+EPDLKvbdqTsgRrLU
+EObkKvbdZyDimcLr
+EPCjjvbdlrYtzTEJ
+DoCkKvbdHgGyyYXg
+DoCkKvbdZoNhddyj
+EPDKjvbdhtzFWquC
+EPCkKvbdDoCkKwDE
+DoDLKvbdsrqsZZeD
+EPCkKvbdiHJbxuiu
+DoCjjvbdhlFEOUcZ
+EPDKjvbdDigiuwjA
+EPDKjvbdQdDBPqES
+DoCjjvbdcTCjsdKB
+DncLKvbdUsmUFkuj
+EPDLKvbdnHEwlnGy
+EOcLKvbdxVNEqYkn
+DoDKjvbdEuxopNJe
+EObkKvbdkClLQfuH
+EPCjjvbdcTDLUEKB
+EOcKjvbdEPDKkXDE
+EPCjjvbdXsLaNUOx
+DoDKjvbdFWZQQNKF
+EPDLKvbdUtMtFlVj
+EOcKjvbdzaAPGfal
+DnbkKvbdHlBznXRL
+DoDLKvbdTlVoBWPJ
+EPCkKvbdDoCjkXDE
+EOcKjvbdrzMQTAhO
+EOcLKvbdozmdLXoA
+DoDLKvbdzQnmIjXA
+DoCkKvbdmgExMmgZ
+EPCkKvbdzjUoocrt
+EOcLKvbdwyhGFweS
+EOcLKvbdWWhxVceH
+DncLKvbdqqtkOKaN
+DoCkKvbdOTTvHEuQ
+DoDLKvbdjJehKMwr
+DoCjjvbduDCtvuoP
+DnbjjvbdqdEiPmvB
+DnbjjvbdhtzEwRuC
+DnbkKvbdRkYetfkT
+DoDKjvbdCDpBVjNG
+DoCkKvbdcSbjscjB
+EPDLKvbdYpldiMdq
+DoCjjvbdaaWEfPow
+EOcKjvbdqZPHgQdY
+DoCkKvbdeOdrjtUS
+DoDLKvbdFaPRZJzm
+DnbjjvbdRECaPqES
+DncKjvbdaMjaruMg
+EObjjvbduVnYJpsA
+DnbkKvbdqTsfrSLU
+DncKjvbdYqMeJMdq
+EOcKjvbdvvlBWAuu
+DnbjjvbdUxgtZkOn
+EOcKjvbdOSsufduQ
+EOcLKvbdtumxJqTA
+DncKjvbdIryAsNXl
+DoDKjvbdMuTRkNAX
+DoDLKvbdxnSgwrhc
+EOcKjvbdiHKCxujV
+EObkKvbdeKJrVtzn
+EPDLKvbdjhHMGGNk
+EOcLKvbdkVwNdBww
+EOcLKvbdygZMANEw
+EPDLKvbdRXODcLhD
+EPCjjvbdSPsfjFcw
+DoDKjvbdYpleIldq
+DoDLKvbdOEcsiIjd
+DnbjjvbdddoRavbj
+DncLKvbdHDkWKBjK
+DoCjjvbdxxJKBoyk
+EPDKjvbdYkqdUNkm
+DoDLKvbdDnbjjvcE
+DoCkKvbdVvhxVceH
+EPDLKvbdWRnXbFMD
+EObkKvbdliEUQtqa
+EPCkKvbdNQXqVmfs
+EOcLKvbdIGfyyYYH
+DncKjvbdxUldpxlO
+DoDKjvbdznopdcLx
+DncKjvbdHDkVibKK
+EPDLKvbdjlbLydgP
+DoDKjvbdYTMAltOx
+DoDKjvbdcSbkUEKB
+EPCjjvbdzoQREblY
+EOcKjvbdZxcinDMS
+DoDKjvbdZyDjODMS
+DoCjjvbdxZgfFwdr
+EPDLKvbdaMkBsVMg
+EPCkKvbduDDUvuno
+DncKjvbdsCFmLgKy
+DoDLKvbddeOrCWcK
+DncLKvbdNddThhjd
+EOcKjvbdBvzcheQW
+EPDLKvbdeEnqbXCj
+DoCjjvbdNrtVfduQ
+EOcKjvbdZQmEiNFR
+EPCkKvbdGFjSNiTq
+EPDKjvbdZxcinCkr
+DoCjjvbdkNBlZdgP
+DoCkKvbdEYXkstTl
+DncLKvbdYpmEhmEq
+EOcLKvbdePFSkTsr
+DoCjjvbdemFvfmKL
+DnbkKvbdemFwGljL
+EPDLKvbdmbJvxOnV
+EPCjjvbdtbcVXVoP
+EOcKjvbdFkErcHmV
+DoDKjvbdVUMtFlWK
+EOcLKvbdkMakydfo
+DnbjjvbdIMBznWqL
+EObkKvbdptUHRrLU
+DnbkKvbdjJfHilwr
+EPCjjvbdGYuUaDxC
+EObjjvbdmtuZjjRf
+DncLKvbdkCkkQfuH
+DoDLKvbdtlXwBUBX
+DncLKvbdCWzchePv
+EObkKvbdrEEiPmua
+EOcLKvbdYqNFIldq
+DoDLKvbdfILWRnQg
+DoDLKvbdqUUGrRkU
+DoCjjvbdfMfWflik
+EOcLKvbdOTTugEuQ
+DncLKvbdjvWnDaww
+EOcLKvbdsPuoKDVf
+EPDLKvbdZirhPfaf
+DoCjjvbdDwxLsstM
+DnbjjvbdfHkWRmpg
+DncLKvbdrpWOibuf
+EPDLKvbdZtIhyESn
+DncLKvbdwygfGYEr
+EPCjjvbdeEoSCWcK
+EPCjjvbdjuvmdBww
+EObjjvbdqUTfqqjt
+EOcLKvbdZjSgogBf
+DoDKjvbdYqMdiMeR
+DoCjjvbdKefICApu
+DoDLKvbdMfcQNQVL
+EPCkKvbdjggMGGNk
+EObkKvbdCDoaVjMf
+EObkKvbdWWiXuceH
+EOcLKvbdURROuVHm
+DnbjjvbdpssfrSLU
+DncKjvbdgFkzNgHA
+DnbjjvbdaSFbgtFk
+DncLKvbdIxTahMQp
+EPDLKvbdKWVFceGi
+DncKjvbdFVyPomKF
+DoDKjvbdZirgpHBf
+EObjjvbdVqmwadkc
+EPCkKvbdieLHVPAO
+DncKjvbdZLqdUOMN
+DoDKjvbdWWiYWDeH
+EObkKvbdQwNdClID
+DnbjjvbdMoxRVnGs
+DncLKvbdrDdiPmvB
+DnbjjvbdZQleJNFR
+EOcLKvbdrDdhpOVa
+EPDLKvbdYqNFImFR
+DoDKjvbdEYXlTtUM
+DoCjjvbdhuZeWqtb
+EPDKjvbdMfcPlpVL
+EOcKjvbdNQYQvNfs
+DoDKjvbdiUzFXSVC
+DoCkKvbdmRxtzSci
+DnbjjvbdbiMikGXY
+DoCjjvbdQdDBQQdS
+EObjjvbdqZPIGqDx
+DoCkKvbdkWWmdBxX
+DoDKjvbdKxpirzuG
+DoCjjvbdlBNPNALA
+DoCjjvbdhzVGMROG
+DoCjjvbdzoQREcMY
+EPDKjvbdlAlnmALA
+EPDLKvbdwuMeRZLn
+EOcLKvbdYqMdiNFR
+EObkKvbdOTTugEuQ
+EOcKjvbdYTMAmUOx
+DnbjjvbdRDcBQRES
+DoDLKvbdidkHVPAO
+EPCkKvbdSKyFtfjs
+DoCjjvbdhytelQmf
+DncLKvbdEztRElCi
+EPDLKvbdRWnEDLgc
+DoDKjvbdwuNFQyLn
+EObkKvbdGLFTDHmV
+DnbkKvbdShyiqABM
+EObkKvbdUaCQsRSZ
+EOcKjvbdjuwNcbXw
+DnbkKvbdmfeXlnHZ
+DncKjvbdsPuoKDVf
+EOcKjvbdNGbomPtk
+DoDKjvbdvPTzpkOt
+EPDKjvbdJqZdneme
+DncKjvbdqTtGqqkU
+DnbkKvbdjggLeemk
+DoCjjvbdVZIUZkOn
+EPCkKvbdzjVPodTU
+DncKjvbdnBjXYOnV
+DoDKjvbdHgGzYxYH
+EPCkKvbdSZigsCvA
+EPCjjvbdtbbtvuno
+DoDKjvbdPIAXyAZB
+EObjjvbdRNXaxmtz
+DoCkKvbdUyITykPO
+EPCkKvbdssRryZeD
+EObkKvbdJuuGEFGi
+DoDLKvbdxZgfGXeS
+EObjjvbduoTzqLOt
+DoDKjvbdbrbkTcjB
+DncLKvbdxxIiaoyk
+DoCjjvbdFxtuBDxC
+EPDLKvbdzaAPGgBl
+EPDLKvbdpxnhGqDx
+EOcKjvbdtSqsZZeD
+EOcLKvbdMowpvOGs
+EObkKvbdVBCRSpqy
+DoCkKvbdZRNEiMeR
+EPCjjvbdczYowyQb
+DncKjvbdjgfkfGNk
+DnbkKvbdssSTYzFD
+EOcLKvbdVhYWYGxz
+DncKjvbdKDJcQibx
+DncKjvbdZHWdAPTJ
+EPCkKvbdFjdsChNV
+DoDLKvbdJcJcRJcY
+EPCjjvbdRjyGVHLT
+DnbkKvbdBcpBWKMf
+DoCjjvbdxUmEpyMO
+EPDKjvbdZoNiFEzK
+DoCjjvbdPIAYZAZB
+EOcLKvbdFejSOIsq
+DoDKjvbdjggMGFmk
+EObkKvbdWRnXadlD
+EObkKvbdnGdxMmfy
+DoDLKvbdLBKgNBxR
+DoCjjvbdaSGChTek
+EPCkKvbdSCEElIxk
+EObjjvbdIxTbHlQp
+EPCkKvbdOEcshhkE
+EOcLKvbdbsCjsdKB
+DncLKvbdCSaDUGXS
+EPCjjvbdRzJgsDWA
+EPDLKvbduCbuXVno
+EOcLKvbdGdLViajK
+DncKjvbdCWzdJEpW
+DncKjvbdjuwODbXw
+DncLKvbdqUTfqqjt
+EOcKjvbdxUmFRYkn
+DoCjjvbdVAaqSqRy
+EPDLKvbdaMkBsUlg
+EOcKjvbdGLFTCgmV
+EPCkKvbdZeYGzgiC
+DoCjjvbdwXLaWBVu
+DoCjjvbdelevgMik
+EPDKjvbdkHgMGGOL
+DoCjjvbdcJMjKewY
+EOcLKvbdwzHfGYEr
+DncLKvbdlZTRryGt
+EOcLKvbdfVzwoizs
+EPDKjvbdhzUelRNf
+EPCkKvbdiHKCxvKV
+EOcKjvbdGFjRmhtR
+EPDLKvbdGLEsChNV
+DoDKjvbdYORAXuWU
+DnbjjvbdpstHSSKt
+EObkKvbdegkVqmpg
+EPDLKvbdhyuGMQmf
+EObkKvbdliDtQtqa
+DoCkKvbdfNGXGlik
+DoCkKvbdHfgZyXwg
+DoCjjvbddndsKssr
+EPCjjvbdZMSDsnLm
+EObkKvbdEXxMTstM
+EPDKjvbdJvUecdfi
+DnbkKvbdVUMsekuj
+EPCjjvbdPyNAGsSK
+DoCjjvbdMSWmZuQz
+EObkKvbdBcpBVjNG
+DnbjjvbdezuxdiUX
+EPCjjvbdBdQAvJlf
+DncKjvbdOTUWHFVQ
+DoDKjvbdaSGDIUFk
+EOcKjvbdUGzmlWvF
+EOcLKvbdjlakydfo
+DoCkKvbdWSOXaeLc
+DoDKjvbdznpRFDLx
+DoCkKvbdwtldpxlO
+DoDLKvbdGdLVjBjK
+EObjjvbdmttykKSG
+DoDKjvbdZjShQGaf
+DoDKjvbdrDdhomvB
+EPDLKvbdiUyeXSVC
+DncKjvbdIsYaSmXl
+DnbjjvbdVhXvYHYz
+EPDKjvbdwzHfGXdr
+EOcKjvbdxsOJMqbH
+DoCjjvbdehKuqmqH
+EPCjjvbdZdxGzhJC
+EOcKjvbdsCGMlHLZ
+DoCjjvbdOEcshhkE
+DoCjjvbdEzsqElDJ
+DncLKvbdURRPVVIN
+EPCkKvbdZoOJFEzK
+DnbjjvbdBiKajhfK
+EOcLKvbdbUafwkTh
+EOcLKvbdVZHszKoO
+DnbkKvbdGKdsDIMu
+DnbkKvbddoFSkUUS
+DnbjjvbdPxmAGrqj
+EPCjjvbdKNADzHVB
+EPCjjvbdcyxpXxqC
+DnbkKvbdLBLGmBxR
+EPDKjvbdFWYopNJe
+EPCkKvbdcJNKKewY
+DoCjjvbdGLErcHmV
+EPCjjvbdWXIxWDdg
+DnbkKvbdQvmcbkhD
+EOcLKvbdbVCGwjtI
+DoCjjvbdmgFYMmfy
+EPDLKvbdQdDApRES
+DnbkKvbdWWhwvEFH
+DnbjjvbdxZhFexFS
+EPCkKvbdCIjakJGK
+EPCkKvbdKQyeOfOF
+DncKjvbdEObjkXDE
+DnbjjvbdNGcPlotk
+DoCjjvbdVUMtGMVj
+EPDLKvbdelfWgNKL
+DnbkKvbdqwPlDJZR
+DncLKvbdbiMikFwY
+EObkKvbdkNBkzEgP
+DoCkKvbdmuUyjiqf
+DncKjvbddneSjtTr
+EPCkKvbdRkZFtgLT
+EObkKvbdRjyGUgLT
+EPCkKvbdKaKgMaxR
+DnbkKvbdZMRdTnMN
+EPCkKvbdqZOhGpcx
+EPCkKvbdxwhjBozL
+DncKjvbdGckViajK
+EPCkKvbdiifHilxS
+EOcLKvbdqUUGrRjt
+EPCjjvbdbhljLGWx
+DnbkKvbdhgKCxujV
+DoDLKvbdJSyAsNXl
+DoDLKvbdjgflFenL
+EPCkKvbdMJBlQxAS
+DncLKvbdUMVoAvPJ
+DoCkKvbdkCkjpgVH
+EPDKjvbdqGEEsvAh
+EObkKvbdmRxuZrci
+EObjjvbdNdctIhjd
+EPCkKvbdCSaDTevr
+EPCjjvbdRDcAopcr
+EObkKvbdwtmEpyMO
+EOcKjvbdqZPHfqDx
+EOcLKvbdaNKbStmH
+EOcLKvbdaSFcHsfL
+DnbkKvbdRosgJecw
+EObkKvbdkySrSyGt
+EOcLKvbdwuMdqYkn
+EPCjjvbdrDdhonWB
+EPCkKvbdiBoDEwRR
+EPCkKvbdEztQdlCi
+EObkKvbdFyUuBEXb
+EPDKjvbdOAIsUJrA
+EPDKjvbdKCicRKCx
+EObjjvbdSZihSbvA
+DncLKvbdvAdYsPEh
+DncKjvbdySnImSCH
+EObkKvbdiVZeXRtb
+EOcKjvbdsCFllHLZ
+EPDKjvbdZeXfzgiC
+DnbjjvbdMpXpvNgT
+DoDLKvbdsCFllHKy
+DoCkKvbdqYoHfpdY
+DnbjjvbdRzKHrbvA
+EOcKjvbdNHComPtk
+EOcLKvbdCJLBjiGK
+EPDLKvbdsZlPsAhO
+DnbkKvbdemFvgMik
+DoCjjvbdFyUuBDwb
+DnbjjvbdrafMlGkZ
+DncKjvbddZyPxYpb
+EObjjvbdxZhGFwdr
+EPCkKvbdEXwlTssl
+DnbkKvbdANIYrvyx
+EObjjvbddePRawCj
+EPDKjvbdyNsIXrhc
+EPCkKvbdhkeEOVDZ
+DoDLKvbdAMgxrwZx
+EPDLKvbdsQWPJbvG
+DoCkKvbdkVvmcbXw
+EPDKjvbdJYTbIMQp
+DncLKvbdBsAcTewS
+DncLKvbdxrnJNRag
+EOcLKvbdmSYtzSdJ
+EObkKvbdqdFJQNua
+DoCjjvbdZyEKOCkr
+DoCkKvbdZLrEUOLm
+EPCkKvbdRNXaxnUz
+EPDLKvbdnUuZjjRf
+EObkKvbdmbKXYOmu
+DnbkKvbdlZTSTYgU
+EPDKjvbdGYuUaDxC
+DncLKvbdFyVVAcxC
+DoDKjvbdEvZPpMjF
+EPDLKvbdSwjlNzjx
+EPCjjvbdbKkeoNcA
+DoCkKvbdMfcQMotk
+DnbkKvbdyTNiNRbH
+DncLKvbdFWYpQMjF
+EPCkKvbdEvYopMjF
+DncKjvbdeKJrWUzn
+EOcKjvbdpssfrSLU
+EObjjvbdKCjDRJbx
+DnbkKvbdeUAUATMv
+EPDLKvbdjKGIJlxS
+DnbkKvbdpssfqrLU
+EPDKjvbdqZPHgQdY
+EPDLKvbdeAURNXif
+DoCjjvbdypoMhiwA
+EPDLKvbdGYtuAdXb
+EObkKvbdRaceLiYk
+DoCjjvbdXsMBNTnx
+EOcLKvbdKCjCqKCx
+DoCjjvbdYSlAmUPY
+EPDLKvbdpstGrSKt
+EPDKjvbdhtyeXRuC
+EObjjvbdtlYXBUBX
+EObjjvbdRMxByNtz
+EObjjvbdhanbeWqR
+EOcKjvbdpyPIHQcx
+EPDLKvbdrRtjnLBN
+DoDKjvbdNQYQvNgT
+DnbjjvbdbsDKsdJa
+DnbjjvbdDxYMTssl
+EPDLKvbdnCKWxOmu
+DncKjvbdILazmwQk
+DoDKjvbdhgJcYuiu
+DoCjjvbdlYrrSyHU
+EOcKjvbdVUNUFkvK
+EObjjvbdRyjHrbvA
+DoDLKvbdDnbkKvbd
+EOcKjvbdaNKbStmH
+DnbkKvbdjblLRGtg
+DncKjvbdxUleQyLn
+EPDKjvbdLGFhBaQu
+EObkKvbdqmZiyLgi
+DoCjjvbdJuuGEFGi
+EPDKjvbdqmZixlIJ
+DoCjjvbdXnRAYVVt
+EOcLKvbdWIYVxGxz
+EPCkKvbdxZgfGYEr
+EPDKjvbdfNGWfmKL
+EPDKjvbdbrbjscjB
+DoDKjvbdsPunjCvG
+DoDKjvbdziuQQDsU
+DoDLKvbdbhlijfWx
+EPCkKvbdhgKCyWKV
+EPDLKvbdGLEsCgmV
+EOcKjvbdmIcspuSB
+EPDKjvbdIwsbILqQ
+DoDLKvbdpedEsvBI
+DncLKvbdsPunjDVf
+DncLKvbdIxTbHkqQ
+DncLKvbdcSbkTdJa
+DncKjvbdUWLpJsaR
+DnbkKvbdsQVnjCvG
+EPDKjvbdyXiJapZk
+EPCkKvbdrzLosAgn
+DncLKvbdNsTugEuQ
+DoDLKvbdrykoraHn
+EObjjvbduaDySoFI
+DncKjvbdZHWdAOri
+EPCjjvbdlqxtysEJ
+DnbkKvbdOSsvHEtp
+DoDKjvbdRotGjGDw
+DoDKjvbdYfvdAOsJ
+DoCkKvbdBhjajiGK
+EObjjvbdCgLegAzc
+DoDLKvbdhtyeWrVC
+EOcKjvbdzitoocrt
+EOcKjvbdNVTSKmAX
+EPCjjvbdVYgsyjnn
+EObkKvbdliEUQuRa
+DoCkKvbdqFceUWAh
+EPDKjvbdIsZAsMxM
+DnbkKvbdUVlPjUBR
+DoDKjvbdbUafwjsh
+EObjjvbdQlxCZOUz
+DoCkKvbdQvnEDLhD
+EOcKjvbdUVlQKUBR
+EPDKjvbdehKvRnQg
+DoDLKvbdxmsIYTIc
+EObjjvbdsCGNLfkZ
+EObjjvbdmSYtzSdJ
+DoCjjvbdiMEcnVDZ
+EPCjjvbdypnlhiwA
+DoCjjvbdRyihTDWA
+DoCjjvbdZoOJEdzK
+DoCjjvbdJpzEoGOF
+DoCkKvbdYpmEiMeR
+EPCkKvbdbhljKfWx
+EPDLKvbdqYnggQcx
+EOcLKvbdwjwEHzyf
+EPCjjvbdLFegbAqV
+DoCjjvbdMoxQvNgT
+EPCjjvbdZsiIyETO
+DoDLKvbdZQmFImEq
+DnbjjvbdYkrDtOMN
+EPCjjvbdjggMGGOL
+DncLKvbdDwwlTstM
+EOcKjvbdCWzciFQW
+DoCkKvbdyYIiaozL
+DnbkKvbdNsTufeVQ
+DoDKjvbdjlakydfo
+EObjjvbdUGznLvue
+DoCjjvbdeFOqawDK
+DoCjjvbdZnmiFEyj
+EOcKjvbdVBCQrprZ
+EOcLKvbdrovOjCvG
+DncKjvbdrovPKCuf
+EOcLKvbdlYrqryHU
+EObkKvbdcyyPxZQb
+EObjjvbdnBivwnnV
+EObjjvbdjJehJlwr
+DnbkKvbdOFDtJIjd
+DnbjjvbdVAaqSqSZ
+EObkKvbdrXPkbiZR
+DoCjjvbdzaAPGfal
+DncKjvbdZQldhmEq
+EObjjvbdmoyxvLZC
+DnbkKvbdmpZxujyC
+DoCjjvbdvwLaWBWV
+DncLKvbdiVZdvquC
+DnbjjvbderBWzlDP
+EPCjjvbdjbkjpfuH
+DncLKvbdrafNLfkZ
+DncKjvbdrWokbhxq
+EPCkKvbdsZkosBHn
+EOcKjvbdidjfuPAO
+DnbjjvbdNGcPmQUk
+EPCjjvbdrJAKFNOe
+DnbjjvbdTukoitBR
+DnbkKvbdySmhlrCH
+EObkKvbdrXPkcIxq
+EOcLKvbdFejSOItR
+EObkKvbdmgExMnGy
+EPDKjvbdqrVLOLBN
+DoDKjvbdLAkHNCYR
+EObkKvbdVrOXbEkc
+DnbjjvbdEXwlUTsl
+EPCkKvbdyXhjBpZk
+EObkKvbdiifHjMxS
+EOcKjvbdEKHiuxKA
+EObkKvbdZLqdTmlN
+EObkKvbdWRnXaeLc
+DnbjjvbdWSNwaeMD
+DnbjjvbdfNGWgNKL
+DoDKjvbdoAKztIDn
+DncLKvbdmaivxOmu
+DnbjjvbdZLqcsnMN
+EObjjvbdcTDKscia
+EPCjjvbdOTTufeUp
+DoDKjvbdGdLVjBjK
+DncKjvbdcJNKLFvx
+EOcLKvbdTYKkmzjx
+EOcKjvbdZRMeImEq
+DoDLKvbdKQyePFnF
+DnbkKvbdNrtWGduQ
+EPCjjvbdatbHXjtI
+EPCjjvbdvwMAuaVu
+EPDLKvbdnQZxvLZC
+EObjjvbdtlYXAsaX
+DnbkKvbduDDVWvPP
+EPDLKvbdqTtGrSKt
+EObjjvbdxnSgwsJD
+EObjjvbdbKkenmcA
+EPCkKvbdFaOqYizm
+EOcKjvbdLGGHbBRV
+DoDLKvbdRzJhTCvA
+EPCjjvbdiMFDmtcZ
+DnbjjvbdWWhwvEEg
+EPCjjvbdJmAEZgVB
+DoCjjvbdmuVZjirG
+DoCjjvbdliEURUqa
+DoDLKvbdnCKWwnnV
+EPDLKvbdhgJbyViu
+DnbkKvbdjggMFfNk
+EObkKvbdEuxopMie
+EPDKjvbdssRsYydc
+DncLKvbdliDsqVRa
+EOcLKvbdLBKflbYR
+DncKjvbdzoPpeClY
+DncKjvbdqFdEsvBI
+DoCjjvbdZMRctOMN
+DncKjvbdDnbkLWcE
+EObkKvbdMfcQNPuL
+DoDKjvbdUWMPjTaR
+DnbjjvbdxmsHwsIc
+EObkKvbdrDdhonWB
+EPCkKvbdhgJcYvJu
+DoCkKvbdlYsSSyHU
+EPCjjvbdNdcsiJLE
+DoDKjvbdhlEcmuCy
+EObjjvbdJTZAsNXl
+EPCjjvbdznpQeClY
+DncLKvbdDxYMTssl
+DoCjjvbdkVwNcbXw
+EOcLKvbdMgDPlpUk
+EObkKvbdXsMAlsnx
+DnbkKvbdiBncEvqR
+EPCjjvbdeFPSCWcK
+DoDKjvbdmuUzKjSG
+EPDKjvbdqrUkNjaN
+DoDKjvbdhyuFlQnG
+EOcKjvbdDigivYKA
+DoDLKvbdJYUCHkqQ
+DncKjvbdACqwiyiQ
+EPDKjvbdEYXkstUM
+DoDLKvbdKDKCpicY
+DncLKvbdCDoaVjNG
+EObkKvbdxZhFexFS
+EPCkKvbdKDJcQjCx
+DoDLKvbdEPCkKwCd
+EPCkKvbdTfzmkwVe
+DnbjjvbduWOYJqTA
+DoCjjvbdcJMijfXY
+EPCkKvbdmaiwYPOV
+EOcKjvbddjJrVtzn
+EObkKvbdpstHSRjt
+EOcKjvbdyXiKCQZk
+DnbkKvbdIsYaSmYM
+DnbjjvbdwtmFQxlO
+DnbkKvbdYpleJMdq
+DoCjjvbdkNBkzFGo
+EOcKjvbdbsCkUEKB
+DoDKjvbdYlRctOMN
+DnbkKvbdjuwOECXw
+EPDKjvbdWRnXaeMD
+DncLKvbdkDLkQgVH
+DoDLKvbdFeiqnJTq
+EOcKjvbdzHYlAMeX
+EPCjjvbdJbjCpjDY
+EPDLKvbdzitopDsU
+DnbkKvbdziuPpDrt
+DncLKvbdySnImSCH
+DnbjjvbdySnImRbH
+DoCjjvbdKjaIWAJy
+DnbjjvbdTqRPUthN
+DoCjjvbdURQntuIN
+EObjjvbdQlxCYmtz
+EPDKjvbdMtsSLNAX
+EObjjvbdJbjDQicY
+DoDKjvbdEPCkKwDE
+EObkKvbdKQydoGNe
+DoDLKvbdVwJXuceH
+EObjjvbdnUtykJrG
+DncLKvbdwMvANEEm
+EPDKjvbdpyPHgQdY
+DnbjjvbdUVkpKUBR
+EOcLKvbdhfjCyVjV
+EPDKjvbddoFTKstS
+EPCkKvbdANHyTXZx
+EPCkKvbdUxhTyjoO
+EObjjvbdkVwNdBxX
+EPDKjvbdDoCjjvbd
+DnbkKvbdWWhwudEg
+DnbkKvbdyTNiMrCH
+DoDLKvbdelewGljL
+DncLKvbdUGznMWue
+DncKjvbdwygfFwdr
+EPCkKvbdJqZePFnF
+DnbjjvbdNsTugEuQ
+DoDKjvbdQcbaPqDr
+DncLKvbdfMevgNJk
+DncLKvbdlrZVZrdJ
+DoCjjvbdFjeTCglu
+DnbjjvbdYqNFImEq
+DoCjjvbdsCGMkfkZ
+DncLKvbdhuZdwSUb
+DoCkKvbdrXPkbiZR
+DoCjjvbdZRMdiMdq
+DoDKjvbdemFvgMjL
+DoCjjvbdygZMANEw
+EOcKjvbdZRMeIldq
+EObkKvbdiHJcZWKV
+DncKjvbdCJKbKiFj
+EObjjvbdzROlhjXA
+DnbjjvbdDoDLKvbd
+EPDLKvbdVYgtZjnn
+EObkKvbdDoCjjwDE
+DnbkKvbdrouoJbuf
+DoCkKvbdyTOImRag
+EPDKjvbdBcpBVilf
+DoCjjvbdCWzdJFQW
+EPCkKvbdbrbjscjB
+EOcLKvbdwkWdHzzG
+EPDKjvbdnGeXlnGy
+EPCkKvbdznpREcLx
+EPCkKvbdZMRcsnLm
+EOcKjvbdJSyArmXl
+DnbkKvbdZMSDtNkm
+EPDKjvbdAMgySvzY
+DoDLKvbdyYJJbPzL
+DoCkKvbdLAjgMaxR
+DoDLKvbdWIXuxGxz
+DoCjjvbdqwQLbiYq
+DnbkKvbdpyPIHQcx
+EOcKjvbdfNGXHNJk
+DncKjvbdqYnhHQdY
+DncKjvbdeEnrBvcK
+EPDKjvbdZjTHpGaf
+DoDLKvbduoTzqLPU
+DnbkKvbdIjEAJofd
+DnbkKvbdxnSgxTJD
+DoDLKvbdXsLaMsnx
+DnbjjvbdaRfDHsek
+DoCkKvbduLwwAtBX
+DnbkKvbdrpWPJcVf
+DoDKjvbdrbFlkgLZ
+DoCkKvbdlqxtyrdJ
+EObkKvbdRyihSbvA
+EObkKvbdWRnYCFLc
+DoCkKvbdOEcshhjd
+DnbkKvbdZjTHpHBf
+DnbjjvbdcyyPwxpb
+DncLKvbdkVvmdCXw
+DncLKvbdcScKtEJa
+DnbjjvbdrSVLOLBN
+EObkKvbdiGjDYvKV
+EPCkKvbdEJgjVwjA
+DnbkKvbdRosgKFdX
+EPDLKvbdcScKtDia
+DoCjjvbdtbcVXVno
+DncKjvbdhgJbyViu
+EPCjjvbdjJehKNYS
+EObkKvbdyOTIYTJD
+DnbkKvbdRaceMJYk
+DoCkKvbdqiAKEmOe
+DoDLKvbdEKHiuwjA
+EObkKvbdxUldpxkn
+EObkKvbdFejRmhtR
+DncLKvbdSBcdlIyL
+EPCkKvbdxZhFexFS
+EObjjvbdwjwEHzzG
+EPCjjvbdmRxtzSdJ
+EPDLKvbdEvYooljF
+DoCkKvbdmgFXlmfy
+DoCjjvbdtkxXBTaX
+EObkKvbdmgExMnHZ
+DncLKvbdjvXODaww
+DoCkKvbdSCEFMIyL
+EPDKjvbdVYhTykOn
+DoDLKvbdNsUVgFUp
+DncKjvbdRXOEClID
+DoDKjvbdnVVZkKSG
+DoDKjvbdWWhxVcdg
+EPCkKvbdwuNFQxlO
+DncLKvbdKeegbBRV
+DncLKvbdUWLpJsaR
+EOcLKvbdNxOuzcmt
+EObjjvbddwzUUSFz
+DoCjjvbdJXtBhMQp
+DoCkKvbdLGFgbBRV
+EOcLKvbdcJMjKewY
+DnbjjvbdxUmEqYkn
+DnbkKvbdjbkjqGtg
+EPCkKvbdIHGzYwwg
+DnbjjvbdrpWOjCvG
+DoDKjvbdZMRctNkm
+DnbkKvbddZyPwxqC
+DoCjjvbdtcDVWuno
+DoCkKvbdJcKDRJcY
+EOcLKvbdmbKWwnnV
+EPDKjvbdcasNSAUN
+EPCkKvbdUaBpsQqy
+EObkKvbdJutedFHJ
+DoDLKvbdBhjakJFj
+DnbkKvbdnUuZjiqf
+EPDKjvbdpxoHgQcx
+DnbjjvbdZjTHofbG
+EObkKvbdkxsSSxgU
+DnbjjvbdWRmwbElD
+DoCkKvbdRkZFuGjs
+EPCkKvbdwNWANDdm
+EObjjvbdTkvPBVni
+DoDKjvbddndrkTtS
+DncLKvbdZtJIxdSn
+EOcLKvbduaDyTOeI
+EOcKjvbdxZgfGXdr
+EOcLKvbdkySrTZGt
+EPDKjvbdVwJXucdg
+EPDLKvbdatagYLUI
+DoCjjvbddZxpYZQb
+EPDKjvbdtunXjRTA
+DoDLKvbdWSOYBeMD
+DoCjjvbdHlBznXRL
+EPDLKvbdcyxpXxpb
+DnbjjvbdAMhYsWzY
+EObjjvbdraemLgKy
+EPDKjvbdJpzFOenF
+DoCjjvbdZnnIeEyj
+DoCjjvbdrWpLbiZR
+EOcKjvbdLqwMytpz
+DncKjvbdKQzEoFme
+EPDKjvbdZRMeJMeR
+DncKjvbdEuxpPlie
+EOcLKvbdFWYpPlie
+EOcLKvbdjblKpgUg
+EOcLKvbdiBnbdwQq
+DoDLKvbdOTTufeVQ
+EPDKjvbdpyOggQdY
+DnbkKvbdGBOqYizm
+EObjjvbdRjxfUfkT
+EPCjjvbdUMVoAuoJ
+DoDLKvbdVwJXvEEg
+EObkKvbdnCKXXoOV
+DoDKjvbdNPxRVmgT
+DncLKvbdZsiIxdSn
+EPDKjvbdjlalZeHP
+DoDLKvbdeFPSBvbj
+DoDKjvbdVqnXbFMD
+DncKjvbdHffyyYYH
+EOcLKvbdBhjbLJFj
+EPDKjvbdJvVGEFHJ
+EOcKjvbdgQBzvdYI
+EPDLKvbdpyOggRDx
+EObjjvbdKQyeOfNe
+EPCjjvbdtcCtwVno
+EPCjjvbdQvmdClHc
+DnbkKvbdyXiKBoyk
+DncKjvbdqTsgSSLU
+EObjjvbdyNrgxShc
+DnbjjvbdRkZFuGjs
+EObjjvbdYfvdAOri
+DoDKjvbdkMbMZeGo
+EPDLKvbdCIjbLIej
+DoDKjvbdHffyxwwg
+EPCkKvbdGdLVibJj
+DoCkKvbdaaVdepQX
+DnbkKvbdSQUGifDw
+EPCkKvbdqYngfpdY
+DnbkKvbdxUleQyLn
+DoCjjvbdqlyixkgi
+EPCkKvbdjgfkfGNk
+EObjjvbdeFOqavbj
+DoDLKvbdYkrDtNlN
+DoCkKvbdjhGlFenL
+EPCjjvbdijFhJmXr
+EObjjvbdnGeYMmfy
+EOcLKvbdbhmJjfXY
+EOcLKvbdLBKfmCYR
+DncLKvbdJSxaSmXl
+EPCjjvbdsQVnicWG
+DoDKjvbdjhHLfFnL
+EObkKvbdjuwOEBww
+DoCjjvbdiBncEvpq
+EOcLKvbduLxWaUAw
+DncLKvbdhuZdwRtb
+EOcKjvbdjvWnECXw
+EObkKvbdZeYGzghb
+DoDLKvbdNQYQumgT
+DoDKjvbdJpydoFnF
+EPCkKvbdRjyFuGkT
+DnbjjvbdraelkgKy
+EObjjvbdfNGXHMjL
+DoDLKvbduWNwiqTA
+DncKjvbdnVUzLJrG
+DoDLKvbdehKvSOQg
+EPDLKvbdwtmFRYkn
+DoDKjvbdKfFgaaQu
+DncKjvbdCTBDTfXS
+EObjjvbdDoCjjwCd
+EPCjjvbdYTMAmUOx
+EOcKjvbdiMFDnVCy
+EObkKvbdjlalZeHP
+DnbjjvbdCJLCLIfK
+DoDLKvbdZMRdUNkm
+DnbjjvbdURRPVUgm
+EObjjvbdJcJbpibx
+EObkKvbdrWpMDJZR
+EObjjvbdjuwNdBxX
+EPCjjvbdbBVdfQQX
+EPCjjvbdKRZeOfOF
+DoCkKvbdKDKCqKCx
+DoCjjvbdkVvmdBxX
+EPDKjvbdvAdYroEh
+EOcLKvbdtcCuXWPP
+EPCjjvbdczZQXxpb
+DncKjvbdUxhUZkPO
+EObjjvbdlrYtysEJ
+DncLKvbdcScLUDia
+EPDKjvbdBsAbsevr
+DoDLKvbdqTtGqrLU
+DoDKjvbdSCEFLiYk
+EPCjjvbdRWmccLgc
+DncLKvbdNQYQunGs
+EObkKvbdmbKXYPNu
+EPCjjvbdfMewGmKL
+EObjjvbdzROmIiwA
+DnbkKvbdliETptqa
+EPDKjvbdHlBznWpk
+DoCkKvbdUaBpsQqy
+DoCkKvbdWSOYCFMD
+DoDLKvbdxmrhYTIc
+DncLKvbdLAkGlbYR
+DncKjvbdlhctRUqa
+DoCjjvbduDCtwVno
+DnbkKvbdIjEAKQHE
+DnbjjvbdiLddNuCy
+EPDKjvbdEXwktUTl
+EPCjjvbdyNrgwsJD
+EObkKvbdnPzYujxb
+EPDKjvbdznoqEcMY
+EPDKjvbdZRNEhleR
+DoCjjvbdGQATXHFy
+EPCjjvbdyqPNIiwA
+EOcKjvbdkxrrTYgU
+EOcKjvbdcImKLFvx
+DoCkKvbduoTzpkPU
+EPCjjvbdJXtCIMQp
+EOcKjvbdrpVoJbvG
+DncLKvbdqZPIHRDx
+DnbjjvbdTAFJHand
+EOcKjvbdtcCuWuno
+DncLKvbdfIKurNqH
+DncKjvbdLrWmZtpz
+DoDLKvbdMtsRjmAX
+EObjjvbdLGGHbBRV
+EObkKvbdCWzchePv
+EOcKjvbdZxcjODMS
+EObkKvbdzaAPGgBl
+DoDLKvbdKVtecdgJ
+DnbjjvbdHDjvJbJj
+EPCjjvbdLiCLqYAS
+EPDLKvbdFVxpPmKF
+DoDLKvbdZisIPgBf
+DncLKvbdTppoUtgm
+DnbjjvbdpyPIGpdY
+DoDLKvbdEztRElCi
+DncLKvbdHgGzZYYH
+DnbjjvbdZLqctOMN
+DnbkKvbdqTtGqqkU
+DnbjjvbdiMEcnVCy
+EPDKjvbdvBDxrneI
+DoDKjvbdemGXHNJk
+DoDKjvbdhficYvKV
+EObjjvbdegkWSOQg
+DoDLKvbdOFDtIiKd
+EPCjjvbdBdQAuimG
+DoCjjvbdpyPHgREY
+DncKjvbdJXsbHkpp
+DoDKjvbdRbEElIxk
+DoDKjvbdsQWPJcWG
+EObkKvbdsCGNLfkZ
+EOcLKvbdzaAPGgCM
+EObkKvbdzjUoodSt
+DnbkKvbdemFvgMjL
+DnbkKvbdWWhxVcdg
+DncLKvbdxrmiMqag
+EPCkKvbdMSWlytpz
+EObjjvbdwNWAMdFN
+EPDLKvbdlrYtzTEJ
+DnbjjvbdVqnYBeLc
+DncKjvbdnHEwmOGy
+DnbjjvbdtbbuWvPP
+DncKjvbdmIcspuSB
+EObkKvbdEOcKkXCd
+EOcKjvbdDncKkXCd
+EPDLKvbduaDxrndh
+DoCjjvbdOFDshhkE
+DnbkKvbdRaceLhyL
+EPCkKvbdZshhyDrn
+DoCjjvbdCSaDTfWr
+EOcKjvbdqUTfrSLU
+EPDLKvbdtTRryZdc
+DoDLKvbdkyTRsZGt
+EPDKjvbdyqPNIjXA
+DoCkKvbdNUrrKmAX
+DoCjjvbdSCDeMIxk
+EObkKvbdkMbLzEgP
+DncKjvbdEvZPpMie
+DoCkKvbdyYIibQZk
+EObkKvbdNPxQumfs
+EOcLKvbdDncKjvbd
+EPCkKvbdozmcjxPA
+EPDKjvbdCIkCLIfK
+DncKjvbdcyxoxZRC
+DoCkKvbdeOdrkUUS
+DoCjjvbdhzVFlQnG
+EObjjvbdOFETiJLE
+DncKjvbdhyuGLqNf
+EObkKvbdRWmdClID
+DoCjjvbdFpATWgFy
+DnbkKvbdlqxtysDi
+EObjjvbdqmZjYkhJ
+DoDKjvbdZyDjODMS
+DoCjjvbdEJhJvYKA
+EOcKjvbdqTsgRrLU
+EOcKjvbdZsiIxcrn
+EObkKvbdIHGzZYYH
+EPDKjvbdHgGyxxXg
+EObkKvbdxmrgwriD
+EPCkKvbdxrnJNSBg
+DnbkKvbdjhGkefOL
+EPCjjvbdKQydoGNe
+EOcKjvbdqvpMDJZR
+EObjjvbdQdDBQQdS
+DoDKjvbdSKxfVHKs
+DoDKjvbdbLLeoODA
+DoDLKvbdBsAcUGWr
+DoCjjvbdRzKHrbvA
+EObjjvbdfMfXGljL
+EObkKvbddeOrCWbj
+DoDKjvbddjJrVtzn
+DoDLKvbdhtydvqtb
+DnbjjvbdRNXayOUz
+EPDLKvbdRjyFtgKs
+EObkKvbdsPuoKCvG
+EPCkKvbdYqNEiNFR
+DncKjvbdUxgsyjnn
+EPCjjvbdZRMdhldq
+DoDLKvbdEJhKWXjA
+DoCkKvbdQwODblID
+EPCkKvbdssRrxzFD
+DnbjjvbdZxdKOCkr
+EObjjvbduCcUwVno
+EOcKjvbdmuUzLKRf
+EPCjjvbdfpBzvcwh
+DnbjjvbdMowpvNfs
+EPDKjvbdGLErcHmV
+EPDLKvbdZoOIeEyj
+DncLKvbdSLZGUgKs
+DncLKvbdlqyUzTEJ
+EPCjjvbddePRawDK
+DncKjvbdHEKvKCJj
+DoDKjvbdeEnqavcK
+DoDLKvbdtSrTYzFD
+EPDLKvbdxUmFQxlO
+DnbjjvbdLLBIWAJy
+EOcLKvbdMowqWNfs
+EPDKjvbdptUGrSKt
+DoDLKvbdHEKvKCKK
+EPCjjvbdJcJbpjDY
+DnbjjvbdMuTRkNAX
+DnbkKvbdEzspdlDJ
+DncLKvbdVUMsekvK
+EPDKjvbdOTUVgEtp
+DncKjvbdAMgySwZx
+DoCkKvbdwtmFRYkn
+EObjjvbdIjEAKPgE
+EPDKjvbdRpTfjGEX
+DncKjvbdFjeSbglu
+EObkKvbdjFLGtoAO
+DoCkKvbduWOYJqTA
+EPCkKvbdVAapsQrZ
+DnbjjvbdVwJXudEg
+DoDLKvbdUtMsfLvK
+EPCjjvbdHELVjBij
+DncKjvbdRWnECkhD
+EPDLKvbdZsiJZDsO
+DncLKvbdnPzZWLYb
+EPCjjvbdznoqEcMY
+EOcKjvbdzoQQeDMY
+DnbjjvbdznpQdbkx
+EPDKjvbdeYZtTrFz
+DoCkKvbdkySrTZHU
+DncKjvbdCSaDUGXS
+DoCkKvbdcJNJjfXY
+EOcLKvbdCEQAvJlf
+EPDKjvbdyzdmqhJI
+DncLKvbdNPwpvNgT
+DoDKjvbdqmZixkgi
+EOcKjvbdVYhUZkPO
+EObkKvbdhgJbxvJu
+DoDKjvbdUQqPUuHm
+DncLKvbdqvolChyR
+EPCkKvbdEXxMTssl
+DnbkKvbdHgGzYwxH
+DoDLKvbdIidAJpGd
+DnbkKvbdZLqdUOMN
+DnbkKvbdGckViaij
+DoCkKvbdFVxopNJe
+EOcLKvbdRbEFMIyL
+EObkKvbdLAjflawq
+EObjjvbdziuPodTU
+EPDLKvbdQwNdCkhD
+EPCjjvbdZxdJmcLr
+EPDLKvbdxrmhlqag
+DoCkKvbdSPsgJfDw
+EPCjjvbdkDLjpgUg
+DnbjjvbdtbcUwWOo
+DnbkKvbdWIXuxHYz
+EObjjvbdEvYpQMie
+DoDLKvbdIHGzZXxH
+EPDLKvbdVYgszKoO
+DncKjvbdhancEvpq
+EPCjjvbdcJNKKewY
+EPDKjvbdWWhwvEEg
+EOcLKvbdvAdYsOdh
+EObkKvbdcyyPwxqC
+EObjjvbdSPtGifDw
+EOcLKvbdkMalZeHP
+EPDKjvbdYlRctNlN
+DoDLKvbdKWVGEFGi
+DncLKvbdMgColouL
+DncLKvbdhbPCeXRR
+DncLKvbdDwxMTstM
+DoDKjvbdvAcySndh
+EObkKvbdXGYytAPT
+DoCjjvbdmuVZjjRf
+EOcLKvbdDGlFgAzc
+DoDKjvbdiBncFXRR
+DoDKjvbdkaMnmALA
+DncKjvbdVBCQrqSZ
+DoCkKvbdVviYWEFH
+EObkKvbdAMhZSwZx
+DoDLKvbdeAUQlwjG
+DoDLKvbdZxcjODMS
+EOcLKvbdrpWPKDVf
+EPCkKvbdWRnYCFLc
+DnbkKvbdKeehBaRV
+DoDKjvbdMSXMzUpz
+EOcKjvbdRkZGVGjs
+DoDLKvbdFkFScIMu
+DoCjjvbdZjTHogBf
+DnbkKvbdnBivwnmu
+EOcKjvbdCTAcTevr
+EOcKjvbdVviXvDeH
+DoDLKvbdliDsptqa
+EPDLKvbdZirgpGaf
+EPCjjvbdaRfChUFk
+EPCjjvbdkClKqGtg
+DoCjjvbdKQyeOfOF
+EPCkKvbdqvpLbiYq
+DnbjjvbdCTBDTfXS
+DoCjjvbdOEctIhkE
+EObjjvbdbVCHXkUI
+DncKjvbdxnTIXrhc
+DnbjjvbdezvYdhsw
+EPCjjvbdDwwkstUM
+EPCkKvbdaaVdepQX
+DoDLKvbdjlbMZeHP
+DoDLKvbdqAiFAXHd
+EPDLKvbdGLEsCglu
+EPCjjvbdZyDinClS
+EPCkKvbdSLYeuGkT
+EPDKjvbdwyhGFweS
+EOcLKvbdjJfIKNYS
+DoCjjvbddeOrCXCj
+DoDKjvbdkxrqsZHU
+EOcKjvbdGYuVBEYC
+DncKjvbdHkazmvqL
+DnbkKvbdZsiIxdSn
+EObkKvbdhanbeXQq
+EOcLKvbdMpXqWNfs
+DnbkKvbdEztQdkcJ
+EPCjjvbdDjHjWXjA
+EOcKjvbdNQYQvNgT
+EPCkKvbdNHCpNPtk
+DoCjjvbdbsCkUDjB
+EObkKvbdOStWGeUp
+EOcKjvbdVqnYBdlD
+DoCkKvbdvlvANDeN
+DoDKjvbdnQZyWKyC
+EOcLKvbdkyTRsYft
+EOcKjvbdnVUyjiqf
+EPCjjvbdXnRAXtut
+EPDKjvbddZxpXxpb
+EPDLKvbdfHjvSOQg
+DncKjvbdXsMBNTnx
+DncKjvbdEARiMzXX
+EPCjjvbdOStVgEuQ
+DnbjjvbdHELWKCKK
+EOcLKvbdehLWSOQg
+DncLKvbdYkqctOLm
+DoDLKvbdxsOJMqbH
+DoCjjvbdzGyMANFX
+DoCjjvbdSCEElJZL
+DoDKjvbdRkYeuHLT
+EOcKjvbdXsLaMsnx
+DnbjjvbdePFSkUUS
+DncKjvbdGZUuAdXb
+EOcLKvbdlZSqsZGt
+DncKjvbdiCPCdwRR
+EObjjvbdjvXOEBxX
+EPDLKvbdRXOEDMHc
+EPCkKvbdZisIQHCG
+EPDKjvbdjKGIKNYS
+DncLKvbdWWiYVdEg
+DnbjjvbdaMkBruNH
+EOcLKvbdOFEThiKd
+DoCkKvbdVZHszLPO
+DoDKjvbdiHJcYvJu
+EPCkKvbdwuNFRZLn
+EObkKvbdJqZdoGNe
+EOcKjvbddndsLUUS
+EOcLKvbdBraCtGWr
+DncLKvbdxrnJNRbH
+DoDLKvbdCWzciFPv
+EPCkKvbdtlXvaUAw
+DoCjjvbdMfbomQUk
+DoCjjvbdfoazwDxI
+DoCkKvbdauCHXkUI
+DnbjjvbdaogHELzd
+EPCjjvbdTulPisaR
+EPCkKvbdOSsvHEtp
+DoDLKvbdTkuoBVni
+EPDKjvbdVBBqTRSZ
+DnbjjvbdEJgivYKA
+DncKjvbdJXtBgkqQ
+DnbkKvbdbsCjsdJa
+EPCjjvbdhlEcnUby
+EObjjvbdssSSyZdc
+EObkKvbdhgKCyWJu
+EObkKvbddeOqbWcK
+DoCkKvbdqvpLcJYq
+EPDKjvbdxZgefXeS
+EOcLKvbdkVwOEBww
+EPDKjvbdemFvfljL
+EPCjjvbdFkErcIMu
+EOcKjvbdZyEKNcMS
+EPDKjvbdqlzJxlHi
+EPCjjvbdmbJwXnmu
+EOcLKvbdcTDLTcia
+DoCkKvbdyzdmqhJI
+DnbjjvbdGdLWKBij
+DoDKjvbduaDxsPEh
+DoDKjvbdZshhxdTO
+DncKjvbdptUGqrKt
+EPCjjvbdJvVFceGi
+EOcKjvbdddoRawDK
+DoCkKvbdfMfXHMik
+EObjjvbdVAbRSpqy
+EObkKvbddZyPxYpb
+DnbkKvbdVYgszKnn
+DoCkKvbdZMRdUNkm
+EObjjvbdTvMPitBR
+EObkKvbdIxTaglQp
+EObkKvbdGGKSNiUR
+DoCkKvbdGBOpyJzm
+EPCjjvbdqrUjmjaN
+DncKjvbdIMBzmvpk
+EPCjjvbdcyxoxYpb
+EOcKjvbdmIcsqUrB
+DoCkKvbdqvolChyR
+EPCjjvbdkHgMGGOL
+EPDLKvbdpaIeAWgd
+DncLKvbdqvokcIxq
+EOcKjvbdZsiJYcrn
+EObkKvbdyYJKBpZk
+DoCkKvbdKDKDQicY
+EObkKvbdlhdTptqa
+EObkKvbdyXhjBpZk
+EObkKvbdKNAEZfta
+EOcLKvbdRyihTCvA
+DncLKvbdtcCtwVno
+DnbjjvbdVZITykOn
+DoCjjvbdJSyArlwl
+EPDKjvbdDxYLtUUM
+EPDKjvbdvlvANEFN
+DoDKjvbdrykpTAgn
+DnbjjvbdeYZtUSFz
+DoDKjvbdzjVQQETU
+EObjjvbdiHJbyVjV
+DoCjjvbdcScLTcjB
+DncLKvbdhaoDEwQq
+DnbkKvbdQlwbZNtz
+EPCjjvbdEARiMzXX
+EPCjjvbdGFjSOIsq
+DoDKjvbdrXPlChxq
+DoDLKvbdYqMeImEq
+DoDKjvbdOFETiJKd
+EPCjjvbdCTBDUFvr
+DoCkKvbdZoOIdeZj
+DncLKvbdHgHZyYXg
+EOcLKvbdCSaCsevr
+DoCjjvbdsQWOjCuf
+DoDKjvbdKWUfDeGi
+EOcKjvbdzitpPcrt
+EPDKjvbdZyDimcMS
+EPCjjvbdBcpAuilf
+EOcKjvbdqwQMCiYq
+EOcLKvbdsrrTZZdc
+EObjjvbdSQUHKGEX
+DoDLKvbdcyxoxZRC
+EObkKvbdWXJYWEFH
+DnbkKvbdhgKDYuiu
+DoDKjvbdrSVLOKaN
+EPCjjvbdMoxQumgT
+EPDKjvbdcbTMrATm
+EPDKjvbdznopdcMY
+DnbjjvbdzdzOzdyp
+EObjjvbdGYuVBEXb
+EPDKjvbdiZtekpnG
+DoDLKvbdvvlAuaVu
+DoDKjvbdEYXkstTl
+EPCjjvbdauCHYKsh
+DoCjjvbdDjIJuwjA
+EObjjvbdkNCLzFGo
+EPDLKvbdiGicZWKV
+EPCkKvbdtlXvaTaX
+DoCkKvbdpyOggQcx
+EObjjvbdtTSSyZdc
+DoDLKvbdiZtelROG
+EOcLKvbdWRnYCFMD
+EPDLKvbdNddUIhjd
+DncLKvbdEObjjvbd
+EPDLKvbdVUNTelVj
+EPCjjvbdVhXvYGxz
+DoCkKvbdfRaWzkbo
+DoCjjvbdRjyGVHKs
+DoCjjvbdSKxfUfkT
+EOcKjvbdaRecITek
+DoCkKvbdEJhKVwjA
+DoDLKvbdwXLaWBVu
+EPDLKvbdLYqJrztf
+DncKjvbdUMVoAuoJ
+DnbjjvbdvmWAMcdm
+EObjjvbdpssfqrKt
+DnbjjvbdhlEcnVDZ
+EOcKjvbdNsUWGeVQ
+EObjjvbdVUNTekuj
+DnbkKvbdVYgsykOn
+EObkKvbdpssgSRjt
+DncKjvbdVZITzLOn
+DoDKjvbdGGJrNiTq
+DoDLKvbdACqwizJQ
+DoDKjvbdIryArmXl
+DoCkKvbdZMRdTmlN
+DnbkKvbdrovPKDVf
+EObkKvbdrounjDWG
+DnbjjvbdCSaDTevr
+DnbjjvbdUyITyjnn
+DnbkKvbdKRZeOfOF
+DoCkKvbdDigiuxKA
+EOcKjvbdxsNhlrCH
+EOcLKvbdDjHiuxKA
+DncKjvbdXmqAXtvU
+DnbjjvbdqFdFTvAh
+EObkKvbdxrmhmSBg
+DoCjjvbdIidAKPfd
+EOcKjvbdKQydoGOF
+DnbjjvbdlqyUzSdJ
+EPDKjvbdtvOYKQsA
+EPCkKvbdcIljLFvx
+DoCjjvbdYqNEhldq
+EPDKjvbdczYpYZRC
+DoDLKvbdiBoCeXQq
+EOcLKvbdiCPDFXRR
+EPDLKvbdZisHofaf
+EPDKjvbdmIdURVSB
+EPDKjvbdZRNFIldq
+DoDKjvbdJpydoFme
+DoDLKvbdWWhwudEg
+DncLKvbdDnbjjwDE
+DncKjvbdqTsfqqkU
+DncKjvbdKDKDRKDY
+DoDKjvbdTulQJsaR
+DoCjjvbdSBdFMIyL
+DncLKvbdqTtHSSKt
+EOcKjvbdBcoaVjMf
+EObjjvbdiiehKNXr
+EObjjvbdCWzciFQW
+EPDLKvbdWSNwadlD
+EPDKjvbdKVuGEFHJ
+DoCkKvbdZMRdUNlN
+EPDKjvbdZRMdiMdq
+EPCkKvbdxUmEpyMO
+DoDLKvbdRkYfVHKs
+EObjjvbdIwtCIMQp
+EPDKjvbdmJDsqUqa
+EPDKjvbdrDeJPmvB
+EOcKjvbdTvMPisaR
+DncKjvbdMtsRjmAX
+DnbjjvbdlqyUysDi
+EPDKjvbdQwNdClID
+DncLKvbdRjxfVGjs
+EObkKvbdauBfxKtI
+DoDLKvbdiZtfLpnG
+DoDKjvbdhancFXRR
+DoDKjvbdREDBQQdS
+EObjjvbdrzMQTBIO
+EOcKjvbdcImKKfXY
+DoDLKvbdijGIKNXr
+DncLKvbdgGMZmfgA
+EPCjjvbdZnmheFZj
+EPDKjvbdmuVZjiqf
+EObjjvbdeFPRawDK
+EPDLKvbdrNZiyLhJ
+EOcKjvbdlhdURUrB
+EPDLKvbdGGJrNhtR
+EOcKjvbdiGibyWKV
+EOcKjvbdQlwbZNtz
+DncLKvbdnVUzKiqf
+EOcKjvbdbsDKscjB
+EPDLKvbdDnbjjvcE
+DoCkKvbdySmhmRag
+DncKjvbdkyTSTYft
+DoDLKvbdEYXkstUM
+EOcKjvbdiHJbyVjV
+EOcKjvbdsQVnicWG
+DoCkKvbdoznDkYPA
+EObkKvbdURQoVVHm
+EPDLKvbdFfKSNiTq
+DnbjjvbdVgxVwgYz
+DnbkKvbdmfeYNOHZ
+DoDKjvbdyqPNIiwA
+EObjjvbdFVyQPlie
+EOcLKvbdGdKvKBij
+EPCjjvbdDwxMUTtM
+DoCkKvbdKVtfEEfi
+DoCkKvbddjKRvUzn
+EObkKvbdliEURVSB
+EPDLKvbdWSNwaeMD
+EOcLKvbdJqZdoFnF
+DnbjjvbdKxqJrzuG
+DnbjjvbdmuUyjjSG
+EPDLKvbdADRxKZhp
+EPCkKvbdiCPDEwRR
+EObjjvbdTXkMNzkY
+DnbjjvbdMgDPlouL
+EPCjjvbdyzeNqghh
+EOcKjvbdmuUyjjSG
+EPDKjvbdDoDLKvcE
+EPDLKvbdNxPVzdNt
+DoDKjvbdBhjbKhfK
+DnbjjvbdZLrETmlN
+DoCkKvbdHffyxwwg
+EOcKjvbdYSlAmUPY
+EPCjjvbdtTSTYzFD
+DoCjjvbdFjeTCgmV
+EObjjvbdNwnuzcnU
+DoDLKvbdSPsfiecw
+DoDKjvbdKVtedFGi
+EObjjvbdUaCQsRRy
+EObkKvbdbsDLUDjB
+EObkKvbdEOcKjvcE
+EPCjjvbdyNsIYShc
+EOcLKvbdbVCGxKsh
+DoDKjvbdlZSqsYft
+DoCjjvbdUslselWK
+DncLKvbdbUbHXkUI
+DnbkKvbdYkqcsmkm
+DncKjvbdXsMAmUOx
+DoDKjvbdJuuFcdgJ
+EOcLKvbdGLFTChNV
+DoCkKvbdaaWEfQQX
+DncKjvbdVqnXbFMD
+EOcKjvbdZyEJnClS
+DoCkKvbdNdctJIjd
+DoDLKvbdmaiwYOmu
+EPCkKvbdmbJvxPOV
+DncLKvbdTqRPUuIN
+EPDLKvbdGGKSNiUR
+EPCjjvbdIwtCIMQp
+EOcKjvbdHDjvJajK
+EOcLKvbdZyEJnDMS
+DnbkKvbdrWpMDJZR
+EOcLKvbdbUagXjtI
+EOcLKvbdLGFgbBRV
+EOcKjvbdqvpMDIxq
+EPDKjvbdOAJSsjSA
+DncKjvbdsrqsYyeD
+DnbjjvbdtkwvaUBX
+DnbjjvbdGQASwGfZ
+EObkKvbdURROtuIN
+EObkKvbdiUydwRtb
+EOcLKvbdqlyixkhJ
+EPCkKvbduaEYroFI
+DoCkKvbdnUtyjiqf
+DoCkKvbdssSTYzFD
+DncLKvbdeATqMwjG
+DnbkKvbdqlyjYlHi
+DncLKvbdTAEhhCOd
+EOcLKvbdpxoIHQdY
+EPDKjvbdEXxLsstM
+DncLKvbdbLLfPNcA
+DoDLKvbdCWzdIeQW
+DnbjjvbdWSNwbElD
+DoDKjvbdGFjSOJUR
+DoCjjvbdmttzKjRf
+EPCjjvbdqmZjZMHi
+DncLKvbddwzUTqez
+EObkKvbdrEFIpOVa
+DnbjjvbduMYWaTaX
+EPDKjvbdTAEiIBoE
+EOcKjvbdVrNwaeMD
+DoCjjvbdSwkMNzjx
+DoDKjvbdZoNheEyj
+EObjjvbdFpASvgGZ
+DnbkKvbdvBDxsPEh
+DoDKjvbdIHGzYxYH
+EOcLKvbdhanbeXQq
+EObkKvbdACqxJyhp
+DoDLKvbdgQBzwDxI
+EObjjvbdOYOuzdNt
+DnbjjvbdRWmdDMHc
+EPCkKvbdePFTLUUS
+DnbkKvbdHlBznWpk
+EPCkKvbdqlyixlIJ
+DnbjjvbdIHHZyYXg
+EObjjvbdBcoaVimG
+EOcLKvbdZnnIddzK
+DnbjjvbdBiLBjhfK
+EPDLKvbdeOeTKtTr
+EObkKvbdYlRcsnLm
+DoDKjvbdnHExNOGy
+DoCkKvbdnCJwXoNu
+EOcKjvbdwWlBWBWV
+DnbjjvbdGYuVAdXb
+EObkKvbdLGGHbBQu
+EPCkKvbdEJgjVxKA
+EObkKvbdlqyVZrdJ
+EObkKvbdaNLBsUmH
+EPCkKvbdGQASwHGZ
+DncLKvbdnBjWwnnV
+DnbjjvbdUslsekuj
+DncLKvbdeATqNYJf
+EOcLKvbdIwtCHlQp
+EOcLKvbdGLErcIMu
+DnbkKvbdjvXOECXw
+EPCkKvbdfSAvzkbo
+DnbjjvbdsCGNMHKy
+DoDLKvbdURQnuVHm
+EObjjvbdQvmdCkgc
+EPCjjvbdSPsgKFcw
+EPDLKvbdYpmEhleR
+EPCjjvbdFjdsDHlu
+EPDLKvbdqdFIpOWB
+EObjjvbdnQZyVkZC
+EPCjjvbdQdCaQRES
+DnbjjvbdADRwiyiQ
+DnbjjvbdiiehKNYS
+DoCkKvbdHkaznWqL
+EObjjvbdmoyxujxb
+EOcLKvbdxxIibQZk
+EObjjvbdsPuoKCvG
+EObjjvbdjcMKpftg
+EOcKjvbdZisHofbG
+DncLKvbdUGznLwWF
+DoDLKvbdFfJqnJUR
+DnbjjvbdsBelkgLZ
+DoCkKvbdrbGNLfkZ
+DncKjvbdeYZssqez
+EPCkKvbdyNsHwsIc
+DnbkKvbdrafMkfjy
+EPCjjvbdZyEJnDMS
+DnbjjvbdFpASwGey
+DnbkKvbdLGGIBaQu
+DncLKvbddiiqutzn
+DncKjvbdWIXuwfxz
+DoCjjvbdNPxRVnHT
+DncKjvbdwygefXeS
+EPDLKvbdmJEUQtrB
+EPCjjvbdQwOECkhD
+DoDLKvbdNGbpMotk
+DncLKvbdRyjIScWA
+DncLKvbdVrOXaeMD
+DncLKvbdQmYBxnUz
+DnbjjvbdVBCRSqSZ
+EPCkKvbdRosfifEX
+EPDLKvbdlYrqrxgU
+EPDLKvbdKVuGDeHJ
+DncLKvbdDncLLWcE
+EOcLKvbdfNGXGmKL
+EOcLKvbdQvmdDMHc
+EOcLKvbdEARiMyvw
+DoCjjvbdnHFXlnGy
+EOcKjvbdhtyeXRtb
+DncKjvbdMgDQNQVL
+EObjjvbdpedFUWBI
+EPDKjvbdkHfkfFnL
+DoDKjvbdrXQMChyR
+EObkKvbdREDAoqES
+DoDKjvbdBdQAvKMf
+DoCkKvbdjvWnDaxX
+DnbkKvbdePEsKstS
+EPDKjvbdyOTHwsJD
+DnbkKvbdrSVKnKaN
+EPCkKvbdZirgpHBf
+DoCkKvbdsQVnjDVf
+DnbjjvbdGLEsCgmV
+EPDLKvbdelewHMjL
+EObjjvbdjlbMZeGo
+DoDLKvbdxrmhlrCH
+DoCkKvbdczZQXyQb
+EObjjvbdRDcBQRDr
+DoCjjvbdxLXEHzyf
+DoCkKvbdkySrTZGt
+DoCjjvbdDoDKjwCd
+EObkKvbdKWVGEEfi
+DoDKjvbdTqQoUuIN
+EObjjvbdZRNEiMeR
+DoDKjvbdxUmEpyMO
+EPDLKvbdxxJJaozL
+EObkKvbdraemLfkZ
+EPCjjvbdbiNKLFvx
+DnbjjvbdZjSgpHCG
+EObjjvbdqBIeAXHd
+EObjjvbdVUNUGMWK
+EPDKjvbdliDsqUqa
+EOcLKvbdxZgfGYFS
+DnbjjvbdYpmFJMdq
+EPCkKvbdcTCjtEKB
+DncLKvbdVUMtFlVj
+EPDKjvbdcIlijevx
+DoCjjvbdpstHSSKt
+EOcKjvbdLAjgMaxR
+DoDKjvbdHkaznXQk
+EPDLKvbdrovPJcVf
+EObjjvbdjblLRHVH
+EPCkKvbdfSAvzlCo
+EPDLKvbdkHfkefOL
+DoCjjvbdbiNKKfXY
+EPDLKvbdjJfHilwr
+EOcKjvbdxVMeQxkn
+DncKjvbdqlzJyMIJ
+DoDLKvbdffMZnGgA
+EPDLKvbdrpWPJcVf
+DnbkKvbdNsTvGeVQ
+DncKjvbdZshiZETO
+DoCjjvbdWRnXaeLc
+EPDLKvbdUaCRTQqy
+EOcKjvbdKDKDQjCx
+EPCkKvbdLKaIWAJy
+DoDKjvbdjblKpftg
+EPDKjvbdfHkWSNqH
+EObjjvbdSCEEkiZL
+EPDKjvbdcyxpYZQb
+EPDLKvbdVUMtFkuj
+DnbjjvbdVBCQrprZ
+EObjjvbddoEsLUUS
+DnbkKvbdiHKDZVjV
+EOcKjvbdpyPHgRDx
+EObjjvbdYpleJNFR
+DncLKvbdrDdhpOWB
+DncLKvbdcbSmSAUN
+DncLKvbdQwODcLgc
+EPCjjvbdKVuFcdgJ
+EPDLKvbdJvUecdfi
+EObkKvbddjJqvUzn
+EPCkKvbdLrXNZuQz
+DnbkKvbdDihJuxKA
+DoCjjvbdegkWSORH
+DncKjvbdFyVUaEYC
+DoDLKvbdNHDPlpVL
+DoDLKvbddneTKtUS
+DoCjjvbdEARhlywX
+DncKjvbdmbJwYPOV
+DnbjjvbddeOrBvbj
+EPDKjvbdAMhZTXZx
+DnbjjvbdULuoBVoJ
+DoCkKvbdMfbomQVL
+EObjjvbdyTNhlqbH
+EPDLKvbdcyxowxpb
+DoCkKvbdEPDLLXCd
+DncLKvbdSCEFLiZL
+DnbjjvbdBiLCKiFj
+EPCjjvbdmgExNNgZ
+EOcLKvbdsPvPKDVf
+DoCkKvbdbKkfOmcA
+DncLKvbdIxTaglRQ
+DnbkKvbdFVyQQNJe
+EPDLKvbdbsCjtEKB
+EPDKjvbdakMFnnDA
+EObjjvbdWWiYVcdg
+DnbkKvbdfSAvzkcP
+EOcLKvbdbKkennDA
+EPCjjvbdTppoVUhN
+EPDLKvbdemGWgMjL
+DnbjjvbdJvUedFHJ
+DoDLKvbdqvokbiZR
+EPCjjvbdZMRctOMN
+DoCjjvbdNPwpunGs
+DoCkKvbdZtJIyDrn
+EPCjjvbdFejRnIsq
+EPDLKvbdZshhxdTO
+DncLKvbdxZhGGXeS
+DoDLKvbdKyRKSztf
+EPDKjvbdCflFgAzc
+EPDKjvbdOEdThiKd
+DoDLKvbdTAFIgaoE
+EObjjvbdEARiNZvw
+EOcLKvbdjhHLefOL
+DncKjvbdbVCHXjtI
+EPDKjvbdeFPRawCj
+DoDLKvbdtcCuWuoP
+DoDLKvbdUVkpJtAq
+EPCjjvbdaSFcHsfL
+EPDKjvbdPxmAGrrK
+EPCkKvbdDjHjWXjA
+DnbkKvbdpssfqrKt
+DoDKjvbdePEsKtTr
+EObkKvbdDwxMUTtM
+DnbkKvbdZRMdiNEq
+EPCjjvbdhuZdvquC
+DoCjjvbdGLEsChMu
+EPDKjvbdRDbaQQdS
+EOcKjvbdEJhJvYKA
+DncKjvbdkxsSSxft
+EObjjvbdKRZdnfOF
+EOcLKvbdZQmFIleR
+DnbkKvbdjcLjpfuH
+DnbkKvbdYzbfSKWZ
+EPDLKvbdbUafxLTh
+EPCjjvbdJuuFcdgJ
+DoCkKvbdJcKCqJcY
+DoCjjvbdSKyGVGkT
+DoCjjvbdemFvflik
+DoCjjvbdvBEYsPEh
+EOcKjvbdCWzdJEov
+DncLKvbdqTsgSSKt
+DnbkKvbdUMVoBWOi
+EPCkKvbdOEcsiIjd
+DncLKvbdaSFbhUFk
+DoCkKvbdhtzEwRuC
+DoCkKvbdiCOcEvqR
+DoCkKvbdfILVqnRH
+DnbkKvbdCJLCKhej
+EPCkKvbdakLeoODA
+DnbkKvbdUaCRTQrZ
+DoDKjvbdRacdkhyL
+EPCjjvbdYNqAXtut
+DncKjvbdwzHfFwdr
+DncLKvbdNrsvGeUp
+EPDKjvbdDoCkKvbd
+EPCjjvbdrafNLfkZ
+EObjjvbdmajXXoOV
+DncLKvbdVAbRTQrZ
+EObkKvbdkySrTZHU
+DoDKjvbdZeXfzghb
+EPDLKvbdiCOcFWpq
+EOcKjvbdUQpnuUhN
+DncLKvbdijGIKMwr
+DncKjvbdHgHZxwwg
+DncLKvbdVTmUFlWK
+DoDKjvbdeYZtUSFz
+EPDKjvbdHffyyYXg
+DncKjvbdXsLaMtOx
+DncKjvbdzitoocrt
+DoDKjvbdhtyeWquC
+EPDKjvbdEuyPpNKF
+DnbkKvbdtvOYKRTA
+DncKjvbdZnnJFEzK
+EPCkKvbdqZPIGpcx
+DnbkKvbdVgxWYGxz
+EPCjjvbdOStWHEuQ
+EObkKvbdNddTiIjd
+DoDKjvbdwXMBWAuu
+EPDLKvbdsPvPKDVf
+DncLKvbdQvnDbkhD
+DncKjvbdEKHjWYKA
+EPCkKvbdCgMFgAzc
+EOcLKvbdQvnDbkgc
+EPCjjvbdDoCkLWbd
+DnbkKvbdKCibpicY
+EOcLKvbdhfibyViu
+EOcLKvbdzQnliJwA
+DncKjvbdEASImZwX
+EPDLKvbdFkFTChNV
+DnbjjvbdEuxoomKF
+EOcKjvbdYqMeJMeR
+DnbjjvbdgQBzvdYI
+DoCjjvbdkxrrSxft
+DnbjjvbdjuwNdCYX
+EOcLKvbdfpBzwEXh
+DoCkKvbdnHFYMmgZ
+EOcKjvbdjlbMZeHP
+DoCkKvbdmttzKjSG
+EPDLKvbdzjUopDsU
+EPDLKvbdsZlPraIO
+EOcLKvbdLBLHMbYR
+EPDLKvbdtbcVXVno
+DoDLKvbdaaVeGQQX
+EPCjjvbdWSOYCEkc
+EObjjvbdxUmFQyMO
+DoDLKvbdRbDdkiZL
+DoCjjvbdhlFDnVCy
+EPDKjvbdcTDKscia
+EPCkKvbdjlbMZeGo
+DncLKvbdCIkCKiGK
+DoCjjvbdrbFmMGkZ
+EObkKvbdQccAoqDr
+DnbjjvbdTqRPVUgm
+EPCkKvbdNrsufeUp
+EOcLKvbdrMyjZLhJ
+EPDLKvbdiifHimXr
+DnbkKvbdpstHSRjt
+EOcKjvbdZtIhxdSn
+DnbkKvbdbhmKLGXY
+DnbkKvbdkxsSSxft
+DoCjjvbdTAFIhBnd
+EObkKvbdUtMtGLvK
+EPCjjvbdpstGrSLU
+DncKjvbdxLXDgzyf
+EOcKjvbdSCDdlIxk
+EObkKvbdOFEUIiLE
+DnbkKvbdjggLefNk
+DncKjvbdliEUQtqa
+EOcLKvbdFjdsDHlu
+DncLKvbdeEnqavcK
+EOcLKvbdnPyyVjyC
+DoDKjvbdliDsptrB
+DoCkKvbdrXQLbiZR
+DncLKvbdFkErbhNV
+DoDKjvbdTqROtthN
+DoCkKvbdYSlAmUOx
+DnbkKvbdKVuGDdgJ
+EOcKjvbdvwLaWAvV
+DoDLKvbdEObjjvbd
+DnbkKvbdwXLaWBVu
+DnbkKvbdmtuZjiqf
+DoDKjvbdegkWRnRH
+DoCkKvbdeXzUUSFz
+DncLKvbdfNGXGmJk
+DoCjjvbdEztQdlCi
+EPCkKvbdEuyQPljF
+EPCjjvbdrEEiQNvB
+DnbkKvbdLqwNZtpz
+EObkKvbdKeegbBQu
+EObkKvbdvBEZSoFI
+DoDLKvbdrXQLbhyR
+DnbkKvbdbKlGPODA
+DncLKvbdnCKXYOnV
+EOcKjvbdjcMKpfuH
+DoCkKvbdQdCaQRES
+EPCkKvbdDncKjwCd
+DoDLKvbdYlSDtNkm
+EObkKvbdmbKXXnmu
+EPCkKvbdjgfkfGOL
+DnbkKvbdZyDjNcMS
+EOcLKvbdkNCLyeHP
+DncLKvbdVUMtGLuj
+EOcKjvbdKVtedFGi
+EPCjjvbdKRZeOenF
+DoCjjvbdUQqPUthN
+EPDKjvbdkMbLydgP
+EObjjvbdVqmxBdlD
+EPDKjvbdjAQGaPgK
+DoCkKvbdTlVnaWPJ
+EPCjjvbdwjvdHzzG
+EObjjvbdBsBCtGWr
+EPCjjvbdwuNEqZMO
+DncLKvbdbrcKtEKB
+EPCkKvbdFyVVAcxC
+EPCkKvbdaSGCgsfL
+EPDKjvbdrylQTBIO
+DncKjvbdfSBWzlCo
+EObjjvbdfRaWzlCo
+DnbkKvbdsPvOjDWG
+EPCjjvbdcbSlrAUN
+EObkKvbdrWpLbhxq
+EPCjjvbdhgKDZVjV
+EOcKjvbdhlFDnUby
+DoCkKvbdddoSBvcK
+DoCkKvbdpssfrRkU
+DoDLKvbdJutfEFGi
+EObkKvbdEPDKkWcE
+EOcKjvbdcJNJjevx
+EPCjjvbdcTDKscia
+DncKjvbdYlRcsmlN
+EPDLKvbdkHgMFfNk
+DoCkKvbdjbkjqGuH
+EPDKjvbdTvMPjUAq
+DnbkKvbdQYmAGsRj
+EPCkKvbdKeegbApu
+EPDKjvbdiLdcmtcZ
+DoCkKvbdNeDshhjd
+EOcLKvbdxnShXsIc
+EPDLKvbdyOShXrhc
+EObkKvbdbPgHELzd
+DoCjjvbdDoCkKwDE
+EOcLKvbdmbJvxPOV
+DnbjjvbdkNBlZeHP
+DnbkKvbdRXNdDMID
+DncLKvbdXnRAYUvU
+EObkKvbdBcpAuilf
+EPDKjvbdSLYeuGkT
+DoCjjvbdRaceLiYk
+DncLKvbdZoNiFEzK
+EOcLKvbdGLEsDIMu
+DnbjjvbdnUuZkJqf
+DoCkKvbdlqyUyrci
+DoCkKvbdLGGHaaRV
+DnbkKvbdmoyyWLYb
+DncKjvbdMpYRWOGs
+DnbjjvbdkyTRsYft
+EObkKvbdjKFhJmXr
+DnbjjvbdxLWcgzzG
+DoCkKvbdxnShXrhc
+DnbjjvbdRbEEkiZL
+EOcLKvbdWWiXudEg
+DoDLKvbdDjIKVxKA
+DoDKjvbdgFkzNgHA
+EPDLKvbdvvlAuaVu
+EPDLKvbdauBfwkTh
+DncLKvbdmIctQtrB
+EPDKjvbdCDpBWJmG
+DoDKjvbdvAcxsPEh
+EOcKjvbdrJAKFNOe
+EOcLKvbdbsDKscia
+DncLKvbdAMhYsWzY
+DncKjvbdddnrCXDK
+EOcLKvbdkHflGGOL
+DoDKjvbdbUafxKsh
+DnbkKvbdNdctIiLE
+EOcLKvbdvBDyTPEh
+DoCjjvbdFejSOJUR
+DnbkKvbdUQpntuHm
+EObjjvbdTpqOttgm
+DoDLKvbdddoSCXCj
+DncLKvbdbVCHXkUI
+EPCjjvbdKNAEZgVB
+EPDKjvbdFjdsDIMu
+DnbjjvbdpaIeAXHd
+EOcLKvbdrDdhpOWB
+EPDKjvbdIxUBhLpp
+EPDKjvbdhkddOVCy
+EPCkKvbdTkuoAuni
+EPDLKvbdnPyxujxb
+EObjjvbdfSBWzlCo
+EPDKjvbdMuSrKmAX
+EPDLKvbdmozYvKyC
+DnbkKvbdZirhPfaf
+EPCjjvbdNQXqWOHT
+DncKjvbdZsiIyESn
+DnbkKvbdURQnuUgm
+DoCjjvbdkIHMFfOL
+EPDKjvbdKfGHaaRV
+DncLKvbdtcDUwVoP
+EOcLKvbdxrnImRbH
+EPDLKvbdozmdLYPA
+DoDKjvbdUVkojUBR
+DnbjjvbdqUUHRrLU
+DoDLKvbdEARhmZvw
+EOcLKvbdZHWdAOri
+DoCjjvbdVUMtGLuj
+EOcLKvbdmfeYNNfy
+EPDKjvbdZirgogCG
+DnbjjvbdEJhKVwjA
+DnbkKvbdkVvmdBxX
+DnbjjvbdvBEYsOeI
+EPCkKvbdDoCjjwDE
+DoCjjvbdRXNdClID
+EPDKjvbdkxrrTZGt
+EOcLKvbdZdxGzhJC
+DoDLKvbdxnSgxSiD
+DoDKjvbdIryAsMxM
+DnbkKvbdTYKlNzjx
+DncLKvbdIGfzZYXg
+DncLKvbdQvnEClHc
+DnbkKvbdqUTfrRkU
+DoDKjvbdRDcAopdS
+DoDKjvbdTfznMXWF
+EOcLKvbdauCHYKtI
+EObkKvbdNrsvHEtp
+DoDLKvbdDihJvXjA
+DnbjjvbdliDtRVRa
+DncKjvbdgFlZmfgA
+DncLKvbdmJDsptqa
+DncKjvbdfoazvdXh
+EOcKjvbdJXtBgkpp
+EPCkKvbdqUUGrSKt
+EPDKjvbdrMzJyLgi
+EPCjjvbdiGjDYuiu
+EOcLKvbdkWXNcaww
+EOcLKvbdxxIjBoyk
+DnbkKvbdePErjssr
+DnbjjvbdIryArmYM
+EOcLKvbdRMwayNtz
+EOcLKvbdRkZGUgKs
+DoDKjvbdZLrEUOMN
+DnbkKvbdDHMFgAzc
+DnbkKvbdwXMBVaVu
+DnbjjvbddeOrCXDK
+EPDLKvbdwuMeQyLn
+EPCjjvbdBhjbLIej
+EPDKjvbdaNLCSuMg
+EPCjjvbdBhkCKhej
+EPCkKvbdptUGrSKt
+EObkKvbdVTmTfLvK
+DoCkKvbdDoDKkXDE
+DnbjjvbdfoazvdYI
+DnbkKvbdatbHYKtI
+DnbkKvbdVUMtGLuj
+EPDKjvbdeEoRavbj
+DoCkKvbdJpzFPGNe
+DnbjjvbdNHDQNQUk
+DncKjvbdYNqAXuWU
+EPCkKvbdZnnIddzK
+EObkKvbdYlRdTnMN
+EPDKjvbdEzspdkcJ
+DoDLKvbdCIkBjhfK
+EObjjvbdTkuoAvOi
+DoCkKvbdhkdcnUby
+EPCjjvbdHfgZyYXg
+DncLKvbdbsCkTdKB
+DoCjjvbdLqwMzVQz
+DoDLKvbdRkYfUgLT
+EOcLKvbdbQHHELzd
+EPCkKvbdbVCGxLTh
+EObjjvbdmSYuZsEJ
+DoDKjvbdssRsYyeD
+EPDKjvbdLrWlytpz
+DncKjvbdJTZBSlxM
+DnbkKvbdxrnJMrBg
+EPCjjvbdxZgfFxFS
+EObkKvbdUQpnuVIN
+EObkKvbdzjUpQESt
+EObjjvbduaDxsPFI
+DoDLKvbdkyTRsYft
+DoDKjvbdyTOImRbH
+EObkKvbdegkWRnQg
+DoCjjvbdaSFbgsek
+DoDKjvbdrylPsAhO
+DoCjjvbdgGMZnGgA
+EPCkKvbdlqyUzSdJ
+DncKjvbdwNWAMdFN
+EPDKjvbdTlWPAuoJ
+EOcLKvbdUMWPAuoJ
+DnbjjvbddZxowxqC
+EPCkKvbdEuyQPlie
+DoDKjvbdVAaqSqSZ
+EPDLKvbdwtldpxlO
+EOcLKvbdrRtkNkBN
+DncKjvbdJqZeOenF
+DncKjvbdfHkWSNqH
+DoCkKvbdnUuZjirG
+EOcKjvbdsCFmMGkZ
+DoDLKvbdwzIFfYEr
+EOcLKvbdqqtjmjaN
+DoCjjvbdrbGNLgKy
+EPDKjvbdNHComQUk
+DnbkKvbdIMBznWqL
+EPCjjvbdEKHivXjA
+EPDLKvbdVhYWYGxz
+EPDLKvbdZxcjNblS
+DnbjjvbdJpzEoFme
+EPDKjvbderBWzkcP
+DoDLKvbdpssgRrKt
+EObkKvbdtbbtvuoP
+EOcLKvbdqGDeUWAh
+DoDKjvbdlZSrTYft
+EOcKjvbdFfKRmhtR
+DnbkKvbdNPxRVnGs
+EPDLKvbdZshhxcsO
+EPCjjvbdMoxQvNgT
+EPCjjvbdKaKfmBxR
+EPDLKvbdSwjkmzjx
+DoCkKvbdjbkkRGtg
+DoDKjvbdfoazwDxI
+DoDKjvbdqwQLbhxq
+EPCkKvbdZtIhyETO
+DncLKvbdmpZxukYb
+EOcKjvbdMoxQumgT
+DoCjjvbdLYqJrzuG
+EObjjvbdnGeXlmfy
+EPDLKvbdyzeOSHhh
+EOcLKvbdiZuGMQmf
+EPCkKvbdWSNwadkc
+DncKjvbdhfibyVjV
+EOcKjvbdQmXbZOUz
+DoCjjvbdSKxeuGkT
+DnbjjvbdbrbkUDjB
+EPDLKvbdJcKCqJbx
+DnbjjvbdjSziTLJz
+EOcKjvbdZxdKNcMS
+DoCkKvbdelfWfmJk
+DoCjjvbdFjeScHlu
+EPDLKvbdnCJvwnnV
+EPDKjvbdNrsufduQ
+DnbkKvbdjcLjqGuH
+EObjjvbdmbKXYOnV
+DoCjjvbdRacdkiYk
+EObkKvbdaaVdfQQX
+DoCkKvbdJpydnfOF
+DoCkKvbduCbtwVoP
+DoDKjvbdpxnhHRDx
+EOcKjvbdmJEUQtqa
+EPDLKvbdRkZGVGjs
+EPDKjvbdEObjkXCd
+EObjjvbdCTAbtGWr
+DoCkKvbdqTsfrSKt
+DncLKvbdaMkBsUmH
+DncLKvbdqlyixlIJ
+EPCkKvbdvwMAuaVu
+DncKjvbdiUzEwRuC
+DoDKjvbdiUzFWrVC
+DnbkKvbdkDMKpfuH
+EObkKvbdZnnJFEzK
+EObkKvbdWWhwudEg
+DoCjjvbdypoNIiwA
+DoCjjvbdShyiqABM
+DnbjjvbdOFEThhkE
+DnbjjvbdRXNcbkgc
+DoCkKvbdqUTfrSKt
+EPDLKvbdfNGWgMjL
+EPDLKvbdGFirOJUR
+EOcKjvbdSCEFMJYk
+EOcKjvbdmpZxukYb
+EPDLKvbdrafNLgKy
+DnbkKvbdmJDsqUrB
+DnbjjvbdjKFgimXr
+EOcLKvbdVYgtZjoO
+EObkKvbdTvMPjUBR
+EOcLKvbdSxKkmzjx
+DoDKjvbdnPzYvKxb
+EPCjjvbdaRfDITek
+EObkKvbdjKGIJmXr
+DoCjjvbdliEURVSB
+EObkKvbdFaOqYizm
+EOcLKvbdqGEEsuaI
+DoCjjvbdZQleJNEq
+DoCjjvbdbKlFnnDA
+DnbjjvbdWIXuwfxz
+EPDLKvbdNGcPmPuL
+DoCjjvbdBsBDTevr
+DnbkKvbdczYoxYpb
+EObjjvbdJutedEfi
+DncLKvbdGFirNhsq
+EPDKjvbdUaCQrqRy
+EPCjjvbdQwNdDMID
+EPDLKvbdtSrSyZeD
+DnbkKvbdNHDQMpUk
+DoDKjvbdZirgofaf
+EObkKvbdrpWOibuf
+DoCkKvbdwygfFxEr
+EPCjjvbdSwjlNzjx
+DnbkKvbdjKGHjMxS
+DncLKvbdijFhKNXr
+EOcKjvbdddoRavbj
+EPDLKvbdmIdTpuSB
+DncLKvbdiiehJmYS
+EObkKvbdjcLkQgUg
+DoDKjvbdsQVoJbuf
+EObjjvbdhzUfMQmf
+DnbkKvbdcImKKfWx
+EObkKvbdbQHHELzd
+DnbjjvbdWWiXuceH
+EPDKjvbdjJegjNXr
+EPCjjvbdZyEKNblS
+DoDKjvbdLqvlzVQz
+EPDLKvbdZRNEhmFR
+DnbkKvbdGcjuibJj
+EOcLKvbdGAnpxizm
+EPCjjvbdkVvnDaww
+EOcKjvbdHffzZXwg
+DoCkKvbdKeehCAqV
+EPCjjvbdHEKuiajK
+EOcKjvbdUtMselWK
+EPDKjvbdEXwlTstM
+EPDKjvbdsrrSxzFD
+EOcKjvbdEztQeMDJ
+EPCkKvbddoFSjstS
+DoCkKvbdSCEElIyL
+DncKjvbdFVxpQNJe
+DnbjjvbdXmqAYUut
+DoCjjvbdiZtfLpmf
+DoDKjvbdwygeexEr
+EOcLKvbdiUyeXSUb
+DncKjvbdsZkoraIO
+EOcLKvbdACrYJyhp
+EOcLKvbdTlVoBVoJ
+EPCkKvbdqZPHfqDx
+DnbkKvbdmJDsptqa
+DncKjvbdhkeDnUcZ
+EPDKjvbdURQoUtgm
+EPDKjvbdjAQHAogK
+EObjjvbdCIkCKhfK
+EOcKjvbdYzbfRjWZ
+DnbkKvbdWRnYCEkc
+DncKjvbdyzeORgiI
+EObjjvbdEPCkLWbd
+DoDLKvbdNHComPuL
+DnbkKvbdaRebhUFk
+DnbkKvbdhlEcmtby
+EOcLKvbdliETqUrB
+EPDKjvbdIxTbHkqQ
+DncLKvbdCEPaVjNG
+EOcLKvbdIjEAJogE
+DoCkKvbdsZkpSaHn
+EPDLKvbdEXxLtTtM
+DncKjvbdwXMAvAuu
+EPDKjvbdakMGPODA
+EPCkKvbdauBfxKsh
+EOcKjvbdCJKakJFj
+EPCkKvbdyXhjBozL
+DoDLKvbdkWWnDbYX
+DncKjvbdEPCjkXDE
+DoDKjvbdlqxtzTDi
+EPCjjvbdyTOJNSBg
+DoCkKvbdnGeYMmgZ
+EPCkKvbdaSFbhUFk
+EObjjvbdnCKWxPNu
+DoCjjvbdrWpLbhyR
+EPDLKvbdmRxtyrci
+DnbjjvbdSBdElJZL
+DnbkKvbdrXQLbiYq
+DoDLKvbdWHwuwfxz
+DoCjjvbdZRNFJNEq
+DncKjvbdUVkpJsaR
+DoCjjvbdbiMijfXY
+EPDKjvbdVTmTekvK
+DoCjjvbdeXytTrFz
+DoDLKvbdyYJKCQZk
+DoDLKvbdczZQYZQb
+EObjjvbdRadFMJZL
+DncLKvbdkVvnECYX
+DncKjvbduaDySneI
+DnbjjvbdwuNFQyMO
+DncLKvbdsrqrxzEc
+DoDLKvbdcSbjtEKB
+EPCjjvbdZtJIyETO
+DoDLKvbdJvUfDdgJ
+DnbjjvbdhbPDFWqR
+DncKjvbdcyyQYYpb
+DoDKjvbdWSNwbFMD
+DoCjjvbdmajXXoNu
+EPCkKvbdxZgeexEr
+EOcKjvbdxsOIlrBg
+DoDKjvbdZyEJmbkr
+DncLKvbdTkunaVni
+EOcLKvbdUQpoUthN
+DoDLKvbdyNsHxTJD
+DncKjvbdEztRElCi
+DnbkKvbdXnRAYVVt
+DnbjjvbdqAheAWgd
+DnbkKvbdCJLBkIfK
+EPDKjvbdUGzmkwWF
+EPCkKvbdSiZiqABM
+EPDLKvbdidkGtoAO
+EOcLKvbdYlSDsnLm
+EPDKjvbdMSWmZtpz
+DoDKjvbdlhdURVRa
+EOcLKvbdOYOuzdOU
+DncLKvbdrafMlGkZ
+EObjjvbdrylPraHn
+DnbjjvbdDncLKwCd
+DoCkKvbdoznELXoA
+DoCkKvbdmttykJrG
+DoDLKvbdBvzciEov
+EPCjjvbdeXzUUSFz
+DoDKjvbdtunYKQsA
+EObjjvbdqceJQNvB
+EOcLKvbdqTtGqqkU
+DoCkKvbdiGjDYujV
+EPCkKvbdRWnEDLhD
+EOcLKvbdcSbjtDia
+DncLKvbdTqROuVHm
+EOcKjvbdiifIKMxS
+EObkKvbdlYrqsZGt
+DoDKjvbdSBdFLhxk
+DnbkKvbdVUNUFkuj
+DoCjjvbdrzLpSaIO
+DoDKjvbdzGxlANFX
+DoDLKvbdfHjuqmpg
+EPDKjvbdZRMeIldq
+DncKjvbdMfcPlpVL
+DncKjvbdxKwDgzzG
+EOcLKvbdYzbfRjVy
+EObkKvbdWSNwbElD
+DoCkKvbdeFOrCXCj
+EObjjvbdbKlGOmcA
+EOcKjvbdDxXktUTl
+EPCjjvbdvBDySneI
+EPDKjvbdLFehCBRV
+DoDLKvbdiZuFlROG
+EPDKjvbdDoDLKvbd
+DoCjjvbdQwNdCkhD
+DoCjjvbdCJLBkIfK
+DnbjjvbdlqyUzSci
+DncLKvbdNHCpMpUk
+EOcKjvbdiMFEOVCy
+DoCkKvbdnGeYNOGy
+DnbkKvbdZoOIddzK
+EOcKjvbdFpATWffZ
+DoDKjvbdeOeTKtTr
+DnbjjvbdGGKSNhsq
+EOcKjvbdyXiKCPyk
+DoCjjvbdeAURNYKG
+DoDKjvbdpssfrRjt
+EPDKjvbdnVVZjjRf
+EOcKjvbdiZuGMQmf
+EOcLKvbdNHDPlotk
+DnbjjvbduCbtwVoP
+EOcKjvbdxUleQxlO
+DoDKjvbdnHFYMnGy
+DnbjjvbdUVlPitAq
+EPCkKvbdjAPgAofj
+DoCkKvbdTlVoAuoJ
+EPCkKvbdmSYtyrdJ
+EPDKjvbdBsAcTevr
+EPCkKvbdUyITzKnn
+DnbjjvbdbQHGdLzd
+EOcLKvbdezuyFIsw
+DoDLKvbdEXwlTtUM
+EOcKjvbdKyRJrztf
+DnbjjvbdtTSSxzEc
+DnbjjvbdHDjujBij
+DoCjjvbdsQVnicWG
+EObkKvbdZsiJYcrn
+EPDLKvbdUtNUFkuj
+DoDKjvbdNPwpumfs
+EOcKjvbdSBcdlJZL
+EPDLKvbdmfeXlmfy
+DncKjvbdIsZAsNXl
+DncLKvbdmJDsptrB
+DncKjvbdGYuUaEXb
+DncLKvbdyYJJbPzL
+DnbkKvbdrpVnicWG
+EPCjjvbdTqQoVUgm
+DoDLKvbdFVyPpMjF
+EObkKvbdZnnIeEyj
+EObkKvbdbUagYKtI
+DoCkKvbdqGDdtWBI
+EPDLKvbdFVxpQNKF
+DncLKvbdkWXNdCYX
+EPDKjvbddwystRez
+EOcKjvbdaNKasUlg
+DnbkKvbdNdctIhjd
+EPCkKvbdatagYKsh
+DoCkKvbdfNFvgMik
+EObjjvbdJYTbIMQp
+DoCjjvbdEYYMTtTl
+DncKjvbdWRmxCElD
+EPCkKvbdbsCjsdKB
+EOcLKvbdFVxpQMie
+EObkKvbdpaJFAWgd
+EPDLKvbdijGHimXr
+EPCjjvbdlhctQtqa
+EObjjvbdFVxoolie
+DncKjvbdrJAKEmOe
+DnbkKvbdzQnmIiwA
+EPCkKvbdkHfkeemk
+DnbjjvbdLGGHaaQu
+DnbkKvbdOSsugEtp
+DnbkKvbdZtIiYcrn
+DoCjjvbdQZNAGsSK
+EObjjvbdNPxRWOGs
+DoCkKvbdVUMsfLuj
+DnbjjvbdmJETqUqa
+EPDLKvbdBsAcUFvr
+EOcLKvbdIsZArlwl
+EPCjjvbdNddTiJKd
+DoDKjvbdyXhiaozL
+DncLKvbdjmCLzEfo
+EOcLKvbdRadElJYk
+DncLKvbdjbkkQfuH
+EObkKvbdXFxzUAOs
+DncLKvbdxZhGFwdr
+DoCjjvbdNsTugEuQ
+EObjjvbdRbDdlIyL
+DoCkKvbdePEsLUUS
+DoCjjvbdOStVgFVQ
+EPDLKvbdUtMtGLuj
+EObjjvbdFjdrbhMu
+EOcKjvbddeOrBwCj
+DnbjjvbdxUmFRYkn
+DnbjjvbdCEQBVimG
+EOcLKvbdvAdZTPEh
+EPCkKvbdGcjvJaij
+EPCjjvbdOFETiIjd
+EOcLKvbdemGWgNKL
+DoCkKvbdqTsfrRkU
+DncLKvbdbrcKsdKB
+EPDLKvbdTAFIhBoE
+DoCjjvbdKCjCqJbx
+DnbjjvbdNsUWHFUp
+EPDKjvbdkWWmcaxX
+EPDLKvbdbKlFoNcA
+DoCjjvbdkIGkefNk
+EPCkKvbdXFyZtAPT
+EPDKjvbdpxnhGpcx
+DoDLKvbdhanbeWqR
+EOcKjvbdliEUQtqa
+EObjjvbdbBVeFpPw
+EObkKvbdQdDApQdS
+EPDLKvbdnQZyVkZC
+EObjjvbdhbOcEwQq
+DnbjjvbdBdPaWKMf
+DoCjjvbdCTAbtGWr
+EPCjjvbdEvYpQMie
+EObjjvbdDxYLtUTl
+EObkKvbdCTBDTfXS
+EPCjjvbdmpZxvKyC
+EPCkKvbdRzKITDWA
+EObkKvbdemGXGmJk
+EOcLKvbdIryAsNXl
+DoDKjvbdkWXNcaww
+EObkKvbddCTNSAUN
+DncKjvbdvBDxroEh
+DncLKvbdiCPDEwRR
+EObjjvbdRkZGVHLT
+DoCjjvbdFkFSbhNV
+EPDLKvbdwjvdHzzG
+DoDLKvbdqquKmkBN
+EOcKjvbdsQVoJcVf
+EPCjjvbdYlSEUOMN
+EObkKvbdjKGIKMxS
+DncLKvbdRpUGifDw
+EObkKvbdEuxooljF
+EPDLKvbdzitpQETU
+EOcKjvbdTvLpKUAq
+DoCjjvbdrSVKmkAm
+EOcLKvbdEvZQPmJe
+EPCkKvbdfelZnHHA
+EOcLKvbdjhGlGGNk
+DncKjvbdCEPaWJmG
+DncLKvbdrpVnjDWG
+DoDLKvbdeOeTKtUS
+DoCkKvbdtbbuXVno
+EObkKvbdYpleJMeR
+DnbjjvbdiCPDEvqR
+DoDLKvbdUslsekuj
+DnbkKvbdGBPQyJzm
+EPCkKvbdtbcUwVoP
+DoDKjvbddxZssrFz
+DncLKvbdkIGlGFmk
+EPCkKvbdhuZdwRtb
+EObkKvbdehLWSOQg
+DoCkKvbdatafwjsh
+DoDKjvbdhfjCyViu
+DoCjjvbdFyUuAcxC
+EObkKvbdUMWPAvPJ
+EPDLKvbdxxIjBoyk
+DnbjjvbdMRvlytpz
+EPCkKvbdDxYLtUTl
+DnbjjvbdiVZeXSUb
+DoCjjvbdffMZmgHA
+EPDLKvbdnPyyVkYb
+EPCkKvbdZtIhyETO
+DncKjvbdRECaPqDr
+EPDKjvbdVrNxBeMD
+DnbkKvbdKVuFdFGi
+EOcLKvbdrzLosAgn
+EPDKjvbdLLAgvAKZ
+EOcLKvbdLYpirztf
+DncKjvbdnGeXlnHZ
+EOcLKvbdQdDAopdS
+DnbkKvbdptTfrRkU
+DoCjjvbdqGEFUVaI
+DncLKvbdrDeIomvB
+DoDLKvbdyOTHxSiD
+EOcLKvbdRpTfjGDw
+DoDLKvbdzitpPdTU
+DnbjjvbdUxhTykOn
+EOcKjvbdGFjSNhtR
+EObkKvbdidkGuPAO
+EObjjvbdVAapsQrZ
+EPDLKvbdQccAopdS
+EObjjvbdmozYukZC
+EOcKjvbdGFjSOIsq
+EPCkKvbdyzeNrHiI
+DncLKvbdEOcKjvcE
+DncLKvbdLFfIBaQu
+DoDKjvbdtlXwBUBX
+DoCjjvbdeOeTLTsr
+DncKjvbdiZuGLpnG
+DoCkKvbdWRnYBdkc
+DncLKvbduCbtvvOo
+DnbkKvbdGGKRnIsq
+EOcLKvbdVTmUFkuj
+EOcKjvbdFkEsDHlu
+DoDKjvbdQwNcbkgc
+DncLKvbdWRmwbFLc
+DnbjjvbdHlBzmwRL
+EPDKjvbdDncKjwCd
+EObkKvbdGBPRYizm
+EOcKjvbdqrVLNjaN
+EObjjvbdqFceUVaI
+DoCkKvbdZQmFImFR
+EPDLKvbdmIctRVSB
+EObkKvbdjAQHBPfj
+EObjjvbdrEFIonWB
+DnbjjvbdsPuoKCuf
+DoDKjvbdtbbuXWPP
+EPDLKvbdOStWGduQ
+DoCkKvbdUQqPUuIN
+EPDLKvbdwyhFewdr
+EObkKvbdShyiqAAl
+EPDLKvbdGZUuBEXb
+EPCkKvbdHffyyXwg
+EObjjvbdGBOpyJzm
+EObkKvbdZirgpGaf
+EObkKvbdRjxfUfkT
+EPDKjvbdZHWdAPSi
+DnbjjvbdVrOYBdkc
+DoCjjvbdGGKSNhsq
+EOcKjvbdJqZeOenF
+EOcLKvbddBsNSAUN
+DncKjvbdZtJJYcsO
+EPDKjvbdBraDTevr
+DoCkKvbdRDcApQdS
+EObjjvbdGGJrNiTq
+DoCjjvbdGLFTCgmV
+DoCjjvbdtlXwBUAw
+DncLKvbdQwNdClHc
+DoDLKvbdygYlAMeX
+EPDLKvbdTvMQKTaR
+EPCjjvbdiMFDnVDZ
+DoCjjvbdiBoDFXRR
+EObkKvbdUQqOuUgm
+EOcKjvbdaMkBsVNH
+EObkKvbdwuNEqZMO
+EObjjvbdLAkGlbXq
+EObkKvbdkCkkQgUg
+DncLKvbdVqnYCFLc
+EPCkKvbdxVMeRZLn
+DncLKvbdRXOEClHc
+EObjjvbdvwMAvBWV
+EObjjvbdIwsahLpp
+EObjjvbdKDKCpicY
+DoDKjvbdlrZUzTEJ
+EOcLKvbdyYIjBpZk
+DncLKvbdxsNhlqag
+EPDKjvbdgPazvdXh
+EPDLKvbdbKlGPNcA
+DoCjjvbdqUUHSRjt
+DnbkKvbdNeDsiJKd
+DnbjjvbdqGEFTvAh
+DoDKjvbdnUtykKRf
+EPDKjvbdZtJJZDrn
+DoCjjvbdmRxtysEJ
+EOcKjvbdQmXbYnUz
+EPDKjvbdjmCLzFGo
+DncKjvbdsBfMkfkZ
+EPCkKvbdFVxpPlie
+DnbkKvbdZLrEUOMN
+DoCkKvbdEOcKkXDE
+EObkKvbdvBEYsPEh
+EPDKjvbdcJMjLGXY
+EOcLKvbdOYPVzcnU
+DnbkKvbdsQWOjDWG
+EOcLKvbdfHjvRnRH
+DoDLKvbdmbKXYPOV
+DncKjvbdrpWPJcVf
+EOcKjvbdURROuUgm
+DnbkKvbdrovOicWG
+EObjjvbdLYpirzuG
+DnbjjvbdGQASvgGZ
+DnbkKvbdYzcFqjVy
+DncKjvbdBsBCtFvr
+DoDLKvbdYgXEAOri
+EOcLKvbdqTsfqqjt
+DncKjvbdPIAYZAYa
+EOcLKvbdypnliJwA
+DnbkKvbdhyuGLqNf
+EOcLKvbdjhGkfGOL
+DncKjvbdjblLRGuH
+EPCjjvbdxwhibPyk
+EOcKjvbdBhkCLIfK
+DnbjjvbdJTZArlxM
+DoCkKvbdRjxetgKs
+EObkKvbdiUyeWrVC
+EOcKjvbdwXLaWAuu
+EPDLKvbdssSTZZdc
+EObkKvbdcSbjtDia
+DncKjvbdgGMZnHHA
+DoCkKvbdatafwkUI
+DncLKvbdnCKWxPNu
+EObjjvbdyOShXrhc
+EPCjjvbdpyPHfqEY
+DoDKjvbdbUbGxKsh
+EOcKjvbdypoNJKXA
+EObkKvbdyTOJMrBg
+DoDLKvbdiZtfLpmf
+EPCkKvbdLGFgbBQu
+EOcLKvbdCJLBkJFj
+DnbkKvbdUxgszLPO
+DoDKjvbdUQqPVVHm
+EPCjjvbdijGIKNYS
+EPDKjvbdCJKajhej
+EPDLKvbduoTzqLPU
+DnbjjvbdJTZBTMwl
+EOcLKvbdLAjfmBwq
+DoDLKvbdQwOECkhD
+DoCjjvbdQYmAHTSK
+DoDKjvbdEuyQQMjF
+DoDKjvbdZdwfzhIb
+EOcKjvbdyTOJNRag
+DoDLKvbdbBVdfQPw
+DoCkKvbdbVBfxLUI
+DncKjvbdcIljKevx
+EOcLKvbdhgKDZViu
+EObjjvbdOTUWHEtp
+DncKjvbdZRMeIldq
+DnbjjvbdkHgMGGNk
+EOcLKvbdZMSETmlN
+EPCkKvbdjcMKpfuH
+EPDLKvbdiBncFXQq
+EObjjvbdJcKCqKDY
+DoDKjvbdQwOEClID
+EPCkKvbdRpUHJecw
+DoDKjvbdZjSgogBf
+DoCkKvbdEObkKvbd
+DoDLKvbdDwwktUTl
+DoCkKvbdSKyGVHKs
+DnbkKvbdZMSETnMN
+DncLKvbdiZuGLpmf
+EObjjvbdjcLjpgVH
+EOcLKvbdYzcFqjVy
+EPCjjvbdQvnDcLhD
+DoCkKvbdDihJvYKA
+EPDLKvbdJqZeOenF
+EOcKjvbdWXJXvDdg
+DoCjjvbdznpQeCkx
+EPCjjvbdjJehJmXr
+DoDKjvbdmSYuZsDi
+DoDKjvbdFVyPolie
+DnbjjvbdULvPAvOi
+DncKjvbdwzIGFwdr
+DnbkKvbdOEcsiJKd
+EPCkKvbdEJhJuwjA
+EObkKvbdYSkaNUOx
+EObkKvbddoFSkTtS
+DoDLKvbdFkFTDHlu
+DoCjjvbddwzTtRez
+EOcLKvbdDwwlUTtM
+DoDKjvbdHDjvJaij
+EObkKvbdyTOIlrBg
+EOcLKvbdtSqsYzFD
+EObkKvbduVmwjQsA
+EPDKjvbdbiMjKfXY
+DncLKvbdsQWPKDWG
+DncLKvbdRbEElIyL
+DnbjjvbdGKeTDHlu
+EPCkKvbdrpWOjDWG
+EObjjvbdVwJYWEFH
+EPCjjvbdvBDySoFI
+EPCkKvbdZMSDsmkm
+EObkKvbdqYnhHREY
+EObjjvbdyqPMiJwA
+DncLKvbdCTBCtGXS
+EPCkKvbdfekynGgA
+EPCkKvbdvvkaWBVu
+DoCjjvbdGZUuAdYC
+DoDKjvbdpyOgfqDx
+EPCjjvbdePFTKstS
+EOcLKvbdVviXudFH
+EPCkKvbddZyQYZQb
+DnbkKvbdUaCQrqRy
+EPDLKvbdQwNdDMID
+DncKjvbdUaCRTQrZ
+DnbjjvbdHDkWJbKK
+EOcKjvbdOTTvGduQ
+DnbjjvbdssRrxzEc
+EObjjvbdezuxdiTw
+EOcLKvbdGLFTCgmV
+EPDLKvbdUxgtZkOn
+EOcLKvbdbrbjscia
+DnbjjvbdjJfHimXr
+EOcKjvbdjcMLQgUg
+DoDKjvbdlYrqrxft
+EPDKjvbdGYttaEXb
+EOcLKvbdhbPDEwQq
+EOcKjvbdvAcxroEh
+DoDKjvbdVgxVxHYz
+DoCkKvbdTqQnuVIN
+DoCjjvbdrXQMCiZR
+EOcKjvbdMSWlytpz
+DoCjjvbdBiLCLJFj
+EObkKvbdUyHtZkPO
+DoDLKvbdGcjujCJj
+EPCjjvbdfkGzbfAE
+DoCjjvbdDoCjjwDE
+DnbkKvbdqGDdsvAh
+DoDLKvbdjvXNdBww
+EOcKjvbdANHySvyx
+DoCjjvbdeJjRvUzn
+DncKjvbdqUTgRqkU
+DncLKvbdEvZQPljF
+DnbjjvbdSPsgKFdX
+EOcKjvbdGLFScHmV
+EPCjjvbdqUTgRqkU
+EPCkKvbdNxOuzdOU
+DoCkKvbdpfEEtWBI
+EOcLKvbdDwwlTtTl
+EPCjjvbdSZjITDWA
+DncKjvbdQwNcblID
+DnbjjvbdijGIKMwr
+DnbjjvbdYpldiMdq
+DncLKvbdemGXHNKL
+EPCkKvbdEKHjWYKA
+DoDLKvbdwXMBWAvV
+DnbjjvbdQwOEClHc
+DnbkKvbdbUbHYKtI
+DncLKvbdCSaCtFvr
+DncLKvbdEuyPpNJe
+EPDKjvbdFVyPolie
+DncKjvbddneSkTtS
+EOcKjvbdZtJIxcsO
+EOcKjvbdiGicZWJu
+DncLKvbdOFDtIiLE
+DoDLKvbdOSsufduQ
+DnbkKvbdMfcPmQVL
+EObjjvbdiUzEwSVC
+DoCkKvbdCIkBkJFj
+DncLKvbdYkrETmlN
+EObjjvbdqZOggREY
+EPCkKvbdHDkViajK
+DnbkKvbdbsDLTdKB
+EPDLKvbdlqxtzTDi
+DncKjvbdLGFgbAqV
+EObjjvbdoAKztHcn
+EPDLKvbdRXODblID
+DoCjjvbdIHGzYwxH
+EObkKvbdNPwqVnHT
+EOcKjvbdxrnImRag
+EOcLKvbdiLddNuCy
+DoCkKvbdkMakzEfo
+EObkKvbdnPyxukYb
+EPCjjvbdZdwfzgiC
+EPCkKvbdnHEwmNfy
+EObjjvbdySmiNRag
+EOcKjvbdzeZnzdyp
+EPCjjvbdJvVFdEgJ
+EOcKjvbdZQldiMeR
+EOcKjvbdFyVVAdYC
+DncKjvbdJXsahMRQ
+DnbjjvbdfNGXGljL
+EOcLKvbdwWlAvAvV
+DncLKvbdkIHLefNk
+DncLKvbdliDtQtrB
+DoCkKvbdxZgefXdr
+DncKjvbdCWzchdpW
+EPCkKvbdpyPHfpdY
+EOcKjvbdhbOcFWqR
+DnbjjvbdzjUpPdSt
+DoDLKvbdZMRdUOLm
+DncLKvbdVwJXucdg
+EPCjjvbdWXIxVcdg
+DnbkKvbdMpXpvOHT
+DncLKvbdRkZGVHKs
+DoDKjvbdmpZyWKxb
+DoCjjvbdegkWRmpg
+DncLKvbdyzeOSHhh
+EPDLKvbdRECaPpdS
+EPDKjvbdqvpLcJZR
+DoCjjvbdRDbaPqDr
+EObjjvbdRECaPqDr
+EOcLKvbdsBfNLgLZ
+DncKjvbdZyEKOCkr
+DnbkKvbdSPsgJfEX
+EPDKjvbdZRMdiMeR
+EPDLKvbdDwwktTsl
+EPDLKvbdLhbLpxAS
+EPDKjvbdZirgpHBf
+DoCkKvbdmtuZkJqf
+DnbjjvbdwWkaWAuu
+DnbjjvbdRDcBPqES
+DnbkKvbdyzeNqgiI
+EObjjvbdYkrEUOLm
+DoCkKvbdmtuZkKRf
+DoCkKvbdNdctIhkE
+DnbjjvbdhytfLqOG
+EOcLKvbddZyPwxpb
+EPCjjvbdYzbeqivZ
+EOcKjvbdwygfGXeS
+EOcLKvbdRosfifEX
+EPCkKvbdznopdbkx
+EObkKvbdVBBqSqSZ
+EObjjvbdQlxCZNtz
+EPCkKvbdhlFDmtby
+DoDLKvbdCDpAvJmG
+EPDKjvbddeOrCXDK
+EOcLKvbdrovOjDWG
+DnbkKvbdIGfyyYYH
+EObkKvbdmbKWwnmu
+EOcLKvbdkDLjqGuH
+EPDLKvbdqrUkNjaN
+EPDKjvbduDDVXWPP
+EObjjvbdZnnJFEzK
+DnbjjvbdaRfCgtGL
+DoCkKvbdGKdsDHlu
+DncKjvbdqlyiyMHi
+DoDLKvbdSLYetgLT
+DnbkKvbdZQleJNEq
+EOcLKvbdZLrETnMN
+DnbjjvbdiUydwRuC
+EObjjvbdnPzYvLYb
+EPCjjvbdGYuUaEYC
+EObjjvbdACqwiyiQ
+DncKjvbdIHGzZYXg
+DncKjvbdxrnIlqag
+DnbjjvbdySmhlqag
+DoCjjvbdSCEFMJZL
+EObjjvbdSKxfUfjs
+DnbjjvbdnUtyjjRf
+DncLKvbdkyTRsZGt
+DoDLKvbdWRnXbElD
+EOcKjvbdjvXNcbYX
+EOcKjvbddjKSWUzn
+DoDKjvbdvBDxrneI
+EOcLKvbddndsKtTr
+DoDLKvbdZjTHpGbG
+DnbkKvbdpfDdsuaI
+EPCkKvbdfMfWgNJk
+DoCkKvbdjJegjNXr
+DoDKjvbdcTDLTdKB
+EPDLKvbdwzHfFxEr
+DncKjvbdfMfWgMik
+DnbkKvbdrbFllGkZ
+EPCkKvbdCIkCLJGK
+EObjjvbduDDUvvOo
+EOcKjvbdDxYMUTsl
+EOcLKvbdsPvOibuf
+DncKjvbdUsltGLvK
+EPCjjvbdyOShYTIc
+DoDKjvbduaEZSoEh
+DncKjvbdLrXMzUpz
+DoCkKvbdNsTufeUp
+EObkKvbdLGGIBaQu
+EPCjjvbdmSZVZsEJ
+DncLKvbdQdDAoqDr
+DoCkKvbdKCicRJbx
+EPCkKvbdxwhibQZk
+DoDKjvbdTvMQJsaR
+DoCkKvbdYzcGSJuy
+DnbkKvbdwyhGFwdr
+DoCjjvbdEOcLKwDE
+DoCkKvbdGGKRmhtR
+EOcLKvbdrzMQTAgn
+DoDLKvbdJvVFceHJ
+DnbkKvbdfMfWfmJk
+EPCkKvbdmajWwnmu
+EPCjjvbdxrmiMqag
+EOcKjvbdqUTfqqkU
+EObkKvbdoAKztHcn
+EObkKvbdkyTSTZHU
+EPCjjvbdiCOcEwRR
+DnbkKvbdGZUtaDwb
+EPCjjvbdYORAXuWU
+DoCkKvbdULvPAuoJ
+DnbjjvbdcSbjscjB
+DoDKjvbdLrXMytpz
+DncKjvbdIryBTNYM
+DoCjjvbdZyDinCkr
+EPDLKvbdZoOJFEyj
+DncLKvbdajkfOmcA
+EPDLKvbdRNYCYmtz
+DoCkKvbddePRawDK
+EOcKjvbdbUbHYKtI
+EPCjjvbdbrbjscjB
+EPDKjvbdKDJcRKCx
+EObjjvbdqcdiQOVa
+EPDKjvbdZjTIPgBf
+DnbjjvbdrSUjmjaN
+DnbjjvbdEXxLsstM
+EPCkKvbdFjeSbglu
+DnbkKvbdLqwMytpz
+DoDKjvbdUGznMXVe
+EObkKvbdpstHRrLU
+DoDKjvbdYTLaNUPY
+DnbkKvbdGKdrbhNV
+EObjjvbdRMxCZNtz
+DncLKvbdDihJuwjA
+EPCjjvbdOFDtJIkE
+DnbkKvbdliEUQuSB
+DoDKjvbdkCkkQftg
+EPCkKvbdGZVVAcwb
+EObjjvbdkyTSSxgU
+EPDKjvbdIryBSlxM
+EOcKjvbdWIXvXfxz
+DoDLKvbdhfjCyWKV
+DoDKjvbdNQXpumfs
+DncKjvbdiMEcnVCy
+EPDLKvbdxVMeRZLn
+EPCkKvbdDoDKjwDE
+DnbkKvbdSCEFLiZL
+DoCjjvbdqYoHgQcx
+EObjjvbdxZhFexFS
+EOcLKvbdkDMLRGuH
+EPCkKvbdVwJXvDdg
+DoCjjvbdjhHLefOL
+EOcLKvbdiCOcFWpq
+DnbjjvbdrovOjCvG
+DncLKvbdRzKHsCvA
+EPCkKvbdDoDLKwDE
+EOcKjvbdrNZjZLhJ
+EObjjvbdTAFIhBoE
+DncKjvbdlqyVZsDi
+DncLKvbdjggMFenL
+EPDLKvbdUsltGMWK
+DoCjjvbdkyTRsZGt
+EOcLKvbdrzMPsBHn
+EPCkKvbddZxpYYpb
+DncLKvbdGKdsCgmV
+DnbkKvbdvAdYsPEh
+DoDLKvbdqUUGrSKt
+EPCjjvbdxnTHxTIc
+EOcKjvbdZisIQGaf
+DncLKvbdBhjbLJFj
+DoCkKvbdJSyBTNYM
+DnbjjvbdmfdwlmgZ
+EOcLKvbdJcJcRJbx
+DncLKvbdmoyyWLYb
+EObjjvbdSKxfUfkT
+EObjjvbdlAlnmALA
+DoDLKvbdTlVnaVoJ
+EOcKjvbdnCKWwnnV
+EPCjjvbdjbkkRGtg
+EPCjjvbdULuoBVoJ
+EPDKjvbdwMvAMceN
+DnbkKvbdznopdcLx
+EPCkKvbdeuzwoizs
+EPCjjvbdpssfrRjt
+EOcKjvbdiGibyWJu
+DnbkKvbdYSlBNToY
+EPDKjvbdkVwNcbYX
+DoCjjvbdsPuoJcVf
+DnbkKvbdrbGNLgLZ
+DnbkKvbdRbEFMJYk
+EObjjvbdqceIonVa
+DnbkKvbdTpqPUuHm
+EOcLKvbdVviXvEEg
+EOcLKvbdvAcxrndh
+DnbjjvbdTYKkmzkY
+EOcLKvbduDCuXVno
+EPCkKvbdEvYpPlie
+DncLKvbdaSGCgtFk
+DoCjjvbdpfDdtWBI
+DncLKvbdHDkWJbJj
+DncLKvbdqZOgfpdY
+EPCkKvbdFxuVBEXb
+DoDKjvbdnBivwnnV
+EPCkKvbdRWmcbkhD
+EObjjvbdfIKvSOQg
+DnbkKvbdcIlikGWx
+EOcKjvbdQdDBQQdS
+EPCjjvbdnPzZWKyC
+DnbkKvbdZxcimbkr
+DncLKvbdLFfHaaRV
+DoCjjvbdYSlBNToY
+DnbjjvbdKCicRKDY
+EPCkKvbddneSjtUS
+EObjjvbdmIctRUqa
+DncKjvbdYqMdiNFR
+DnbjjvbduaDyTPFI
+EPCkKvbdePEsLTtS
+EPCkKvbdbUagYKsh
+DoDLKvbdssSSxzFD
+EObkKvbdMuSrLNAX
+EPDLKvbdddnqbWbj
+DnbkKvbdvAcySneI
+EPDKjvbdatbGxLUI
+EOcLKvbddePRbWbj
+DoDLKvbdijGIKNYS
+EPCjjvbdNrsugEtp
+EOcLKvbdxZhGGYEr
+DnbkKvbdTkvPAvPJ
+DoCjjvbdFyUuAcwb
+DnbjjvbdJTZBTMxM
+EPDLKvbdaMkCStmH
+EPDLKvbdjKGHimYS
+DnbkKvbdelewGlik
+EObjjvbdkHgMGGOL
+EObkKvbdURRPUuHm
+EOcLKvbdjKFhKNYS
+EPDLKvbdhyuFkpnG
+EOcLKvbdRosgJecw
+DoCjjvbdczYoxYqC
+DncLKvbdzaAPGgCM
+EPDKjvbdiUzEwSUb
+DoCjjvbdKQzEneme
+EObjjvbdatagXkTh
+DoCjjvbdwtldqYkn
+EOcKjvbdUxgszLOn
+EPCkKvbdUaBprprZ
+EOcLKvbdYNqAYVVt
+EObjjvbdbUafwkTh
+EPDLKvbdcIljLGWx
+DnbjjvbdNHDPlotk
+EOcLKvbdkIHMFfOL
+EPDKjvbddePSCXDK
+EOcLKvbdbUafxLTh
+DoDKjvbdQlwaxmtz
+DoCkKvbdbQHHELzd
+EPDLKvbdhficZWKV
+DoDKjvbdqrVLOLAm
+DoCjjvbduDDUvvPP
+EPCjjvbdCEQAuilf
+EOcLKvbdEASIlywX
+DncLKvbdRNXayNtz
+EOcKjvbdVrOXaeMD
+EPCjjvbdFWYopNKF
+DnbkKvbdSQTfjFcw
+DoDLKvbdJTZAsMwl
+DoCjjvbdiCPDEvpq
+DncKjvbdVwIwuceH
+EPDLKvbdJvVFcdfi
+EPCjjvbdcbSlrATm
+DnbjjvbdqBJFAXIE
+EPCkKvbdTAFJHbOd
+EPCjjvbdcTCkUEKB
+EPCkKvbdxwhibPzL
+EPCkKvbdRpTfifEX
+EPDLKvbdvAdYsOeI
+DncKjvbdpxngfpdY
+EPCjjvbdEXwksstM
+DnbkKvbdNrsufeUp
+DnbkKvbdJKEAJogE
+DoCkKvbdNsUWGduQ
+DoCkKvbdbrcLTcjB
+EOcKjvbdiHJcZViu
+EObkKvbdEztQdkcJ
+DoCjjvbdliETptqa
+EOcLKvbdOEdUIhjd
+DoCkKvbdSKxfVGkT
+EPCjjvbdIsZAsMxM
+EOcKjvbdZsiIyDsO
+DncLKvbduDCtwWOo
+DnbkKvbdEztQdlCi
+DnbjjvbdLZQjSztf
+DoDLKvbdXmqAXuVt
+EPCjjvbdxsOJNSCH
+DoDLKvbdRadElJZL
+EOcLKvbdWRnXbEkc
+DncKjvbdSCEFLiYk
+EPDLKvbdidkHVPAO
+DoCjjvbdkClKqGtg
+EPDKjvbduLxXBUAw
+DncLKvbdqUTfqqkU
+EObjjvbdcImKKevx
+DoDLKvbdMgCpMpVL
+DnbjjvbdtTRsYydc
+DnbkKvbdKefHbBQu
+EOcKjvbduoTzpjnt
+DoCjjvbdjuwNcaww
+DncKjvbdTkvPBVni
+EPDLKvbdapGfdLzd
+EPDKjvbdvAdZTPEh
+EPCkKvbdwXLaVaWV
+EOcKjvbdZoNhddyj
+DncKjvbdqceIonVa
+DnbjjvbdIwsbHkqQ
+DoDKjvbdjFKfuPAO
+EOcLKvbdbhmJkFvx
+DncKjvbdDxYMUUTl
+DnbjjvbdMfbpNQVL
+DoDLKvbdZeXfzhIb
+EOcLKvbdVAbRSpqy
+DncLKvbdZxcjOCkr
+EOcKjvbdyTNiNSCH
+EObkKvbdiLddOUcZ
+DoCjjvbddwystRez
+DoDKjvbdUsmTelWK
+EPDLKvbdEPCjkWcE
+DoDKjvbdIwsaglQp
+EObkKvbdGcjvJbKK
+DoCkKvbdRzJgrbvA
+EObkKvbdkxsSSxft
+DncLKvbdfHjvSNpg
+DnbkKvbdxsNiMqag
+DoDLKvbdcImKKevx
+EOcLKvbdJutfDdgJ
+DoDLKvbdhancEwRR
+EObkKvbdnPzYvKyC
+DoDKjvbdNHDPlouL
+EPCkKvbdKaKgMbXq
+EOcLKvbdqUTgSRkU
+EPCkKvbdZjSgpHBf
+DncLKvbdHffzYxXg
+DoCkKvbdFkErbhMu
+EObjjvbdhancEwQq
+EPDKjvbdJYUCHkpp
+EPDKjvbdtkwwBUAw
+EOcLKvbdiZuGMRNf
+EObkKvbdrJAKElne
+DnbjjvbdIHHZxwwg
+EPDKjvbdkHgMGGNk
+DoCjjvbdeOeSjtUS
+DoDLKvbdJbicQjCx
+DncKjvbdnGeXlnGy
+EPDKjvbdKVtecdfi
+EOcKjvbdULuoBVni
+DnbkKvbdmJDtRVRa
+DncLKvbdJTZAsMxM
+EPDKjvbdVgxVxHYz
+EPCjjvbdVBCRSqSZ
+EPCjjvbdJqZdnfOF
+DncKjvbdqdEiQOVa
+DnbkKvbdZLqdTnLm
+EOcKjvbdzHZMANFX
+DncKjvbdVrNxBdkc
+DnbjjvbdKkAgvAKZ
+DnbjjvbdmbKWxOnV
+DoDKjvbdYqMeImEq
+EObjjvbdbUagYKtI
+DncKjvbdQZNAHSqj
+DoDLKvbdfoazvcwh
+DnbkKvbdVvhwvDdg
+DoDKjvbdURQoUthN
+EPDLKvbdvBDyTOeI
+DnbjjvbdrRuKmkBN
+DnbkKvbdRbDdlIxk
+EObjjvbdSCDdkhyL
+DoDKjvbdSBceMJYk
+DoDLKvbdwyhGGYFS
+EPDKjvbdQvmcblID
+DoDLKvbdaaWFGQQX
+DoDKjvbdEASImZvw
+EPDLKvbdnQZyWLYb
+EPDKjvbdbrcLUEJa
+EOcLKvbdKCicQjDY
+EPCjjvbdVBCQsQqy
+EPCkKvbdkaNPNALA
+DncLKvbdaNKartmH
+DoDLKvbdCTAbtFvr
+EObjjvbddZxowxpb
+EObkKvbdTpqOuUgm
+DncLKvbdZQleJNFR
+DnbjjvbdUVlPisaR
+EObjjvbdBsBCtFvr
+EPCjjvbdJutecdgJ
+EOcKjvbdfNFvgNKL
+DncKjvbddneSjtUS
+DoDKjvbdjcMKqGtg
+EOcLKvbdGdLWKCKK
+EOcKjvbdRDcBPpdS
+DoCkKvbdauCGwkTh
+EPCjjvbdaNLCStmH
+EOcKjvbdelfWgMjL
+DoDLKvbdtSrSxyeD
+EPCjjvbdemGXGmKL
+EOcLKvbduDCuXWOo
+DncKjvbdauBfxLUI
+DnbjjvbdIHGyyXwg
+EPCjjvbdEvYooljF
+EObjjvbddneTLUTr
+DoCjjvbdySmiNRag
+DoDKjvbdqUUHSRjt
+EObjjvbdczYpXxpb
+EObkKvbdaMkBrtlg
+EPDLKvbdnUuZkKRf
+DoDKjvbdcScKsdJa
+EPCjjvbdsrrTYydc
+EObjjvbdZoNiFEyj
+EPDLKvbdmttyjirG
+EOcLKvbdYqMeIleR
+DoDKjvbdKWUfEFGi
+EOcLKvbdcyxoxYqC
+EObkKvbdNeETiJLE
+EPCkKvbdUMWOaVoJ
+EPCjjvbdWSOXbElD
+EPCkKvbdNHCpNPuL
+EObkKvbdEuyQQNJe
+DoCkKvbdmgExNOGy
+EOcKjvbdZtJJYcsO
+EOcLKvbdMpXqVnGs
+EObjjvbdbsDLTcjB
+EPCjjvbddoFTLUTr
+EOcLKvbdaNKbTVNH
+DoCjjvbdJcKCpicY
+DoDLKvbdsBfMlGjy
+EPDKjvbdqiAJdlne
+EObkKvbdKefHaaRV
+DoDLKvbdbiNJjewY
+EPCkKvbdVTltFlWK
+DoDLKvbdbBWFGPpX
+DncLKvbdVZITzKoO
+EPCjjvbdnUtzLKSG
+EPCkKvbdBraDTevr
+EPDLKvbdTkunaWPJ
+EObjjvbdZRNFJNEq
+DnbkKvbdxUldqYkn
+EPDLKvbdtvOYJpsA
+EOcLKvbdJvUfEEgJ
+DoDKjvbdlYrqsZGt
+DncKjvbdePFSjstS
+EPDLKvbdqquLOLAm
+DoCkKvbdSPtHKFdX
+DoCjjvbdZyDjNcMS
+EPDKjvbdTlVnaWPJ
+EPCjjvbdZirgpHCG
+EObkKvbdNQYQvNfs
+DncKjvbdqqtjnLBN
+DoDKjvbdjJehJmYS
+DncLKvbdrNZixlHi
+EPDLKvbdMfcPlpVL
+EPCjjvbdUWMQJtBR
+DoCkKvbdfMfWfljL
+DnbjjvbdaRfDHtFk
+DncLKvbdiMFDnVDZ
+DoCkKvbdXrkaNToY
+DoCjjvbdZLqdUNlN
+EObkKvbdRjxetfkT
+EOcLKvbdmgFXmOGy
+EPDKjvbdUQpntuHm
+DoDKjvbdpstHRrKt
+DncLKvbdHkazmwRL
+EObjjvbdpfEFUWAh
+DoDKjvbdZyEJnDMS
+EObkKvbdiBoCeXQq
+DoCkKvbdeATplxKG
+DncLKvbdWRmwadkc
+EPDKjvbdUQqPUthN
+DoCjjvbdnBjXXnmu
+EPDLKvbdZjTIPfbG
+EPCkKvbdWHwuxGxz
+DncKjvbdYpmFJMdq
+DoDKjvbdhbPDFXRR
+DnbkKvbdBdQBVimG
+DoCjjvbdmIctRUqa
+EPDKjvbdZyDjNbkr
+EOcLKvbdQYmAHSrK
+DnbjjvbdqYoHgQcx
+DncKjvbdqiAKFMoF
+DncKjvbdOTUWHEuQ
+DoCjjvbdVTmTfLuj
+DoCkKvbdddoRbWcK
+EPDKjvbdIsYaTNYM
+EObkKvbdRosfiedX
+EOcKjvbdcTDLUEKB
+EOcLKvbdmozYujxb
+DnbjjvbdZirgogBf
+EPCjjvbdKWUeceHJ
+DnbjjvbdZoOJEdzK
+EPDKjvbdEJhKVwjA
+DoCkKvbdfpBzvcxI
+DoDKjvbdlrYtysDi
+DoDLKvbdZjSgofbG
+DoCjjvbdUtMtGMVj
+EPCjjvbdGGKRmiTq
+EPCkKvbdQvnDcMID
+DnbkKvbdKCjCqJbx
+EPCkKvbdYpleImEq
+DoDLKvbdjKFgjNXr
+DoDLKvbdZshhxcrn
+EPDLKvbdnVVZjjRf
+EOcKjvbdqdFIpNua
+DnbjjvbdVwIxVdEg
+DoCkKvbduaEZSneI
+DnbkKvbdznoqFClY
+DoCjjvbdoAKzsgcn
+EOcKjvbdSLZGVGkT
+DncKjvbdiCObeWqR
+EPCjjvbdWRnXbEkc
+EObjjvbdRotGiecw
+EObkKvbdKDKDQibx
+DnbjjvbdlYsRsYft
+EOcKjvbdUaBqSprZ
+DoCjjvbdhkdcmuDZ
+EOcKjvbdjgflFfNk
+DoCjjvbdGKdrcINV
+EOcLKvbdEJgjVxKA
+EObkKvbdSxKkmzkY
+DnbjjvbdsZkosBIO
+DoCjjvbdBvzchePv
+EObkKvbdGYtuBEXb
+EPDKjvbdiLeENtby
+EPCkKvbdRNXbYnUz
+EObjjvbdfHkWRnQg
+EObkKvbduDDVXWOo
+DoCkKvbdJbjCqJbx
+EPDLKvbdpedFTvBI
+DncLKvbdjJegjMwr
+EPCjjvbdUxgszLPO
+EObkKvbdxmrhXsJD
+EOcKjvbdJSxaSmXl
+EPDLKvbdfNFwGmJk
+EPDKjvbdsrrTYydc
+DncKjvbdhgKDZVjV
+EPCkKvbdZMRctNkm
+DoDKjvbdezuyEhtX
+EPCkKvbdEXwlUTsl
+EPDLKvbdeAUQlxKG
+DoDKjvbdZnmiEdyj
+EObkKvbdrzMPraIO
+EPCjjvbdxxIibPyk
+EPCkKvbdKfFgbBRV
+DoDKjvbdyzeORhIh
+DnbkKvbdbAvFGPpX
+DncKjvbdZoOJEdyj
+DnbkKvbdrJAJdmOe
+DoDKjvbdKVuFdEfi
+EOcKjvbdqdFJQNvB
+EPDLKvbdOEctIhkE
+EPDLKvbdvBEYsOeI
+DncKjvbdHELVjBjK
+DncLKvbdZshhyDsO
+EPDKjvbdGdKuibJj
+DoCkKvbdEYXkstUM
+DnbjjvbdJpyeOfNe
+EPDKjvbdzoPpdbkx
+DoCkKvbdMSXMytpz
+DncLKvbdqZOggQcx
+DoDKjvbdmuUyjirG
+DnbkKvbdNVSqkNAX
+DncLKvbdRotHJfEX
+EOcKjvbdZyEJnCkr
+EPDLKvbdyYJKBpZk
+DnbkKvbdxmrgxTJD
+DnbkKvbdhaoDFWqR
+DncKjvbdbhmJjevx
+EObjjvbdSKyGVGjs
+DnbjjvbdSKxfVHKs
+DnbjjvbdqdFIomua
+DnbkKvbdkHflGGOL
+DoDLKvbdqGDeUVaI
+EObjjvbdjmBlZeHP
+EPCkKvbdmttykJrG
+DncLKvbdRXOEDLgc
+DoDLKvbdhaoDFWqR
+DoDKjvbdvvkaWAuu
+DoCkKvbdbhmKKfWx
+EObjjvbdSBdFMJZL
+DnbjjvbdnUuZjjSG
+EPDLKvbdliDtQuSB
+EOcLKvbdsCFmMGjy
+DnbjjvbdtunXjQsA
+EObkKvbdkCkjqHUg
+EObjjvbdDoCkKvbd
+DnbkKvbdiZuFlROG
+EOcKjvbdRNYCZNtz
+EOcLKvbdxUmEpxlO
+EPCkKvbddePSBwDK
+EOcLKvbdauBfxKsh
+DoCjjvbdtkwwBTaX
+EObjjvbdmgEwmNfy
+DnbjjvbdOStWHEuQ
+EPCkKvbdGLFTChNV
+EPCkKvbdKDJbpjDY
+DoDLKvbdnPzZVjxb
+DoCjjvbdFVyPomJe
+DncLKvbdACqwizIp
+EPCkKvbdZirhQGaf
+DncKjvbdtTRsZZeD
+EObkKvbdLBLHMbYR
+EOcLKvbdrNZjZLgi
+EObjjvbdTXkLmzkY
+EPCkKvbdBsAbsfXS
+EOcKjvbdeATpmXif
+DoCkKvbdMSWmZuQz
+DncLKvbdVTmTfMVj
+DoDLKvbdZxdKODMS
+EPDKjvbdZjShPgCG
+EPDLKvbdxVMdpxkn
+EPDLKvbdcSbjsdKB
+EPDLKvbdiifIJlwr
+DoDKjvbdKQydoFnF
+EObkKvbdegkWRmpg
+EObkKvbdiBncFXQq
+DoDLKvbdNdctJJLE
+EOcKjvbdUyHszKnn
+EOcLKvbdSQUHKFcw
+EObkKvbdUaBqSprZ
+DoCkKvbdSCDeLiZL
+EPCkKvbdKDKCpjCx
+EPDLKvbdwygfFweS
+DoDKjvbdiVZeWqtb
+DoCjjvbdMRwMyuQz
+DoCjjvbdsCGNLfkZ
+DoCkKvbdmRxuZsEJ
+EPCkKvbdkDMLRGtg
+EObkKvbdGdKuibJj
+EPCkKvbdePFTLUTr
+EOcKjvbdXrlAlsoY
+DoDLKvbdZjTHogBf
+DnbjjvbdZirhQGaf
+EPCkKvbdFVxooljF
+DoCkKvbdbKkeoNcA
+DoDKjvbdqYngfqEY
+EPDLKvbdrWokcJYq
+DoCkKvbdMowqVnHT
+EPCkKvbdqqtjnKaN
+DoDLKvbdiCPDFWqR
+DoDLKvbdeJiqutzn
+EObkKvbdqcdiPmvB
+EPCjjvbdMgComQUk
+DoDLKvbduVnYKQsA
+DnbjjvbdjhHLfFmk
+EOcKjvbdVvhwvEEg
+DnbkKvbdZtIhyESn
+DncLKvbdznopeClY
+EPCkKvbdwtldqZLn
+EOcKjvbdeEnrBwDK
+DoCkKvbdkxrqsZHU
+DoDKjvbdijGHimYS
+DncLKvbdfNGWgMjL
+EOcKjvbdmbKWxOnV
+EPCkKvbdhtzEvrVC
+DoDLKvbdhfibyWJu
+DoCkKvbdXrkaMsoY
+DoCkKvbdzoPpdbkx
+EPDLKvbdSLYeuGjs
+EOcLKvbdqlyixlIJ
+EObjjvbdnVVZjiqf
+EOcLKvbdyNrhXriD
+DoCjjvbdRjyFtgLT
+EOcLKvbdkyTRryHU
+EPCjjvbdrykpTBIO
+EObjjvbdlqxtzSdJ
+EObjjvbdcarmSATm
+EOcKjvbdXsLaNToY
+EOcKjvbdlqxtysDi
+EOcLKvbdaMkCStmH
+DncKjvbdbAvFGPow
+EPDLKvbdTulQKTaR
+DncKjvbdXGYzUAOs
+DncKjvbdezuxeItX
+DnbkKvbdrykpTBIO
+DoCkKvbdxnShXsIc
+DoDLKvbdEPCjkXCd
+DnbkKvbdIxUBgkpp
+DnbkKvbdBiKbKhfK
+DoDKjvbdKNADygVB
+EObjjvbdADRxKZiQ
+EPCjjvbdMfcQMotk
+EObjjvbdSBcdkhxk
+EPDKjvbdNrtVgFVQ
+EPDKjvbdZMRdTnLm
+EObkKvbdehKvRnQg
+DoCkKvbdliETptqa
+DoDLKvbdEXwktUUM
+EObjjvbdBiLBjiFj
+EOcLKvbdRkYeuGjs
+EOcKjvbdmttzKjRf
+EObkKvbdxrmhmRbH
+DnbkKvbdyXiJaoyk
+EObkKvbdxmrgwsIc
+DoDLKvbdiZtfMQmf
+DnbkKvbdpxoHfpcx
+EObjjvbduaEZTOdh
+EObkKvbdqqtkNkAm
+DoDKjvbdxmrgxTIc
+DncLKvbdMgColpVL
+EPCkKvbdZnnJEeZj
+EPCjjvbdVYgszKoO
+EPCkKvbdBcpAuilf
+EObkKvbdlhdUQuSB
+EObkKvbdMIbLpxAS
+EPCjjvbdnVUyjirG
+DoDKjvbdKRZeOenF
+DnbjjvbduCbuXWPP
+DnbjjvbdssRsYydc
+EPCkKvbdlhctQtqa
+DoCkKvbdsQVoJcVf
+EObjjvbdegkWSNpg
+DoDLKvbdOAJTUKSA
+DoDLKvbdliEURVSB
+DoDKjvbdxsNhlqbH
+DnbjjvbdOSsvGdtp
+EPDKjvbdaaVeGPow
+EObjjvbdNeETiIjd
+DnbkKvbdJKEAJpHE
+EPCjjvbdANIYsWzY
+DoCjjvbdjvWmdCXw
+EPDKjvbdrouoJcVf
+DnbjjvbdiUzFWquC
+DnbjjvbdFxtuBEYC
+DnbjjvbdRkYfVHLT
+EObjjvbdQwNccMID
+DoCjjvbdXsMAmTnx
+DoCjjvbdjJfIKMxS
+EOcLKvbdbiMikGXY
+DoCjjvbdQdDAoqES
+EPCkKvbdVwIxVcdg
+EOcLKvbdCEQAvKMf
+EPDLKvbdzROmJKXA
+EPDLKvbdZLrDsnLm
+DncKjvbdjggMGFmk
+DnbkKvbdddnrBvcK
+DnbjjvbdpecdsvBI
+EPCkKvbdijFgjNYS
+EOcLKvbdUaBqTQqy
+DncKjvbdkHgMFfNk
+EObkKvbdZGvdAPSi
+DnbjjvbdqUTgSRjt
+DoDLKvbdqvpLcIyR
+DncLKvbdLqvlytpz
+DnbkKvbdKDJbpjCx
+DoCjjvbdlqyUyrci
+DnbkKvbdUQqPUuIN
+EObkKvbdTlVnaVni
+EOcLKvbdNdcshiLE
+EObkKvbdkDMLRHUg
+DncKjvbdIxTbILpp
+EPCkKvbdePFTKssr
+DnbjjvbddeOrCWcK
+DnbkKvbdatbGxLTh
+EObkKvbdqlzKZLgi
+EPCjjvbdOTUVgFUp
+EOcLKvbdpfEFTvAh
+DncLKvbdZnnIdeZj
+EObkKvbdZxdKODLr
+DoDKjvbdjggLfGNk
+EPCjjvbdRDcAopdS
+DncKjvbdlZTRryHU
+DncKjvbdZshiYdSn
+EPDKjvbdatbHYLTh
+EPDKjvbdLAjfmCXq
+EPDKjvbdOFEUIiLE
+DncKjvbdxVNFQxlO
+DoCjjvbdrafNLfkZ
+DoCjjvbdGFiqnJTq
+EPCkKvbdUsmUFlWK
+EObkKvbdLBLHMbXq
+EPCkKvbdtlYWaUBX
+EPCjjvbdSPsfjGEX
+EObjjvbdIjEAJogE
+DoDLKvbdNHCpNQUk
+DncLKvbdYkqdUNkm
+DoCjjvbdqquKmkBN
+DnbjjvbdEuyQQMjF
+EOcKjvbdURRPUthN
+EObjjvbdmoyxvLYb
+EObkKvbdGYtuAdYC
+DnbjjvbdZeYGzhJC
+DoDLKvbdCgLfHAzc
+DoDLKvbdhuZeXSUb
+DoCkKvbdjlbMZdgP
+DoCkKvbdemGWgMjL
+EPCkKvbdxxJJaoyk
+EPDLKvbdqGEEsuaI
+EObkKvbdEKHjVwjA
+EOcKjvbdiBoDFWpq
+EPCkKvbdffLzNfgA
+EObjjvbdDoCjkXDE
+EPDKjvbdhficZWJu
+DoCjjvbdWWiYVdFH
+EPCkKvbdKQzFOenF
+DoCkKvbdmbJvxPOV
+DnbkKvbdtAHQhAAr
+EPDLKvbdmSYtzSci
+EPDLKvbddeOqavcK
+DoCjjvbdCEQBVjMf
+EPDLKvbdlYrqsYft
+DnbkKvbdJSyBTNXl
+EPCjjvbdcbSmSATm
+DoDKjvbdfNFwGmJk
+DoCkKvbdGLErbhNV
+EObkKvbdiZuFlQnG
+DnbjjvbdxUmEpxlO
+EPDKjvbdUWMPitBR
+EPDKjvbdrafNLfjy
+EPDLKvbdrWolDJZR
+EObjjvbdhbPDFXQq
+DncLKvbdqrUkNjaN
+DnbkKvbdBiLCKhej
+DoDKjvbdSCEFMIxk
+DoDLKvbdffLzNgHA
+EPCkKvbdZLqcsmkm
+DnbkKvbdZMSEUOMN
+DnbjjvbdzaAPHHCM
+DnbjjvbdCIkBjhfK
+DoCkKvbdZirgpHBf
+DnbjjvbdIwtBhLpp
+EObkKvbdeOeTLUTr
+EObkKvbdUxgszLPO
+EObkKvbdhzVGLqOG
+DnbjjvbdOTTufdtp
+EOcKjvbdZRNEhleR
+EPCjjvbdKyRKSzuG
+DoCkKvbdZtJJYcsO
+EOcLKvbdemGXGmKL
+EPDKjvbdJXsahMQp
+DoDLKvbdhbObeWqR
+EObjjvbdFVxpPljF
+EOcKjvbdaNLBruMg
+DoCjjvbdpyPIGpcx
+EOcLKvbdZMRcsmkm
+EOcLKvbdnGeXmNgZ
+DoDLKvbdjlalZeGo
+DoDLKvbdaSGDHtGL
+EPCkKvbdCTAbsewS
+EPCjjvbdZjSgofbG
+DnbjjvbdJutecdfi
+EPCkKvbdIryBSmYM
+DoCjjvbdfekzOHHA
+DnbkKvbdREDAoqES
+EPCjjvbdtTSTYzEc
+EPCkKvbdmoyyVkYb
+EObkKvbdmfdxMnGy
+DoCkKvbdwuNFQxkn
+DncKjvbdsBelkfjy
+EPDLKvbdQvmdDLhD
+EPDKjvbdBhkCLJFj
+DoCkKvbdeJiqutzn
+EOcLKvbdqTsfrSKt
+DoDLKvbdakLfOmcA
+DncKjvbdKaLHMawq
+EPCkKvbdznopdcMY
+DoDKjvbdZtJIyDsO
+DoDLKvbdsQVnjCvG
+DncKjvbduDDUvuno
+DoCkKvbdJYUCHlQp
+DnbkKvbdnBiwYPNu
+EObjjvbdlYrqryHU
+EPCjjvbdqcdiPnWB
+DoCjjvbdUQpoUthN
+EPDKjvbdsZlQTAhO
+EOcKjvbdtbbtwWOo
+EPDLKvbdJuuGDdgJ
+EOcKjvbdjggMGGOL
+EPDLKvbdHffyxwxH
+EOcLKvbdSCEElIxk
+EObkKvbdIwsbHkqQ
+EPDLKvbdjbkjqHUg
+DnbjjvbdnQZxujxb
+EPDKjvbddePRbWbj
+DoCkKvbdhtydwRuC
+DoDKjvbdCDoaWKMf
+EOcKjvbdRjyGVGjs
+EObjjvbddCTNSATm
+EOcKjvbdZLrETmlN
+EPDKjvbdlrZUysDi
+EOcLKvbdwtmFRZMO
+EPCjjvbdtTRrxydc
+EObjjvbdeFPSBvcK
+DoCkKvbdwuNFRZLn
+DnbjjvbdhytfLpmf
+EPCkKvbdrykpTAgn
+EObkKvbdRDcApRDr
+DoCjjvbdZnnIeFZj
+EOcLKvbdePErkUTr
+DoDLKvbdrbGNLgLZ
+EObjjvbdVZIUZjoO
+DncLKvbdzHYlAMeX
+DnbkKvbdbsDLTcia
+EPCjjvbdOSsufdtp
+DncKjvbdpstHSSLU
+DncKjvbduDDVWuoP
+EPDKjvbdiMEdNuCy
+EOcKjvbdtbcVWuno
+DoDKjvbdqUTgRqjt
+DncLKvbdZyDjNcLr
+DoDLKvbdRWmdDLgc
+DncKjvbdZLqdUOMN
+DoDKjvbdijGIJlwr
+EObjjvbduMYXBUAw
+DoCkKvbdHDkWJajK
+DoCjjvbdRpTfifEX
+DoCjjvbdUyHszKnn
+EPDKjvbdqZPIGpdY
+EPDKjvbdRWmdCkhD
+EObkKvbdsrrSyZdc
+EOcKjvbdYlSDtNlN
+DncKjvbdbKkennDA
+EPCkKvbdiZuGMQmf
+EPCkKvbdEztQeLbi
+EPCkKvbdaRebgsfL
+DoCkKvbdBcpAuilf
+EOcKjvbdyNsIYShc
+EPCjjvbdcIlijewY
+DoCjjvbdmbKXXoOV
+DncLKvbduDCtwWPP
+EPDKjvbdnCJwXoOV
+EPCjjvbdjcLkQgUg
+DnbkKvbdtcCtwVno
+DncKjvbdGFjRmiUR
+DncLKvbdrWpLcJYq
+DncLKvbdKWVGDdfi
+EPCkKvbdnUuZkJrG
+EPCjjvbdiCPCeWqR
+DncKjvbdEYYMUUTl
+EObjjvbdrpWOicWG
+DoDKjvbdFejSOIsq
+DnbjjvbdqiAJdmOe
+EOcKjvbdUyITzKnn
+DoDKjvbdfMfWgMjL
+DnbkKvbdXrkaMtOx
+DoCkKvbdKefIBaRV
+EPCjjvbdyTNhlqbH
+EPCjjvbdtlXwBUAw
+EOcKjvbdRosfjFdX
+DoCjjvbdYpldiMeR
+DnbjjvbdwzIFexFS
+DncKjvbdSCDeLhyL
+DncLKvbdrzLpSaHn
+DncKjvbduCcVWuoP
+DoDLKvbdatagXkTh
+DnbkKvbdsCGMlGkZ
+EPCkKvbdkWXNdBww
+DncKjvbdJcKCpjCx
+EOcKjvbdNxPVzdNt
+EPCkKvbdKRZeOfOF
+DncLKvbdcIljLGXY
+EPDLKvbdVhXuwfxz
+DoCjjvbdaoffckzd
+EOcKjvbdLhbLpxAS
+DnbjjvbdnHExMmgZ
+EObjjvbdbhljKfXY
+DnbjjvbdkDLkRGuH
+EPDLKvbdfHkWSORH
+EObjjvbdzoPqFClY
+DncKjvbdznopdbkx
+EObjjvbdnUtzLKRf
+EPCkKvbdZQldiMeR
+DoDKjvbdFjeScHmV
+EPDKjvbdEOcLKwCd
+EPDKjvbdyqOmJKXA
+EOcKjvbdSQTfiecw
+DoDLKvbdDoDLLXDE
+DoDKjvbdhlEcmuDZ
+EObjjvbdfHkWRmqH
+DnbkKvbdIGfzYwwg
+DncLKvbdUWMPjUAq
+EPDKjvbdkHflGGOL
+DnbkKvbdnPzZVjyC
+EPDLKvbdSBceLiYk
+DncLKvbdUtMsfLvK
+DnbkKvbdbrcLTdJa
+EObkKvbdIwtCHkqQ
+EPDKjvbdtbcVWvPP
+EObkKvbdtbcVWuoP
+DoDKjvbdKVtfEFGi
+EPCjjvbdMRvlytpz
+DoDLKvbdwuMeRYlO
+EOcKjvbdlhdTqVRa
+EPDKjvbdiGjCyVjV
+DnbjjvbdrDeJQNua
+DoDKjvbdrbFmMHKy
+EOcKjvbdfHjurNpg
+DnbkKvbdZRNFJMeR
+EOcKjvbdqFdEsvBI
+DnbjjvbdZirgogCG
+DoDLKvbdDncKjwDE
+DoCkKvbdjhGlFfOL
+EObjjvbdmaivxOnV
+EObkKvbdKkAhWAJy
+EOcKjvbdNrtWHEuQ
+DnbkKvbdFkFTChMu
+EObkKvbdeOdrjstS
+EOcKjvbdIwsbHlQp
+DoCkKvbdeATpmXif
+EOcLKvbdKaKgMaxR
+EObkKvbdUGznLvvF
+DnbkKvbdbLMGPODA
+EObjjvbdTkvOaVoJ
+EOcKjvbdsQVoKDVf
+EPDKjvbdznopdcLx
+DoDLKvbdpfDdsvAh
+DncKjvbdrDdhpNua
+EOcLKvbdhficZVjV
+DncKjvbdFxuVBEYC
+EPDKjvbdzjVQQETU
+EObkKvbdKRZePGNe
+EObjjvbdDncLLXDE
+EOcLKvbdYkqctNkm
+DoDKjvbdtvOYKRTA
+DoCkKvbdmajWxPNu
+DncKjvbdIjEAJofd
+EPCkKvbdiCPDFWqR
+EOcLKvbdIHHZxwwg
+EOcKjvbdYpmEiNFR
+EOcLKvbdQmYCZNtz
+EOcLKvbdVYhTykPO
+EPCkKvbdJKEAKPfd
+DoCjjvbdRkYfUfjs
+EPDLKvbdlZTSTZGt
+DoDLKvbdNGbpNQVL
+DoCjjvbdvAdZTOdh
+EPCjjvbdliDsqUqa
+EPDKjvbdSPsfiecw
+EOcKjvbdYlRcsmkm
+DnbkKvbdwXMAvBVu
+EPCkKvbdRjxfVGjs
+EOcLKvbdCIkCKiFj
+DoCkKvbddxZssrFz
+EOcKjvbdREDApRES
+EOcLKvbdTpqPVVIN
+EObjjvbdaaWEeoow
+EOcKjvbddeOrCXCj
+EOcLKvbdAMgySvyx
+EPDLKvbdNPwqVnHT
+EObkKvbdwuMeRYlO
+DoCkKvbdTkuoAuoJ
+EPDKjvbdmJDspuRa
+EPCjjvbdNHCpNQVL
+DncKjvbdGcjvKBij
+EOcKjvbdbQHHELzd
+EPDKjvbdPxmAGrqj
+EPCjjvbdRbDdkiYk
+EPDLKvbdTAFJHand
+DoDKjvbdqmZjZMHi
+EObjjvbdtSrTYzFD
+DncLKvbdhlEcmtby
+EObjjvbdmJEUQuSB
+DncKjvbddndsKstS
+EPDLKvbdmgFYNOGy
+DnbjjvbdSCEElIyL
+DncKjvbdmaivxOmu
+DoDKjvbdFVyPomKF
+DnbkKvbdMpXqWOHT
+EObjjvbdKefICBRV
+EObjjvbdqGDdtWBI
+DnbkKvbdCJLCLIfK
+EObkKvbdLqwNZtpz
+DoDLKvbdiifHjMwr
+DoCkKvbdddoRawDK
+DncKjvbdbrcKscjB
+DnbjjvbdrSVLNkAm
+DnbjjvbdffLynHHA
+EObkKvbdTAFJHbPE
+DncKjvbdDncKkWcE
+EOcLKvbdrouoKDVf
+EOcLKvbdZisIPfbG
+EOcLKvbdiGicYuiu
+DoDLKvbdVgxWXfxz
+DoCkKvbdffMZmgHA
+EObjjvbdWfZZtAPT
+EPDLKvbdEzsqElCi
+DoCkKvbdYSlAlsoY
+EPDLKvbdFWYpPmKF
+DoDKjvbdkNCMZdfo
+EPDLKvbdehLWSOQg
+DnbjjvbdxxJKCPyk
+EOcLKvbdMfcQMpVL
+EOcLKvbdnVVZkKRf
+EObjjvbdczYoxZQb
+EPCkKvbdSQUGiedX
+DoDKjvbdeuzwpJzs
+DoDLKvbdqZPHfqDx
+DoCjjvbdKeehCBQu
+DnbkKvbdADSYJyiQ
+DoCjjvbdFkFTDHlu
+EPDKjvbdZoOJEdzK
+EPCjjvbdZjTIQGbG
+DncKjvbdZHWdAOri
+EPCjjvbdeXystRez
+EObkKvbdIxTagkpp
+EObjjvbdxZgfFxEr
+DoDLKvbdjhHLfGNk
+EObkKvbdTfznMWue
+DoDLKvbdOSsufeVQ
+DncKjvbdVUNTelWK
+EPCjjvbdZQmFImEq
+DnbjjvbdkClLQftg
+DnbjjvbdRXNdDLhD
+DncKjvbdTqQoVUgm
+EPCjjvbdNQYRVmgT
+DoDLKvbdnUuZjiqf
+DoDKjvbdbsCjsdJa
+EOcKjvbdFkEsDINV
+DoDKjvbdyOTHxSiD
+EOcKjvbdkMbMZdgP
+DnbkKvbdeEnqavcK
+DoCkKvbdxZhFfYEr
+DncKjvbdNPxQunGs
+EOcLKvbdOYOuzdNt
+DncKjvbdJbicRKDY
+DncKjvbdjAQHAofj
+EOcKjvbdWWiYVcdg
+DnbjjvbdjFKftoAO
+EPCkKvbdTXkLmzjx
+EPCkKvbdWSNxBeMD
+DoCkKvbduMXwBTaX
+DoDLKvbdLBKfmBxR
+DoCjjvbdEObjjwDE
+EPDKjvbdTlVnaVoJ
+DoDLKvbdhgJcZViu
+EObjjvbdatbHXjtI
+EOcLKvbdZeXfzgiC
+EPCkKvbdeFPRbXCj
+EPCkKvbdZQleJMdq
+DnbjjvbdUWLojUAq
+EPCjjvbdFaOpyJzm
+DnbkKvbdANIYrwZx
+EPCkKvbdbBWEeopX
+DoDLKvbdczYpYYpb
+EPCkKvbdbVBfxLTh
+DoDKjvbdLBKflawq
+DoCkKvbdyOSgxSiD
+EPDKjvbdkDLkQgVH
+EObkKvbdjmBlZdfo
+EPDKjvbduoTzqLOt
+EOcLKvbdaRebhUFk
+EPDKjvbdatbGwjtI
+EOcLKvbdCIjbLIfK
+DncKjvbdkIGkeemk
+DncKjvbdxVMeRZMO
+EOcKjvbdRXODcMHc
+DnbjjvbdqquLOLAm
+DoDKjvbdDHLfHAzc
+DoCkKvbdnVVZkKRf
+DoDLKvbdGcjvJbKK
+DoCjjvbdzoQRFDLx
+DoDLKvbdmuUzLKRf
+EPDLKvbdtumwiqTA
+EOcKjvbdmJDsptrB
+EPCjjvbdIGgZxwwg
+EPDLKvbdxLXDgzzG
+DnbkKvbdQwNdCkhD
+DnbjjvbdcasNSAUN
+EPCkKvbdTulQKTaR
+EOcKjvbdhgJbyVjV
+DoDLKvbdKVteceHJ
+DnbjjvbdHgGzYwxH
+EPCjjvbdxnSgxTJD
+EPDKjvbdyYJKCPzL
+EOcKjvbdOFDtJJKd
+EObkKvbdRadEkhxk
+DoCkKvbdiifHjNXr
+DoCjjvbdnUtyjirG
+EObkKvbdJpydoGNe
+DoDKjvbdZLqctOLm
+DnbkKvbdsBfMkfkZ
+EOcLKvbdOStWGeVQ
+EPDLKvbdijGIJmYS
+DoDLKvbdxxJJbQZk
+DncKjvbdHbLydzAD
+EOcLKvbdyTNiMqag
+EPDKjvbdMgComQVL
+DoDLKvbdzitoocsU
+EPDKjvbdsBfMkfjy
+DoCkKvbdFyUtaEYC
+DoDLKvbdJKEAJpGd
+DoCkKvbdygZMAMeX
+EPCkKvbdJqZdoFnF
+DnbkKvbdiBnbdvqR
+EOcLKvbdSQUGjFdX
+DnbkKvbdmSYtzTEJ
+DoCjjvbdehKvSOQg
+EOcLKvbdGckVibJj
+DncKjvbdhficYvJu
+EPDKjvbdwuMeRYkn
+EOcLKvbdFejSNiUR
+EPCjjvbdOFEUJJLE
+DnbkKvbdXsLaMtOx
+EPDKjvbddZyPxYpb
+EPCkKvbdhzVFkqNf
+DoDKjvbdOEdUIiLE
+EPCkKvbdnGeXmOHZ
+EObkKvbdiMEdNuCy
+DoDLKvbddoFTLTtS
+EObkKvbdIxTbHlQp
+DncLKvbdZRMdhmEq
+DoDLKvbdZnmheEyj
+EPDKjvbdKeegbApu
+DncLKvbdNVTSLNAX
+EOcKjvbdKDJbqKCx
+EPCjjvbdFfKSOIsq
+EPCjjvbdxnShYSiD
+EOcLKvbdOStWHFVQ
+DncLKvbdsPvOicWG
+DnbjjvbdxnTHwsJD
+DoDKjvbdLAkGmBwq
+DoCkKvbdwMvAMceN
+EOcLKvbdmRyVZsDi
+EPCkKvbdmpZyWKyC
+DoDLKvbdrykpTBIO
+DoCjjvbdVgwvYHYz
+EPDLKvbdTvMPjUBR
+EOcLKvbdgFkzOGgA
+DnbkKvbdVBBpsRRy
+DnbjjvbdRzKISbvA
+EObjjvbdxnTIXsJD
+EObjjvbdZoOJEdyj
+EPCjjvbdHDjuibKK
+EPCjjvbdezuxdiUX
+EOcKjvbdYTMAmToY
+EObjjvbdJYTbILpp
+DoDKjvbdkClLRHUg
+EPDKjvbdTkvPAvPJ
+EObkKvbdeAURNXjG
+DncLKvbdTukpKUBR
+DoCjjvbdcTDKsdJa
+DoDKjvbdBsAcUGXS
+EObjjvbdDoCjjvcE
+EOcKjvbdtlYWaTaX
+DnbjjvbdRDbaPpcr
+EPCjjvbdrylPsAgn
+DoCkKvbdOhAYZAYa
+DnbjjvbdiUydwSVC
+DoCjjvbdwzIFfYFS
+DoCkKvbdZshiZDrn
+DoCkKvbdZoOIddyj
+DncKjvbdpssgSSKt
+EPCjjvbdrSUkNkBN
+EPDKjvbdjJfIJlxS
+EOcLKvbdxVNFRYkn
+DoDKjvbdWWhwvEFH
+DncLKvbdRDcBQQcr
+DnbkKvbdliETpuRa
+EPCjjvbdZRMdiMeR
+DnbkKvbdiMEdOVCy
+EPCjjvbdznpREbkx
+DoCkKvbdwzIFexFS
+DnbjjvbdmSYuZrdJ
+DoDLKvbdCWzchdov
+EPDLKvbdpfEFTvAh
+EPDLKvbdyOTIYTIc
+DncKjvbdNQXqVnHT
+DoDLKvbdCgMFgAzc
+EOcKjvbdIwtBgkpp
+EPDKjvbdRjyGUfjs
+EObjjvbdACqwjZiQ
+DoDKjvbdpstGrSKt
+DnbkKvbdnGdwmOHZ
+DncKjvbdiZtfLpnG
+DoDLKvbdaSGCgtFk
+DoCkKvbdFfJqnIsq
+EPCkKvbdkNCLzEgP
+EOcKjvbdFeirOJTq
+EOcLKvbdUtNUGMWK
+EObkKvbdSQUHJfEX
+EPCkKvbdqquKmkBN
+DnbjjvbdbhmKKfXY
+DoCkKvbdIsYaTNXl
+DoCjjvbdZoNheFZj
+EOcLKvbdBhjbLIfK
+EOcKjvbdatafwjsh
+DoCjjvbdkxrrSyHU
+EPDLKvbdSCEElIxk
+EOcKjvbdfMevfmKL
+EPCjjvbdMJBlRYAS
+DoCjjvbdSxKkmzkY
+DnbkKvbdkNCLydgP
+EObkKvbdkxsSTZHU
+DoCjjvbdRpUGiedX
+EOcKjvbdjblLRGuH
+EObkKvbdyTNiMrCH
+DnbjjvbdZeXfzhJC
+DoDKjvbdZxdJmblS
+DncKjvbdOStWHEuQ
+DoCkKvbdyNsHwsIc
+EPDKjvbdkxrqryHU
+EObjjvbdZLqctNlN
+DoDLKvbdxnSgxShc
+EPDLKvbdnBjWwoNu
+DoDKjvbdkIHMGGOL
+EObjjvbdqUUGrRkU
+DncLKvbdRjyGVHKs
+EPDKjvbdhfjCyWJu
+EPCkKvbdHELVjBjK
+DncKjvbdgQBzvcwh
+DoDLKvbdVAaqSpqy
+DoCkKvbdySnJNSBg
+DoDLKvbdpeceUWAh
+DncLKvbdaRebgsfL
+EOcKjvbdZLqctNlN
+EObjjvbdtbbtvvPP
+DoCkKvbdZMSDtNlN
+EOcKjvbdsBelkfjy
+EPDLKvbdTpqPVVIN
+DnbjjvbdBiKbKhfK
+DnbjjvbdOFEUIiKd
+EPCkKvbdSiZjRAAl
+EObkKvbdwjwDgzyf
+EPCjjvbdhlEdNtby
+EPCjjvbdhtydwSUb
+EOcKjvbdnQZyVjyC
+DoDKjvbdRzKIScWA
+EOcLKvbdLBLHNCXq
+DoDLKvbdssSTYzFD
+EObjjvbdEvYpPlie
+DncLKvbdhficYvKV
+EPCjjvbdnUuZkJqf
+DnbjjvbdXnRAXtut
+EPDKjvbddijRutzn
+EOcLKvbdEvYpPljF
+DoCjjvbdTulQKUAq
+EObkKvbdxmsIYShc
+EPDLKvbdkyTRryHU
+EObjjvbdCEQAvKNG
+EObjjvbdGYuVBEYC
+EPDKjvbdvAdYsOeI
+EObjjvbdRpUHKGEX
+EPCkKvbdKDJcQjDY
+DoDLKvbdunszqKoU
+DoCjjvbdJvUfEEfi
+DncLKvbdrpWPJcWG
+DoCkKvbdajkfPNcA
+DnbjjvbdFpATXHFy
+EObkKvbdFfJrOJTq
+DncLKvbdZnnJFEyj
+DoCjjvbdOEctIiKd
+EPDLKvbdVhXuxGxz
+EPDKjvbdySmhlrCH
+EOcKjvbdiGjDZWJu
+DncKjvbddZyQYZRC
+DncLKvbdziuPpETU
+DncLKvbdJTYaTNXl
+EPCjjvbdNddThiKd
+DnbkKvbdbAudepPw
+EOcKjvbdMowpunHT
+DoDLKvbdmbKXYPNu
+DoDLKvbdezvZEiTw
+DnbjjvbdrMyixkgi
+DnbkKvbdKWVGEFGi
+DoCjjvbdkDLjpftg
+DnbjjvbdJqZePFme
+EObkKvbdDwxLsssl
+EPCjjvbdmoyyWLYb
+EPCkKvbdFjdrcHmV
+DoCkKvbdDwxLtTsl
+EOcLKvbdoAKztHdO
+EPDLKvbdTkuoAuoJ
+DncLKvbdURRPVVHm
+EPCkKvbdKCicRJcY
+DoCkKvbduDCuXWOo
+DoCjjvbdRXNdDMID
+DoDKjvbdBcpBWJlf
+DoCjjvbdTqROttgm
+DncKjvbdRadFMIxk
+DoDLKvbdCSaDTewS
+EOcKjvbdQlxCYmtz
+DncLKvbdeOeSkUTr
+DnbkKvbdTqQntthN
+DnbjjvbdhbObdvpq
+EPDLKvbdMowqVmgT
+DncKjvbdANIZTWzY
+EPDLKvbdiVZeXRtb
+DncLKvbdYNqAXtvU
+EOcKjvbdfIKurNpg
+DoCkKvbdFpATWfey
+EPCjjvbdHkazmwRL
+DoDKjvbdJvUfDdgJ
+EPCkKvbdSBdElIxk
+DoCkKvbdbsCjtEJa
+DoDLKvbdvBEYsOdh
+EOcLKvbdGGJqmhsq
+EOcLKvbdJSyBSlxM
+DncLKvbdnQZxukZC
+EOcLKvbdySnIlrCH
+DoCjjvbdIjEAKPgE
+DoDLKvbdhlEcnVDZ
+EPDKjvbdZeYGzghb
+EPDKjvbdbKlGOnDA
+EPDKjvbdkMbMZdgP
+EOcLKvbdDoCkKwCd
+DnbjjvbdLBLGlbXq
+EPDLKvbdZxcinCkr
+DoCkKvbdqTsfrRjt
+DoCkKvbdADSYJzIp
+DoDKjvbdbUagYKsh
+EObjjvbdjAQHAofj
+EOcKjvbdDoDKkXDE
+EPDKjvbdSZigsCvA
+EPCkKvbdKRZePGOF
+EPCjjvbdKaKgNCXq
+EObkKvbdxxJKBoyk
+EOcKjvbdxmrgwsIc
+DnbkKvbdmozYvKyC
+DoCkKvbdqquLOLAm
+EObkKvbdDncLLXCd
+EPDLKvbdjcMKpftg
+EPCjjvbdwkXDgzzG
+DoDLKvbdHffyxwwg
+DoCkKvbdvAdZSneI
+EOcLKvbdrovOjDVf
+EOcLKvbdsPuoJbuf
+DoDLKvbdySnJNSBg
+EObkKvbdXsMAltOx
+DncLKvbdFfKSOJTq
+EPCkKvbdddnrCWcK
+DoCjjvbdySmhlrBg
+DnbjjvbdNxPVzcnU
+DncKjvbdhtzEvrVC
+DoCjjvbdQwODblHc
+DoDLKvbdjcLjpgVH
+EOcLKvbdbKlGOmcA
+EPDKjvbdfMfWflik
+DncKjvbdmbJwXnmu
+EOcLKvbdTkuoAvOi
+DnbjjvbdsZkoraIO
+DoDKjvbdZMSEUOLm
+EOcLKvbdsCFmLfkZ
+DncKjvbdUxhTyjnn
+EPDKjvbdRosfjGEX
+EOcLKvbdmuUzKirG
+EPCkKvbdGGJrOItR
+EObjjvbdEXwktUUM
+DnbkKvbdiifHimXr
+EPDKjvbdmJDspuSB
+EObjjvbdwyhGFwdr
+DncKjvbdatafwkUI
+EPDLKvbdYNqAXtut
+DoDLKvbdEPCkLWcE
+EOcLKvbdqceJQOWB
+EPDKjvbdySnJNSBg
+DnbjjvbdyzdnSIIh
+DoDKjvbdrDdiQNvB
+DoCkKvbdYkqdTnLm
+DoCkKvbdlZTSTYgU
+EPDKjvbdMpXqWNfs
+EObkKvbdJbicQjDY
+DoDLKvbdGAoRYizm
+DncKjvbdmgExNOHZ
+DoCjjvbdznoqFDLx
+EOcKjvbdieLGtoAO
+DoCjjvbdMfbpMotk
+EObkKvbdyzdnSHiI
+EObkKvbdcSbjscia
+DoDKjvbdNGcQNQUk
+EPDKjvbdNGbpMpVL
+DoDLKvbdUQqPVUgm
+DnbjjvbdVvhwuceH
+EPDKjvbdDxXkstTl
+EPCjjvbdPyNAHTRj
+EPDLKvbdeOdsLTtS
+DoDKjvbdTAEiICPE
+DoDKjvbdZisIQGaf
+EObkKvbdxVMdpxkn
+EPCkKvbdnUtzKjRf
+EOcKjvbdhtydvrVC
+DoDKjvbdbrcLTcia
+EPDLKvbdbhlikFvx
+EPDKjvbdANIZSwZx
+EPDKjvbdtbbuXWOo
+EObjjvbdliDtQtqa
+DncLKvbdGLFScIMu
+DnbkKvbdfMfXGljL
+EObkKvbdCTBDTewS
+EPDKjvbdSiZiqAAl
+EOcKjvbdFfKSNhsq
+EPCjjvbdyYJKBpZk
+DncKjvbdAMgyTWyx
+DnbkKvbdpaJFAXIE
+EOcKjvbdEYYMUUTl
+EPCjjvbdeFOrBvcK
+DoDLKvbdptUHSRkU
+DoCkKvbdOYPVzcnU
+DnbjjvbdijFhKMxS
+DnbkKvbdEKHivXjA
+DncLKvbdsPvOicVf
+DoCjjvbdmbJvxOmu
+EOcKjvbdDxYMUUTl
+DoDKjvbdZtIhxdTO
+DncKjvbdTlVoAuoJ
+DoDKjvbdFyUuBDwb
+EObkKvbdQYmAGsSK
+DnbkKvbduLwwAsaX
+EPDKjvbdegkWRmpg
+EPDLKvbdRDcAoqDr
+DoCjjvbdFWZPolie
+DoCkKvbdbhmJkGWx
+DncLKvbdrWpMDJYq
+DnbjjvbdaaWEeoow
+DoDLKvbdzHYlANFX
+DoCkKvbdjFLHUoAO
+DnbjjvbdZyEKNbkr
+DoDKjvbdLrXMyuQz
+EPDLKvbdwNWAMdFN
+DoCkKvbdkWXODaxX
+EOcKjvbdraelkgKy
+EOcLKvbdmSZVZsDi
+EPCjjvbdkMbLzEfo
+EObjjvbdaSFbgtFk
+EObkKvbdmIctRUqa
+DncKjvbdhtydvquC
+EPDKjvbdZoOJEeZj
+DoDLKvbdyXiJaozL
+EOcLKvbdVwIxWEFH
+DnbkKvbdYpmFJMdq
+EPDLKvbdjKGIKMwr
+EPCkKvbdFpASwHGZ
+DncKjvbdKQzEnfNe
+DoDLKvbdkVwODaxX
+EPCjjvbdzaAOffal
+EObjjvbdnHEwlnGy
+DncLKvbdLqwMyuQz
+EPCkKvbdWRnXaeMD
+DoCkKvbdcbSlrAUN
+EPDKjvbdMJBlRYAS
+EOcLKvbdZxcimbkr
+DncLKvbdCDpBVimG
+DoDKjvbdGdKvKBjK
+EPDLKvbdziuPodSt
+DnbkKvbdbrbjtEKB
+EOcLKvbdmIcsptqa
+EPDKjvbdMRwMyuQz
+DoDLKvbdfHkVrNqH
+DnbkKvbdLZRKSzuG
+EPDKjvbdTfzmkwWF
+EOcLKvbdSKxeuHLT
+EPDLKvbdkHgLfGNk
+DoDLKvbdVhXuxHYz
+EOcKjvbdkHgMGGOL
+DoDKjvbdEARhmZvw
+EPDLKvbdjKFgimXr
+EObkKvbdSQUGiecw
+EPCjjvbdjKFhJlxS
+DoDKjvbdDxXlTtUM
+EPDLKvbdelfWgMik
+EOcKjvbdtcDVXWOo
+DoDKjvbdiZuFlRNf
+DoCkKvbdsBellHKy
+EPCkKvbdjlbLyeGo
+EOcKjvbdhfibxujV
+EObjjvbdhyuGMROG
+DoDLKvbdgQBzvdYI
+DoDKjvbdeATpmXjG
+EPDLKvbdjKFgilxS
+DoDKjvbdrpWPJbuf
+DncLKvbdDncLKvcE
+DoCkKvbdkVvmdCXw
+DncLKvbdGcjujCJj
+DncLKvbdpxngfpcx
+DnbjjvbdiCPCdwQq
+EPDLKvbdijFhJlwr
+DncKjvbdhgJbxvKV
+EPCjjvbdZxcjNbkr
+DncKjvbdZQleJMdq
+DncLKvbdyfxlAMeX
+EPCjjvbdFfJrNiUR
+EPDLKvbdzjVQPdSt
+DoDLKvbdjAQHBPfj
+EObjjvbdZoOJFEzK
+EObkKvbdFpATWgGZ
+EPDKjvbdvAcxrneI
+DoDLKvbdxrnJMrCH
+DoCkKvbdjmCLydfo
+EPCkKvbdegjuqmqH
+DoCkKvbdSBdFLiZL
+EObkKvbdbAvFFopX
+DncLKvbdGQASwGey
+DnbkKvbdQccAopdS
+EPCkKvbdZshiYdSn
+EPCjjvbdHDjujCKK
+EObjjvbduDDVWuno
+DoCjjvbdzjVQQDsU
+EOcLKvbdeFOqavcK
+DoDLKvbdyXhibPzL
+DoDLKvbdrzMPsAgn
+EObkKvbdUtNTfMWK
+EOcLKvbdLqwNZuQz
+EPDKjvbdqBJFAXHd
+DoCkKvbdnUuZkKSG
+DoCjjvbdZHXEAOsJ
+DncKjvbdQdDBPpcr
+DnbkKvbdCIkBkIej
+DnbkKvbdMgDPmQUk
+DnbkKvbdxxIjCPyk
+DnbjjvbdZsiIxdSn
+DoCkKvbdADRxJzJQ
+EObjjvbdkxsSTZHU
+DncKjvbdWXIxVdEg
+DnbjjvbdLrWmZtpz
+EPDKjvbdhzUelQnG
+DoDLKvbdSBceLhxk
+EObjjvbdWIXvYGxz
+EPDKjvbdEYXktUUM
+EObkKvbdhlFENtby
+EPDLKvbdNwnuzcmt
+EOcKjvbdaaWEfPpX
+DncLKvbdddoSCWcK
+EPDKjvbdmaiwXnnV
+DoDLKvbdMgDQMpUk
+DoDLKvbdjFKfuPAO
+DncLKvbdnGeYMmfy
+DncLKvbdrSUjmkAm
+EOcLKvbdfHkWRnQg
+DnbjjvbdnCKWxPNu
+DnbjjvbdraemLgKy
+EObkKvbdWWiYWDdg
+DoCkKvbdKfFgaaQu
+EPCkKvbdaSFcIUGL
+EOcKjvbdkxrqryHU
+DncKjvbdRDbaQQcr
+DncLKvbdbVBgXjtI
+DoCjjvbdqZPHfqDx
+DnbkKvbdcyxowxpb
+EPCkKvbdWXIxWDeH
+DoCkKvbdyXiKBozL
+DnbkKvbdlZSrTYft
+EObjjvbdGdKujBij
+DnbjjvbdtcDVXWPP
+DoDKjvbdZnmhddyj
+EObkKvbdTukoisaR
+EObkKvbdzoPqFCkx
+DncLKvbdLhalQxAS
+EPCkKvbdVwIwudFH
+DoDKjvbdjKGIKNYS
+DoDLKvbdjhHLeenL
+EPDKjvbdJTZBSlxM
+DoCjjvbdFaOqZJzm
+DoDLKvbdnBjXXnnV
+DoCjjvbdeFPSCXDK
+EPCjjvbdbAvFGPow
+DnbkKvbdVwIwvEFH
+EObjjvbdqUTfrSLU
+DncKjvbdqlyixkhJ
+DoDKjvbdSLZFuGjs
+DncLKvbdsCGNLfkZ
+EPDLKvbdaofgDkzd
+DoCkKvbddiirWUzn
+EOcKjvbduCcVWuno
+DnbkKvbdSPsfjGDw
+DoCkKvbdFWYpQMie
+DoDLKvbdRECaQRES
+EPDLKvbdhfibyVjV
+DnbjjvbdqTsgSSLU
+EObkKvbdrXQMChyR
+DncLKvbdNrtVfduQ
+EObjjvbdiUzEvqtb
+DncKjvbdUaCQsRRy
+EPCjjvbdRbEEkiYk
+DncKjvbdUtNUGMVj
+EPCjjvbdzHYlAMeX
+EPCkKvbdeEoRbXCj
+DoDLKvbdcScLUDia
+DoDLKvbdtbbuWuno
+EOcKjvbdbUafwkTh
+DoCjjvbdtcDVXWOo
+EOcKjvbdHgGyxxYH
+EOcLKvbdWSOXbEkc
+DoCkKvbdKeehCBRV
+DncLKvbdMgComQVL
+DoDKjvbdUMVoBVoJ
+DoCjjvbdzoQRFCkx
+DoCkKvbdUWMQJsaR
+DnbjjvbdkNCLydgP
+EOcKjvbdmozYvKyC
+DnbkKvbdmgExMnGy
+DncKjvbdznpQeDMY
+DoDKjvbdZxcjNbkr
+EOcKjvbdqdEiQNua
+EPDLKvbdfHkVrNpg
+DnbkKvbdXsMBMsoY
+EObkKvbdcJNKLGXY
+EPDLKvbdVqmwbEkc
+EPCkKvbdJcJbpibx
+EObjjvbdYNqAXtvU
+EObkKvbdjAQHApGj
+EPDKjvbdrbFmMHLZ
+DnbkKvbdPIAXyAYa
+DoDKjvbdSLZGVHLT
+DoCkKvbdDnbkLWcE
+DncKjvbdzoPpeDMY
+EPDKjvbdQwNdDLhD
+EPDKjvbdhfjCxuiu
+DoCjjvbdajkenmcA
+EPDKjvbdtTSTYyeD
+DoCjjvbdijFhKMwr
+DoDLKvbdpfDeTuaI
+EPCjjvbdJXtCHlQp
+EOcKjvbdjbkkRGuH
+EObkKvbdVTlselWK
+DoCkKvbdauCHXkTh
+DnbjjvbdSLZGVGjs
+DoDLKvbdehLWRmqH
+DncKjvbdSBdFLhyL
+DoDLKvbdmajXYPOV
+EOcKjvbdpeceTvAh
+EPCjjvbdNdctIhkE
+EOcLKvbduWNwjQsA
+DoCjjvbdtvOYKRTA
+DncKjvbdqiAJeNOe
+DnbjjvbdUtNUGLvK
+EPDKjvbdMgColotk
+EOcKjvbdQlxCZNtz
+DoDKjvbdmfdwmNfy
+EPDKjvbdrovPKDVf
+DnbjjvbdDjIJuwjA
+EPCjjvbdsBfNMHLZ
+DoCjjvbdJbjDRJcY
+EPDLKvbdZRMeJNEq
+EPCkKvbdRkYfVGkT
+DncLKvbdRbDeLiYk
+EPCjjvbdqiAJdloF
+DoCjjvbdFyVUaDwb
+DoCjjvbdMRvmZtpz
+DoDLKvbdGQATWffZ
+EPCjjvbdwtmFQyMO
+EOcKjvbdTIzKRAAl
+DoCkKvbdsQVnicVf
+DoDLKvbdFfKRmhtR
+EOcKjvbdsCFmLfjy
+DoDKjvbdddnqbXDK
+DoDKjvbdYgWdAOri
+DoCkKvbdmuUyjjSG
+EObkKvbdhficYvJu
+DoCkKvbdQlxCZNtz
+EPCkKvbdGZVUaEXb
+DncLKvbdEXxMTtTl
+DoDKjvbdGFirNiUR
+EPCjjvbdpssgRrLU
+EObkKvbdVZHsykOn
+DncKjvbdyTOJMrBg
+EOcKjvbdRacdlIyL
+EObkKvbdiCOcFWqR
+DoDLKvbdRjxfVGkT
+EOcLKvbdiBncFXQq
+DncLKvbdnQZxukYb
+DoDKjvbdpaIeAWgd
+DncKjvbdVqnYCEkc
+DnbjjvbdZRMdhmEq
+EPCjjvbdhgKDYuiu
+EOcLKvbdCIkBjhfK
+EPCkKvbdZnmhdeZj
+EOcKjvbdTppnuUhN
+EOcLKvbdbVBfxKsh
+EPDKjvbdFVxpQNKF
+DnbjjvbdjvWnDaxX
+EObjjvbdANIYrwZx
+EObjjvbdauCHXjtI
+EObkKvbdZirgpGaf
+EObjjvbduoTzqLPU
+DoDLKvbdxZhFeweS
+DoCjjvbdILaznWqL
+DncLKvbdaMkBrtlg
+EObjjvbdNrtVgFUp
+DnbkKvbdRzKHsCvA
+DoCkKvbdiZuFkpnG
+DnbkKvbdEztRElDJ
+EPCjjvbdRECaQQdS
+EPCjjvbdqqtkNkAm
+EObkKvbdyNrhXriD
+DoDLKvbdegkWRmqH
+DncKjvbdNQXqWNfs
+DoDLKvbdRadFLhxk
+EPDKjvbdxUmFQyLn
+EPCjjvbdxxJKBoyk
+EObkKvbdnVUzLJqf
+DnbjjvbdSQUGiedX
+DncLKvbdrpVnjCvG
+DoDKjvbdZirgpGbG
+DncKjvbdOAJTUJrA
+DnbjjvbdUyHsyjoO
+EPDKjvbdfpBzvdXh
+EPCjjvbdyTNhlqag
+DncKjvbdLBKflaxR
+DoCjjvbdVwJXvEEg
+EOcKjvbdVqnXadlD
+DoDKjvbdyNrgxSiD
+EObjjvbdnVVZjjRf
+DnbjjvbdFeiqmiTq
+EObkKvbdFVxpQMie
+DnbkKvbdIBkydzAD
+EPCkKvbdZjTHofaf
+DncLKvbdnPzYukZC
+EObkKvbdLYqKSzuG
+Dnbjjvbdxmrgwrhc
+EObkKvbdTkuoBWOi
+EObkKvbdIrxaSlxM
+EOcLKvbdJqZeOfOF
+DoCjjvbdBhjbKiFj
+EPCkKvbdrDeJPnVa
+EPCkKvbdNwoVzcnU
+EOcLKvbdXmqAYVWU
+EPCkKvbdZeYGzhJC
+EOcKjvbdNddUIhjd
+DoDKjvbdjggLeemk
+EObkKvbdxZgefXeS
+EOcKjvbdgFkzOGgA
+EObkKvbdNdcsiIkE
+EPDKjvbdbiMikFwY
+EPDKjvbdelfWfmJk
+EOcKjvbdHELWJajK
+DoDLKvbdZRMeIldq
+EOcLKvbdRXNccMHc
+EPCkKvbdQlxCZNtz
+DoCkKvbdyTOJMqag
+EPDLKvbdCTAcTevr
+EOcKjvbdrpVnicWG
+DnbkKvbdZLrETmkm
+EOcLKvbdRpTfifEX
+DnbjjvbdQcbaPqDr
+DoCkKvbdEuxpQNKF
+EPCjjvbdNeEThiKd
+EPDKjvbdVYgtZjoO
+DoCjjvbdZRMdhleR
+DoCjjvbdZsiIyDrn
+EPDLKvbdaSGCgtGL
+EPDLKvbdqTtGqrKt
+DoCkKvbdnVUzKjSG
+EPCjjvbdzQoMiJwA
+EPDKjvbdXrlBMtOx
+DoCjjvbdNHColpVL
+EObkKvbdXnRAXuVt
+EObjjvbdMJCMQxAS
+EObkKvbdIrxaTMxM
+DnbjjvbdbAudfQQX
+DnbkKvbdnCKXYOmu
+DoDKjvbdEXxMUUTl
+EObkKvbdyXhiaozL
+EObjjvbdEJhKVwjA
+EOcKjvbdpfEFTuaI
+EOcKjvbdbVCHYLTh
+DncLKvbdyqOliJwA
+EOcKjvbdkxrqsZHU
+DncKjvbdDjHjVwjA
+EPCkKvbdkDMLQfuH
+EPCjjvbdUVlPjUBR
+DoDLKvbdjJfHimXr
+DoCkKvbdEuxooljF
+DoDLKvbdYzcGRjWZ
+DoDKjvbdwyhGGYFS
+DnbkKvbdsrrSxyeD
+EPCkKvbdxmrhXrhc
+EPDKjvbdDjHivXjA
+EObkKvbdfMfXGlik
+EPDLKvbdGdKvKBij
+DoCkKvbdbLMGOmcA
+EPCkKvbdRXNdDLgc
+EPCjjvbdZsiIxcrn
+DoDKjvbdpyPIGqEY
+EPDKjvbdlZTRryHU
+DoDKjvbdUslsekvK
+DncKjvbdKfFhCBQu
+DncLKvbdSCDeMIyL
+EPDKjvbdJcJcRJcY
+DoDLKvbdraellHLZ
+EPCjjvbduDCtwWPP
+DnbkKvbdBdPaWJlf
+EPCkKvbdqFceUVaI
+DnbkKvbdcyxoxYqC
+DnbkKvbdlYsSTYft
+EObjjvbdZHXEAOsJ
+EObjjvbdURROtuHm
+EPCjjvbdZLrDsnMN
+EPCjjvbdfIKvRmpg
+EPDLKvbdwWlBVaVu
+EObkKvbdZMSDsmkm
+EPDKjvbdKNAEZfuB
+DnbjjvbdhyuGMROG
+EObjjvbdJuuGDdgJ
+EPDLKvbdgQBzwDxI
+EObjjvbdjvXNdCXw
+EPCjjvbdlZSrSyGt
+DoDKjvbdXsLaMsnx
+DoDLKvbdTlVoAuoJ
+DnbkKvbdptUGrSLU
+EObkKvbdEztRFMCi
+EOcLKvbdTkvOaVoJ
+EObkKvbdDoCjjwCd
+EPCkKvbdTfznLwVe
+EObkKvbdRjyGUfjs
+EPDKjvbdVviXvEFH
+DnbjjvbdKkBIWAKZ
+EOcLKvbdqFdFUVaI
+EOcLKvbdBhjakJFj
+DncKjvbdauBgYKsh
+DnbjjvbdxKvdHzyf
+DoCjjvbdxVMdqYlO
+EPCjjvbdEPDLLXDE
+EPDLKvbdVvhwucdg
+DncKjvbdaRfDITfL
+EPDKjvbdfpBzvcxI
+DoCkKvbdGLFTDHmV
+DoDLKvbdcTDKtDjB
+DnbkKvbdZRMeIldq
+EObjjvbdRjyGVGkT
+EPCjjvbdlhctRVRa
+DnbjjvbdyXhibPzL
+DnbjjvbdFpASvgFy
+DnbjjvbdKCicRJcY
+DnbkKvbdPxmAGrrK
+EPCjjvbdpstHSSKt
+EObkKvbdiZtelQnG
+DoDLKvbdKkAgvAJy
+EObjjvbdsPvPKCuf
+EOcLKvbdhyuGLqOG
+EPDLKvbdyOSgxShc
+EObkKvbdmJDsptqa
+EPCjjvbdbVCHYKtI
+DoCkKvbdCJLBkIfK
+EPDKjvbdTqQnuUgm
+EOcLKvbdypnmIjXA
+DoDLKvbdiLddOUby
+DoCkKvbdaSFbgtGL
+EPDLKvbdraellGjy
+EObkKvbdWRmwbEkc
+EPCjjvbdDoDLKvcE
+DnbjjvbdjEjfuPAO
+DnbjjvbdqvokbiYq
+DnbkKvbdVZITzLOn
+EPDKjvbdUWLpJtAq
+EObkKvbdwtmFQyMO
+DoDLKvbdFWZQPmKF
+EPDKjvbdLBKgMawq
+DncLKvbdANIYsWyx
+EObkKvbdqvolDJYq
+EOcKjvbdQlwbZOUz
+EPCkKvbdlqyUzTEJ
+EPCkKvbdSLYfUgKs
+DoCjjvbdRotHJfEX
+EOcKjvbdrXQMCiZR
+DncLKvbdaofgELzd
+DoDKjvbdehKvSNqH
+EPCkKvbdzaAOfgBl
+DoCkKvbdVUMsfMVj
+DoDLKvbdUGznLwVe
+EPDLKvbdDoDKjwDE
+DoCjjvbdANHxsXZx
+EPCkKvbdJpydnenF
+EPCjjvbdtTRsZZeD
+DoDLKvbdnQZyWLZC
+EPCkKvbdKNADyfta
+EPCkKvbdUVlPjTaR
+DncLKvbdeOeSjstS
+DncKjvbdXrlAmUOx
+DoCkKvbdxnTIXrhc
+EPDLKvbdZjTIQGaf
+DoCjjvbdPxmAGrrK
+EPDKjvbdLZQirztf
+DoDLKvbdkHflGFnL
+DoCjjvbdiMFEOUby
+DnbjjvbdhaoDFXQq
+EPCkKvbdyzeNqhIh
+EPDKjvbdbUbGwkUI
+DoCkKvbdEXxLsstM
+DoDLKvbdaRebhUGL
+EObjjvbdMfbpNQUk
+DoDLKvbdCEQAuilf
+EObjjvbdMowpunHT
+DoDLKvbdzHYlAMeX
+DoCkKvbdegkVqnQg
+DnbkKvbdwWlAuaVu
+DncKjvbdFfJqnItR
+EObjjvbdZjTHpHBf
+EPCkKvbdbsDKtEJa
+EOcLKvbdZtIiZESn
+DoDLKvbdpxoIHRDx
+EPDLKvbdTpqOtuIN
+DnbjjvbdmoyxvKxb
+DncKjvbdqGEEtWBI
+EPCkKvbdQwNdClHc
+DoCkKvbdHELViajK
+EPDLKvbdCJLBkIfK
+EPDLKvbdvwMBWBVu
+EPDKjvbdxrmiNRag
+EOcKjvbdxVMeQyLn
+DoCkKvbdraelkgLZ
+EPCjjvbddndsLUUS
+DoCjjvbdhgKDYvKV
+EPDKjvbdBiKbKiFj
+DncKjvbdKkBIWAKZ
+DnbjjvbdjlakzEgP
+EObjjvbdNrtWGeUp
+EPDKjvbdidkGuPAO
+DnbkKvbdjAQHBPgK
+DoCkKvbdUxgtZkPO
+DoDLKvbdDoCkLXDE
+DoDLKvbdkVvmcaxX
+EPCkKvbdmfeXmOHZ
+DoCjjvbdHDkWJajK
+DoDLKvbdkHgMGFnL
+EObjjvbdBdQAuilf
+EPDKjvbdxUleQxlO
+DoDKjvbdJbjDRJcY
+EPDKjvbdXsMAltOx
+EOcKjvbdIrxaSmXl
+DoDLKvbdyYJJbQZk
+DoDLKvbdQlwaxnUz
+EObkKvbdqvpMDIyR
+DoCkKvbdhzVGLpnG
+DncKjvbdJKEAJofd
+EOcLKvbdZLrETnLm
+DncKjvbdQvnDcMID
+EPDLKvbdiLddOUby
+EOcKjvbdeJiqvUzn
+DnbjjvbdsBemMGkZ
+EPCkKvbddtAUASmW
+EPCjjvbdiLeEOVCy
+EPDKjvbdkxrrSyHU
+DoCjjvbdURQoVUhN
+EOcKjvbdtkwwBUBX
+EOcKjvbddeOqawCj
+EOcKjvbdbAvEfPow
+EPCkKvbdzROmIjXA
+EObjjvbdKDKCpibx
+EPDKjvbdIGfyyYXg
+EOcLKvbdeOdsKssr
+EOcKjvbdsBelkgKy
+DoDKjvbdJYUCIMRQ
+EOcLKvbdjcMLQgVH
+EOcLKvbdJTYaSmXl
+DoDLKvbdNddUJIkE
+DoDLKvbdFjdsChNV
+DnbjjvbdmttyjjSG
+EPDLKvbdVgwuxHYz
+EOcLKvbdsCGMkfjy
+EOcKjvbdKWVGDeHJ
+EPDLKvbdjJegjMwr
+DoCkKvbdNHDQMotk
+DoDLKvbdjmBkydgP
+DnbkKvbdSLZFtfjs
+EPDKjvbdjbkjpfuH
+EObjjvbdkVwNdBww
+DncKjvbdFxtuBEYC
+EPCkKvbdrMzJxkhJ
+DoDLKvbdptUGrSKt
+EOcKjvbdhzUelQnG
+EObkKvbdsQVoKCuf
+DoCkKvbdzitpPcsU
+DoCkKvbdySnJMqag
+DncKjvbdZRMeImFR
+EObkKvbdYzcFrKVy
+DoDKjvbdrNZjZMIJ
+EPCkKvbdEvYoolie
+EOcLKvbdLBKgNCXq
+DnbkKvbdrpVnjDWG
+EObkKvbdLLBHvAJy
+DoCkKvbdqmZixkgi
+DoCjjvbdhytfLpmf
+DnbkKvbdVZHsyjoO
+EObkKvbdWWhxWEEg
+EObkKvbdhfjDZWJu
+DoCjjvbdZoOIddzK
+DoCjjvbdCDoaWJmG
+DoCkKvbdzitoocrt
+EOcLKvbdOSsvGduQ
+EOcLKvbdVqnXbElD
+EPDKjvbdgFlZnHHA
+EOcKjvbdUsltFkvK
+EPCkKvbdePFSkTsr
+EPCkKvbdssSTYzFD
+EOcLKvbdVTlselWK
+DncKjvbdZRMeJMdq
+EOcKjvbdYSlAlsnx
+DncLKvbdSZihTDWA
+DnbjjvbdvvlBWAuu
+EOcLKvbdEvZPoljF
+EPDKjvbdHELWJbJj
+DoDKjvbdDjHiuxKA
+DncLKvbdrMyjYkgi
+EOcLKvbdRbDdlIxk
+DoDLKvbdFVyQQMie
+EOcLKvbdZxdJmcMS
+EPDKjvbdFejRmiUR
+EPCjjvbdnPyxujxb
+DoCkKvbdjKGIKNXr
+DoCjjvbdYSlBNUPY
+DoDLKvbdZshiZDsO
+EPDLKvbdkyTRsYft
+DncKjvbdJbicQicY
+DoCkKvbdXGZZtAOs
+DnbkKvbdZjSgpGbG
+DncKjvbdWSOYBeMD
+DoDLKvbdKNADyfta
+DoDLKvbdLBKgMbYR
+EObjjvbdNddThhkE
+EPCjjvbdQdCaPqES
+DnbkKvbdvBDySoFI
+EPCkKvbdDoDLLWcE
+DncLKvbdaSGDHtGL
+EObkKvbdKNADzGta
+DncLKvbdTAFJHaoE
+EOcLKvbdTAFJIBoE
+DoDLKvbdUtNTelWK
+EPCkKvbdKefICApu
+EObkKvbdySmhlqbH
+EPDLKvbduaEYroFI
+DnbjjvbdSKxfVHLT
+EObkKvbdhkdcnVDZ
+DnbkKvbdCSaDTevr
+DoCkKvbdiBoCeXQq
+DncLKvbdZjShQGaf
+EPCkKvbdIwsagkqQ
+DnbkKvbdnCKWwoNu
+DncKjvbdelfWgNJk
+EOcLKvbdSPtHKFcw
+EObjjvbdZRNEhleR
+DoCkKvbdbLMGPNcA
+DoCkKvbdRkZFtfjs
+EOcLKvbdySmhmSBg
+DoCkKvbdWHxVwgYz
+EObjjvbdURQntuHm
+EPDKjvbdySnJMqbH
+EOcLKvbdOStWHEtp
+EPCjjvbdeOeTKstS
+DncLKvbdssRsZZdc
+EObjjvbdrovPKCuf
+EPDKjvbdiZuFkqOG
+DncLKvbdsBfNLfjy
+EOcLKvbdCDpAujNG
+EPDKjvbdOSsugFUp
+DoDLKvbdNQYRVmfs
+EOcLKvbdTAEiHaoE
+DoCjjvbdEPDKjwDE
+EPCkKvbdqUUGqqkU
+EPDKjvbdtbcVXVoP
+DnbjjvbdhbOcEvqR
+EOcKjvbdCTAcUGWr
+EPCkKvbdQdDApQcr
+DnbjjvbdTfznLwWF
+DnbkKvbdCDoaVjMf
+EPCjjvbdBsBDUFvr
+EPCkKvbdWWiXuceH
+DoCjjvbdJcJcRJbx
+DoDLKvbdsCGMlHKy
+EPCjjvbdSBceLhyL
+DoDKjvbdHffzZYYH
+EPCkKvbdvAdZTOeI
+DnbkKvbdxwhjBpZk
+DncKjvbdOFDtIhjd
+DoCjjvbdmpZxujxb
+EOcKjvbdIryAsMwl
+EPCkKvbdTqQnuUhN
+DncKjvbdOSsvHEtp
+EPDLKvbdZoOIdeZj
+DnbkKvbdKeegbAqV
+EPCjjvbdqFceUWAh
+DnbkKvbdCWzchdpW
+EPCkKvbdzQnlhiwA
+DoDLKvbdqdEiQNua
+DncKjvbdddoRawCj
+EPDLKvbdlYrrSxft
+DnbkKvbdRWnECkgc
+DncKjvbdGYuUaEYC
+EPDLKvbdZsiIxcrn
+DoCjjvbdJbibqJbx
+EPDKjvbdGYtuBDxC
+DnbjjvbdCEQAvKMf
+EObjjvbdvAcyTPEh
+DoCkKvbdxwhjBozL
+DoDKjvbdNsTugFVQ
+DoDKjvbdkHgLeemk
+EOcLKvbdwWlBVaWV
+EOcLKvbdrNZjYkgi
+DnbkKvbdJYUBglRQ
+DnbkKvbdjvWmdCXw
+EObjjvbdmajXYPOV
+DncKjvbdDihJuxKA
+EPCjjvbdwzIGGYFS
+DoDKjvbdMpYQvOHT
+DncLKvbdbhljLFwY
+EObjjvbdelevgMik
+DnbjjvbddePSCWbj
+DnbjjvbdKQydnenF
+DnbkKvbdZQmEhmFR
+DoDKjvbdjKFgimYS
+EObjjvbdANIZSvyx
+DoCjjvbdfHkWRnRH
+EObkKvbddiiqutzn
+EOcKjvbdqYnhHQdY
+DoDKjvbdKCjDQjCx
+DoDLKvbdjgflFfNk
+EOcLKvbdtTRrxzEc
+DnbkKvbduLwwBUAw
+DncLKvbdkWXOEBxX
+EPDKjvbdNxPVzcnU
+EPCjjvbdUMVnaWOi
+EObkKvbdZQmFImEq
+DncLKvbdQvmdDMID
+EObjjvbdGFjSNhsq
+EOcLKvbdbAvFFpQX
+DoCjjvbdkCkjqGuH
+EPCkKvbdbLLeoNcA
+DoDLKvbdemFwGmJk
+EOcKjvbdVUMtFlWK
+EPDLKvbdWXJXucdg
+DncLKvbdqcdhpNua
+DncLKvbdGYuUaDxC
+EPCkKvbdGZUtaDwb
+EOcLKvbdjuwODaxX
+EOcKjvbdSKyFuHKs
+EOcLKvbdNQYQvOHT
+EPCkKvbdNGcQNPuL
+EOcLKvbdPIAYZAZB
+EObjjvbdMfcPlpVL
+EPCjjvbdLAjflbXq
+EPCjjvbdySmhmRbH
+EPDKjvbdxsNhmSBg
+EOcKjvbdZMSDsmkm
+DoCjjvbdbAudfQQX
+DoCjjvbdePErjtTr
+DncKjvbdtkxXBUBX
+DoCkKvbdqvokbiYq
+DnbjjvbdMfbpMouL
+DnbjjvbdijFhKNXr
+DoDKjvbdhgJcZVjV
+EPDKjvbdIHGzZYYH
+DnbjjvbdNsTufeVQ
+DnbjjvbdqlyixlIJ
+EPDLKvbdmaivxPOV
+DnbkKvbdmJDsptrB
+DnbjjvbdQYmAGsSK
+EOcKjvbdZjTIQHCG
+EPDKjvbdqGDeTuaI
+EOcLKvbdADSYJzIp
+DncLKvbdeuzwoizs
+EObjjvbdFyUuBEXb
+DncLKvbdnUtykJqf
+EPCjjvbdelfXGmKL
+EOcKjvbdKCjDQjDY
+DncKjvbdaaVeGPow
+DncKjvbdqvolDJYq
+DoCjjvbdDnbjkWbd
+DoCjjvbdjlakyeHP
+DoCkKvbdLZRJrztf
+DncKjvbdZisIQHCG
+EPDLKvbdZyDjNbkr
+DnbkKvbdLAjfmBwq
+EOcKjvbdtSqryZeD
+EOcLKvbdIMBzmvqL
+EObjjvbdiVZdvqtb
+DoDLKvbdMgDPmQVL
+EPDLKvbdMgCpNPtk
+EObjjvbdKVuGDeHJ
+EOcLKvbdjJehJlxS
+EPCkKvbdhlEcmuDZ
+DoDKjvbdHfgZyXwg
+EPCjjvbdShyiqABM
+EPDLKvbdMgColouL
+EPDLKvbdVqmwadkc
+EPCjjvbdnCKWwnmu
+DncKjvbdRpUGjGEX
+DoDKjvbdkWWnECYX
+DnbjjvbdkMalZeGo
+EOcKjvbdxUleRYkn
+EObkKvbdFxtuBDxC
+EObjjvbdnGdwlnGy
+EObkKvbduaEYsOeI
+EPCkKvbdyTOJMrBg
+EObjjvbdDHMFgAzc
+DnbjjvbdEOcKkXCd
+EPDLKvbdBhjbLIfK
+EPCkKvbdZtJJZETO
+EOcLKvbdIwsagkqQ
+DoCkKvbdZyDjNbkr
+DnbjjvbdBsAbsfWr
+DoCjjvbdeOeSjssr
+EObkKvbdVUNUGMWK
+DncLKvbdfMfWfmKL
+DoCjjvbduaEZTOdh
+DoCkKvbdZisIPgBf
+DnbjjvbdVZHtZjoO
+DoCjjvbdCWzchePv
+EObjjvbdJmAEZfuB
+EObjjvbdvvkaVaWV
+DoCjjvbdiiegjNXr
+DnbjjvbdcScLUEJa
+DncLKvbdJXsbHlQp
+EPCjjvbdrpWOjDVf
+DoDLKvbdDnbjjwDE
+DnbjjvbdxnShYSiD
+DoCjjvbdqGEFUWBI
+DoDKjvbdtSrTYzEc
+EObkKvbdEPDLLWcE
+DoDKjvbdKQzEnfOF
+EPDLKvbdIwtBhMRQ
+DoCjjvbdTvLojUBR
+EPDLKvbdZyDimbkr
+EPDLKvbdptTfrSKt
+DncLKvbdkMbLyeHP
+EOcKjvbdKfFhBaQu
+EObjjvbdeEoRbXDK
+EOcKjvbdHDjvJbJj
+EObkKvbdEztQeLcJ
+DncKjvbdUtMsfLuj
+DnbjjvbdRXOECkgc
+DncKjvbdLAjfmBxR
+EOcLKvbdsPvPJcVf
+EPCjjvbdygYlAMdw
+DnbjjvbdmuVZkKRf
+EPCkKvbdSZigrcWA
+DncLKvbdcJMikGWx
+EOcKjvbdGLErcHlu
+DoDKjvbdKNADygUa
+EPDLKvbdMfbolpUk
+DoDLKvbdUxhTyjoO
+EPCkKvbdMtrqjmAX
+EPDLKvbdLBLGmBxR
+DoCjjvbdrzMQTAgn
+EPDLKvbdUxhTykPO
+DnbkKvbdnVUzLJqf
+DoCkKvbdLYpirztf
+EPDLKvbdFejSOItR
+DncLKvbdvlvANDeN
+DncLKvbdwtleRYkn
+EObkKvbdcJNKLFvx
+EPCjjvbdYSkaNTnx
+EOcLKvbdSxKlNzjx
+DnbjjvbdHbMZdzAD
+EPCjjvbdXnRAXuVt
+DoDKjvbdQmYBxnUz
+DoCkKvbdWSOYCEkc
+DnbkKvbdemGXGlik
+EObjjvbdNeDsiJLE
+DoCkKvbdbiMijfXY
+EPCjjvbdmIdTptrB
+DoCjjvbdEztQeMDJ
+DncLKvbdCIjbLIfK
+EPCjjvbdhkeENuDZ
+DoCkKvbdAMgxsWzY
+DoCjjvbdiZtelQnG
+EOcKjvbdWXJXuceH
+EOcLKvbdZRMeJMeR
+EPCkKvbdiVZdvquC
+DoDLKvbdkVvmdCXw
+EObjjvbdnHExMmgZ
+EPDKjvbdHgHZyYYH
+EPDKjvbdRbEFMJYk
+EPCkKvbdvBEZSndh
+DnbkKvbdcScLTdJa
+DoDLKvbdcJMijfXY
+DnbjjvbddndrjstS
+EPDLKvbdbiNJjevx
+DnbkKvbdOSsvGduQ
+DoDKjvbdMowpvNfs
+DoCkKvbdZjSgpGaf
+DnbkKvbdddnqawDK
+DoDLKvbdKaLGmCYR
+DoCjjvbdmuVZkKSG
+EOcKjvbdZQldiMdq
+EObjjvbdRNXayOUz
+DncLKvbdeuzxQJzs
+DncLKvbdEOcKkXCd
+DncKjvbdhtyeXSUb
+DnbjjvbdEObjkXDE
+DncLKvbdKQyePGNe
+EOcLKvbdHgGzZXwg
+EObkKvbdrMzJxlIJ
+EObkKvbdRXNdClHc
+DoDLKvbdwzIFexEr
+EPDKjvbdJYUCIMQp
+DnbkKvbdhbOcFWqR
+EOcKjvbdnGdxMmgZ
+EObjjvbddeOqawCj
+EPCjjvbdqTsgSSKt
+DncKjvbdJXtBhLqQ
+DoDLKvbdatagYKsh
+EOcKjvbdjEkHUoAO
+DncKjvbdLFfICBRV
+DnbkKvbdKQydoFme
+EPDKjvbdhlFEOVCy
+EPCkKvbdZxdJmblS
+EPDKjvbdJbjCqKCx
+DncKjvbdwNWANDdm
+EPDLKvbdpyPHfqDx
+EPCjjvbdOTTufeVQ
+EPCkKvbdtbbtvvOo
+DoCjjvbdbBWEfQQX
+EObjjvbdKNAEZgVB
+DnbjjvbdJXtBgkqQ
+EPCjjvbdGYtuBEXb
+DoDLKvbdZjShQGaf
+DoDLKvbdQmYCYnUz
+EOcLKvbdpedFTvAh
+EObjjvbdKQydoGNe
+EPCkKvbdKDJcRKDY
+EObkKvbdrafMkfkZ
+EObkKvbdiCObdwRR
+EPCjjvbddBsMrAUN
+DoDKjvbdWIXvXgYz
+DoDKjvbdkClKpftg
+EOcKjvbdkCkjpftg
+EOcLKvbdVrOYBeLc
+EObkKvbdmoyxukZC
+EPCjjvbddZyQXyRC
+DoCkKvbdhbPCdvqR
+DoCkKvbdJvUeceGi
+EOcLKvbdVqnXaeMD
+DoCkKvbdWWhxVceH
+EPDKjvbdiGjDZVjV
+EObjjvbdGAnpxizm
+DoCjjvbdiZuFlQnG
+EOcKjvbdTqRPVVIN
+EPCjjvbdqdEhomvB
+DoCkKvbdLAkHMaxR
+EPDLKvbdOEdThiKd
+DnbkKvbdkxrrTZGt
+EOcLKvbdEPDLLXCd
+DoDLKvbdTIzKRAAl
+EPDLKvbdSCDeLiZL
+EPCkKvbdpyOgfpdY
+EPCjjvbdtkwwBTaX
+EPDKjvbdiBoCeWqR
+DoCjjvbdhgJbxujV
+DoDLKvbdqdEhpNvB
+EOcKjvbdkCkjqGuH
+EPCjjvbdhbObeXQq
+EOcKjvbdxsOImRbH
+DoCjjvbdKWVFceHJ
+DoDKjvbdBiKbKiGK
+EPDKjvbdnGeXmNgZ
+EPDKjvbdiifHjNYS
+EOcKjvbdauBgXjsh
+DnbkKvbdUtMsfLvK
+DncKjvbdNrtVgEuQ
+EPDLKvbdUsmUGLvK
+EOcLKvbdNGcQMpVL
+EPCkKvbdqmZjZLhJ
+EObkKvbdFfKSOJUR
+DncKjvbdhaoCeXRR
+DoCkKvbdmfdwlnGy
+EPCjjvbdjbkjqGuH
+DoDKjvbdlqyVZsEJ
+DnbjjvbdWWiYVcdg
+EOcKjvbdeATqMwjG
+EOcKjvbdqUTgSSKt
+DncKjvbdqwQMDJZR
+EPCkKvbdsQVoJbuf
+DoCjjvbdVTmUFlVj
+DoDKjvbdmajWxPOV
+EOcKjvbdUQpoUthN
+DoDKjvbdwMvAMdEm
+EPDLKvbdDnbkLXDE
+DncLKvbdFfKSNiTq
+DncKjvbdIryBSlwl
+DoDKjvbdmgEwlmfy
+DncKjvbdqwPkbhyR
+DncLKvbdNeETiJKd
+EObjjvbdDoCjkXCd
+EObkKvbdjgflFfNk
+DncLKvbdxsNhlrCH
+DoCjjvbdeFOrCWbj
+EObjjvbdkNBkzFHP
+DoCjjvbdxrmiNSCH
+EOcLKvbdVwJXvDeH
+EPCkKvbdZRMdhmEq
+EObjjvbdjSzhsKiz
+DoCkKvbdqdEiQOVa
+EOcLKvbdpaJFAWhE
+EPDLKvbdRkYfVGjs
+DncKjvbdMpXqWNgT
+EOcLKvbdVYhUZkPO
+DoCjjvbdUxhTyjnn
+DoCkKvbdOYOuzcmt
+DoDKjvbdZLqdUNlN
+DoDLKvbdJSyBTMxM
+DoDLKvbdYORAXtut
+DncKjvbdHffzYxXg
+DncLKvbdmpZyVjyC
+EOcKjvbdmfeXlnGy
+DoDLKvbdkHfkeenL
+DoDLKvbdJTZBSmYM
+EObkKvbdrMzKZMHi
+DncLKvbdiLeDmuCy
+DoDKjvbdjvXNcbYX
+DnbkKvbdrJAJeMne
+DoDLKvbdvlvAMdFN
+EPCjjvbdZLrDsmlN
+DnbjjvbdaaVdfPpX
+EObkKvbdrbFlkfjy
+DoDKjvbdGLErbhNV
+DoCjjvbdCIkCKhfK
+DnbjjvbdeEoSBwDK
+DncLKvbdirziSjiz
+EPDKjvbdwzIGGYEr
+DncKjvbdbVCGwkTh
+EObkKvbdakMFnmcA
+DnbkKvbdRpUHKFdX
+DoDLKvbdMSWlytpz
+DncLKvbdpssgRrKt
+EPCjjvbdZRMeImEq
+DoCjjvbdqrVKmjaN
+EObjjvbdjAQGaPfj
+DoDLKvbdyqOmJJwA
+DnbjjvbdQccApRES
+DoDLKvbdIsYaSmXl
+EPCjjvbdrovPKDWG
+EPDLKvbdqdEhpOVa
+DoCkKvbdVviYVdEg
+DoCjjvbdqZPIGqEY
+EPCkKvbdOTTvGeVQ
+DoCkKvbdDncLLXCd
+EObkKvbdvBEYsOeI
+DoCjjvbdYORAYVVt
+EOcLKvbdhgKCxuiu
+DoDKjvbdddoRbWcK
+EObkKvbdmoyyWKyC
+EOcLKvbdyYJJbQZk
+DnbjjvbdUyIUZkPO
+DncKjvbdFyUuBDxC
+DoCjjvbdnQZyVjyC
+DoDLKvbdatbHYKsh
+DoCjjvbdczYowxpb
+DncLKvbdIsZAsMxM
+EPDKjvbdGKeTChMu
+DoCkKvbdptTgSRjt
+EPDKjvbdMtrqjmAX
+DncLKvbdKQzEoFme
+EObjjvbdFxtuAcxC
+DncKjvbdkDLkRHVH
+EPCkKvbdunszqKnt
+DoCkKvbdezuxeJTw
+EObkKvbdzjVQQDsU
+EPDLKvbdjKGIKMxS
+DoCjjvbdcyyQXxqC
+EObkKvbdhtydwRtb
+DnbjjvbdfNGXHNKL
+DoDKjvbdmoyxujxb
+DncLKvbdmuVZkJqf
+EObkKvbdZyDjNbkr
+DnbkKvbdyXhiaozL
+EObkKvbdKWUfDeHJ
+DoCkKvbddoFTLUUS
+DnbjjvbdJvUfEFHJ
+EObjjvbdsrqrxzFD
+EObjjvbdmgFYMmfy
+DnbjjvbdbrcLTcjB
+EPDKjvbdZtIiZETO
+DncKjvbdSLZGVHLT
+EObjjvbdhtzFXSVC
+EOcKjvbdvAcxsPEh
+EOcKjvbdbrbjsdKB
+DoDKjvbdezuxdiTw
+DoDKjvbdhkdcnVDZ
+DoCkKvbdNddUJIkE
+DnbjjvbdsCGMlGjy
+EOcKjvbdssSSxydc
+DoCjjvbdSPtHJfDw
+DoDLKvbdmRyVZrdJ
+EOcLKvbdBdQBVjNG
+EPCjjvbdtvOXipsA
+EOcLKvbdDwwlUUUM
+EObkKvbdhkeENuDZ
+EOcKjvbdwygfGYEr
+DncKjvbdbsCkUEJa
+DnbkKvbdvlvAMceN
+EPDKjvbdTvMPitAq
+EPDLKvbdMowpvOHT
+EOcKjvbdNQXpvNgT
+DncKjvbdYzcFqiuy
+EObjjvbdqUUGrRjt
+EOcKjvbdUaBqTRSZ
+DnbjjvbdrafMkfjy
+DncLKvbdmgFXmNfy
+DncKjvbdNrtVfdtp
+EOcKjvbdVZITyjoO
+EPDKjvbdTukpJtBR
+DoDLKvbdyOTHxTIc
+DnbjjvbdsBfNLfkZ
+EPCjjvbdmJDtRVSB
+EObjjvbdmJDtRUrB
+DnbjjvbdiVZeWrVC
+DncKjvbdBiKajhfK
+DnbkKvbdziuQPcsU
+EOcKjvbdGFiqnJTq
+DoCjjvbdAMhZTXZx
+DncLKvbdDjHiuwjA
+DnbkKvbdBdQBVjNG
+EPCjjvbdqlzKYkgi
+DncLKvbdLLBIWAJy
+DncLKvbdbhljKfXY
+DncKjvbdaogHELzd
+DnbkKvbdjEkGtoAO
+DnbjjvbdGdKvJbKK
+EPDLKvbdqrUjnKaN
+EObjjvbdnVUykKSG
+EPDKjvbdVrNwbFMD
+DoDKjvbdvlvAMdEm
+EPCjjvbdaaWEeopX
+EPDLKvbdULuoBVoJ
+EPDLKvbdzjUpPcsU
+EPDKjvbdZnnJEdyj
+EPDKjvbdtlXwAsaX
+EPCjjvbdjJfHimXr
+EPCkKvbdxwiKBpZk
+DoCkKvbdLiBlQxAS
+EObkKvbdXFxytAOs
+EObjjvbdnQZxukYb
+DncKjvbdZxcjNcMS
+DnbkKvbdQcbaQQcr
+EObkKvbdVgxVwgYz
+DoDLKvbddoEsLUUS
+EOcKjvbdTppnttgm
+DoDKjvbdBhkBjhej
+EPCkKvbdlhcsqVRa
+DoDKjvbdZshiYcsO
+DoDKjvbdtcDUvvPP
+DnbkKvbdRkZFuGjs
+DoCkKvbdaaVeFopX
+EObkKvbdYORAXtut
+DncLKvbdqwPlDJYq
+DoDLKvbdbBWEepPw
+DnbkKvbdVvhxWDdg
+EObkKvbdfHkVqmpg
+DncKjvbdaMjartmH
+EPCkKvbdBhjbLIej
+DoCjjvbdCIjbKiFj
+DoDKjvbdkIHLefOL
+EOcKjvbdrbGMlGkZ
+DncLKvbdPxmAGsRj
+EOcKjvbdZxdKODMS
+DncKjvbdkDLjqHUg
+EOcLKvbdjEkHUoAO
+DoDLKvbdrovOjDVf
+DncLKvbdZshiZESn
+DncKjvbdUyIUZjnn
+EPDLKvbdxmrhYSiD
+DoCjjvbdaNKasUlg
+DnbkKvbdYqMeJMdq
+DncKjvbdZoOIeEyj
+EOcKjvbdemGXGlik
+EObjjvbdyzdnRhIh
+DncKjvbdHEKvJbJj
+EObkKvbdSCDdlIxk
+EPCjjvbdGAoQxizm
+DoCjjvbdaNKasVMg
+EObkKvbdePErkTtS
+EPCjjvbdlhdUQuSB
+EPDKjvbdNQXpvOGs
+DoCkKvbdXnRAYUut
+EObkKvbdcTCkUEKB
+DncLKvbdmRyUzSdJ
+EPDLKvbdrSVLNkAm
+DoCkKvbdJvUecdgJ
+DoDLKvbdRDbaQRDr
+EPDKjvbdYlSETmlN
+EPCkKvbdbUagYKtI
+EPCjjvbdssRrxzFD
+EPCjjvbdRMwbYmtz
+DnbjjvbdxrmhmRag
+DoDKjvbdTvLpJtAq
+EPDKjvbdVBBprprZ
+DnbkKvbdRkYeuGkT
+EOcKjvbdmbKWwoOV
+EOcKjvbdZeYGzghb
+EPCjjvbdFeirOJUR
+DoCkKvbdZsiIxcrn
+EPDKjvbdDnbkKvcE
+DoDLKvbdsrrTZZeD
+DncKjvbdJbjCpicY
+DnbjjvbdcyxpXxpb
+EPCjjvbdrXQLbhxq
+DncKjvbdzROmJJwA
+DoDKjvbdqdFIpNvB
+EPDKjvbdkHfkfGNk
+DoDKjvbdFjdsDINV
+DoDKjvbdUyITyjoO
+EOcLKvbdiUzEwRtb
+EPCkKvbdmfeYMmgZ
+DncLKvbdHgGyyXxH
+EObkKvbdMuTSLNAX
+DncKjvbdtbcUwWOo
+DoCjjvbdVwIxWEFH
+EOcKjvbdhgJcZWKV
+DoCjjvbdsCFllHLZ
+EPDKjvbdGcjvJbKK
+EOcLKvbdnGeYNNfy
+DncKjvbdZnnIeFZj
+DoDKjvbdxUldqZLn
+EOcKjvbdrovOibvG
+DoDKjvbdUWLpKTaR
+DncKjvbdePFTKtTr
+EPDLKvbdFxtuAdYC
+DoDLKvbdfIKvRnQg
+EPDLKvbdypnmIjXA
+DncKjvbdbUagYLUI
+EPDKjvbdnVUyjiqf
+EObkKvbdKWVGDeGi
+EObkKvbdaNKbSuMg
+DoDKjvbdNVSqkNAX
+EObkKvbdhbPDFWqR
+DoDLKvbdLGFhBaRV
+EOcKjvbdbrcLUDjB
+EObjjvbdZHXEAPTJ
+EPCjjvbdCSaDTevr
+DncLKvbdgQBzvcxI
+EObjjvbdidjfuPAO
+DoDLKvbdzjUoodTU
+DncKjvbdGLEsChNV
+EPCjjvbdNeDshiLE
+EObjjvbdGGKRnIsq
+EObkKvbdeYZtTqez
+EOcKjvbdQwODblHc
+DoCkKvbdkClLRHVH
+EPCkKvbdxUldqYkn
+EPCkKvbdvBDxsPFI
+DnbkKvbdqvpLcIyR
+DncKjvbdqmZixkhJ
+DoDLKvbdkVwNdCYX
+EObkKvbdUxgsykPO
+EPCkKvbdjcLjpgUg
+DnbjjvbdbUagYKtI
+EObjjvbdDjHjWXjA
+EObjjvbdrykpSaIO
+EObjjvbdrbGMlGjy
+DncLKvbdVYhUZjnn
+DoDLKvbdjlakydfo
+DnbkKvbdVTmUGMVj
+EObjjvbdZjTIQHCG
+EOcLKvbdZxcjNcLr
+DoCkKvbdqTsgSRjt
+DnbjjvbdCIkBkJFj
+EPCkKvbdaogHELzd
+EPCjjvbdNPxQunGs
+EObjjvbdxZhFfXeS
+DoDKjvbdjblKqHUg
+EObkKvbdNPxRWNgT
+DoDKjvbdkaNOmALA
+EPDLKvbdxsOImSCH
+EOcLKvbdZshhyETO
+EPDLKvbdIHHZyYYH
+DoDKjvbdliEURVRa
+EObjjvbdiVZeXRtb
+EOcKjvbdiHJcYvJu
+EOcKjvbdIsYaTNXl
+DoCkKvbdtlXvaTaX
+EOcKjvbdNQYRVnHT
+DoDKjvbddjJqvUzn
+DoDKjvbdULuoBVoJ
+DoDLKvbdUslselVj
+EPCkKvbddePSCWbj
+EPDKjvbdNeDtIiKd
+EOcKjvbdiUzFXSUb
+DoCkKvbdmRyVZsEJ
+EPCjjvbduLwwAtBX
+EPDLKvbdxZgfGXdr
+DnbkKvbdBcpAujNG
+DnbjjvbdZtJIyDrn
+EObjjvbdmbJvwnmu
+EPCjjvbdXnRAYVWU
+EOcLKvbdyOShXsJD
+DoCjjvbdptUGqqkU
+DnbkKvbdFpASwHGZ
+DnbkKvbdwtleRYlO
+EPCkKvbdnHFYMmfy
+EPDKjvbdKCjDQjDY
+EObkKvbdeqaWzlDP
+DoCkKvbdbLMGPODA
+DoCjjvbdpyPIGqDx
+EOcKjvbdbhmKLFwY
+DoDLKvbdEOcKjwCd
+EPCkKvbdePFTKtUS
+EPCkKvbdtvNwipsA
+EPCkKvbdzoQQdblY
+EOcLKvbdKjaHvAJy
+EPDKjvbdvPTzpkOt
+EPDKjvbdMJCLpxAS
+EObkKvbdWWhwvEEg
+DnbkKvbdcJNJjevx
+DoCkKvbdNQXpunGs
+EPDKjvbdWSNxBdlD
+EPDKjvbdwyhFeweS
+DncKjvbdddnrCWcK
+EObjjvbdeKJrVtzn
+EObjjvbdrykosBIO
+EPDKjvbdiiehKMxS
+DncKjvbdrWpMCiZR
+DoCjjvbddoFSjssr
+DoCjjvbdbhmKKfWx
+EObjjvbdmajWwoNu
+EOcLKvbdDxYLstUM
+EPCjjvbdddoRawDK
+DncKjvbdmuUzKjSG
+DoDKjvbdLFegbBRV
+EPCkKvbdySnJMqbH
+DnbjjvbdLLAgvAKZ
+EPCjjvbdraemMHLZ
+EObjjvbdnUtzLKSG
+EPDKjvbdkDMLQgVH
+DoDKjvbdkHgMGGOL
+DoCjjvbdxsNiNSCH
+EObkKvbdNQXpvOHT
+EObkKvbdQwNdDLgc
+DnbjjvbdegkWRnRH
+DnbkKvbdGZUuAcwb
+DncLKvbdiMEcmuCy
+DoDLKvbdFfJqnJTq
+DoDKjvbdZnnJFEzK
+EOcLKvbdTqRPUtgm
+EOcLKvbdRjyFuHLT
+EOcKjvbdhtzEwRtb
+EObjjvbdTXjkmzjx
+DoDKjvbdqdFJQOVa
+DoCkKvbdGckViajK
+DncLKvbdDxXlUTsl
+EOcLKvbdeUAUASlv
+DnbkKvbdzjUpQETU
+DnbkKvbdtcCuWuoP
+DncLKvbdauBgXkUI
+DoCjjvbdUVlPitBR
+DnbkKvbdFfJrOItR
+DoDLKvbdxnSgwsJD
+EPCkKvbdXsMBNToY
+DncLKvbdCTAcUFwS
+DoDKjvbdhgJbxvJu
+DoDLKvbdhkeDnUby
+EObkKvbdEvZPpNKF
+EPCjjvbdiHJcZWJu
+EObjjvbdIHHZyYXg
+DoCkKvbdegkVqmqH
+DoCjjvbdxVNFRZMO
+DoDLKvbdUQpntuIN
+DoDKjvbdEJhJuwjA
+DoDKjvbdkHflGGNk
+DnbkKvbdmttykKRf
+DncLKvbdZxdJmblS
+DnbjjvbdZQmEhmEq
+DoCjjvbdJcJcQjDY
+DoDKjvbdBhkCLIej
+DoDLKvbdmIcspuRa
+DnbjjvbdqiAKElne
+DoCjjvbdJpzEoFnF
+EOcKjvbdyOShYTJD
+DoCkKvbdmuVZjiqf
+DoDLKvbdSCDeLhyL
+EOcKjvbdJvUedFGi
+EObkKvbdehLWRnRH
+EPDKjvbdxmrhXriD
+DoDLKvbdOTUWGeVQ
+EPCjjvbdzRPMhiwA
+EPDKjvbdKRZePGOF
+DoCkKvbdrDeIomvB
+EPDKjvbdkVvmdBww
+DoDKjvbdIGfzYwwg
+EPDLKvbdFVyPpNKF
+DoDKjvbdhytfLqNf
+DnbjjvbdMfbomQUk
+EOcLKvbdtcDVXWOo
+DoDKjvbdqwPlDJYq
+EOcLKvbdZshiZETO
+EOcLKvbdeEnrCXCj
+EOcKjvbdZLrDsnLm
+EPCjjvbdLYqKSzuG
+DncLKvbdMtsRjmAX
+DoCjjvbdJTZArlxM
+EPCkKvbdlZSrTZGt
+DncKjvbdRyjITCvA
+DoCjjvbdEuxpPmKF
+DnbkKvbdTYKkmzjx
+DoDLKvbduDDVXWPP
+DncLKvbdjAPfaPgK
+DncLKvbdrEFJPnVa
+EPCjjvbdrXQMChyR
+DnbkKvbdznpQeDLx
+DoCkKvbdjgflFfOL
+EObjjvbdjlalZdgP
+DoCjjvbdtbcUvvOo
+DoCkKvbdrEFIonWB
+EObjjvbdwXMAvAuu
+DncLKvbdePFSkUTr
+EPCkKvbdTppoUuIN
+EPDKjvbdIxUCHlQp
+DnbkKvbdBiLBjiGK
+DoDKjvbdliDspuRa
+EObjjvbdFkFTDIMu
+EPCjjvbdsQVnjDVf
+EPCjjvbdKefIBaRV
+DoDKjvbdIryAsNYM
+DoCkKvbdsrqrxzEc
+EPCjjvbdLqwNZuQz
+EOcLKvbdcIlikGXY
+DoCjjvbdADSXizIp
+DoCkKvbduaEZTOeI
+DncKjvbdvBDyTPEh
+EPCkKvbdRkZFuHKs
+DoDLKvbdSLZFuGkT
+EOcLKvbdfekzOHHA
+EOcLKvbdkaMoNALA
+DncLKvbdkNCMZeGo
+EObjjvbdNsUVfduQ
+EPCjjvbdZoNiEeZj
+DoDLKvbdLYpirzuG
+EPDKjvbdmoyxujyC
+DoCkKvbdaMjbSuNH
+EPDLKvbdxxIjCPzL
+DnbkKvbdVAaqSprZ
+DoCjjvbduVmxJqTA
+DoCkKvbdRkZGVHLT
+DoDKjvbdEuyQPljF
+DnbkKvbdptUHSRkU
+DncLKvbduLxWaUAw
+EObjjvbdaaVdfQQX
+EPDLKvbdWWiYVdFH
+EOcLKvbdfelZmgHA
+DoCjjvbdADRxKZiQ
+EOcKjvbdfHkWSORH
+EObkKvbdTAEiIBoE
+DncKjvbdEKIKVxKA
+DoCkKvbdkDMKpgVH
+DnbkKvbdCWzciEpW
+EObjjvbdxZgefXeS
+EOcLKvbdsZkpTBIO
+DoDLKvbdrJAKFMne
+EPDKjvbdkWXNdBww
+DnbkKvbdRbEFLhyL
+DncLKvbdWXJYWDeH
+EOcLKvbdijFgjMwr
+DoDLKvbdnHExMnGy
+EObkKvbdZeYGzhJC
+DnbjjvbdEvZPpMie
+EObjjvbdYpldiMdq
+DoCjjvbdfRaWzlCo
+EPCjjvbdGYtuBDxC
+EOcLKvbdQYmAGrrK
+EPCkKvbdlhcspuSB
+DoDLKvbdezvZFIsw
+EOcKjvbdlYsSTZHU
+DnbkKvbdmfeXmOGy
+DncLKvbdKDKDQicY
+DncKjvbdZjTIQHCG
+DnbkKvbdgFkzOHHA
+DnbkKvbdaNLBsVNH
+DoCjjvbdBsBCtGWr
+DncKjvbdqdFIomvB
+DnbkKvbdkNBlZdfo
+DnbkKvbdSQTgKGDw
+DoCkKvbddoFTLTsr
+DoDKjvbdEYYLtTtM
+EOcKjvbdVwJYWEEg
+DoDLKvbdyOSgwrhc
+DoCkKvbdZMRdUOLm
+DoDLKvbdYSlBMtOx
+EPCkKvbdkxsRsYft
+DnbkKvbdrzLpTAgn
+DncKjvbdRjxfUgKs
+DnbkKvbdqquLNkAm
+DoDLKvbdRMxCYnUz
+EPCjjvbdZoOIdeZj
+EObkKvbdrpWOicVf
+EPDLKvbdkCkjqHVH
+EOcKjvbdmSZUzSci
+EObjjvbdRjxfUgLT
+EObjjvbdNddThhjd
+DoCjjvbdKVuFcdfi
+EPDKjvbdzjVPodTU
+DncKjvbdJTYaSmXl
+DncKjvbddZyQXyQb
+EPCjjvbdCIkCKiFj
+EPDKjvbdTkunaWOi
+EObjjvbdfIKuqnRH
+DoCjjvbdZRMdiMeR
+DnbjjvbdMpXpunHT
+DoDLKvbdZRNEhmFR
+EObjjvbdaoffdLzd
+DoDLKvbdvAdYsOdh
+DnbjjvbdSLZGUgLT
+DoCjjvbdSCDdkiZL
+DoDLKvbdelewHNKL
+DoCjjvbdRXNdDMHc
+EObjjvbdkWWnDaww
+EObjjvbdcyxoxZRC
+DncKjvbdelfWfljL
+EObjjvbdZnnJEdzK
+EOcKjvbdkHflGFnL
+DoCkKvbdhbPCdwRR
+EPDLKvbdHDkWKCKK
+DnbkKvbdRadEkiYk
+EOcLKvbdFWYopNJe
+DoDLKvbdqTsfrSKt
+EObjjvbdxnSgxTJD
+EPDLKvbdxZhFewdr
+EPCkKvbdTvLojTaR
+EObjjvbdfIKuqnQg
+EPCjjvbdDxXlTssl
+EObjjvbdQvmccLhD
+EObkKvbdRNXayOUz
+EPCjjvbdatbGxLTh
+EOcKjvbdOSsvGeVQ
+EPDKjvbdePFTKstS
+DnbjjvbdlYsRsZHU
+DnbjjvbdZisIQGaf
+DoCkKvbdsrqsYzEc
+EObjjvbdfILVqnRH
+DnbkKvbdZHWdAPTJ
+DoDLKvbdEPCkLXCd
+EObjjvbdEXwktTsl
+DncLKvbdFVyQPlie
+DncKjvbdNsUWHEtp
+EOcKjvbdyqOmJKXA
+EOcKjvbdADSYJyhp
+EPDKjvbdUyIUZjoO
+EOcKjvbdmJEURVSB
+DnbjjvbdIwtBgkpp
+EPCjjvbdZQmEhldq
+EPCkKvbdDjHiuxKA
+DoDKjvbdrEEiQOVa
+DncKjvbdKDKDQjCx
+DncKjvbdZRNFJMeR
+DncLKvbdwygeeweS
+DncLKvbdnUuZkKSG
+DoDKjvbdvwMAvBWV
+DoCjjvbdBhkCLIfK
+DnbjjvbdoznDkXoA
+EOcKjvbdjgflFemk
+EObkKvbdKVtfDdgJ
+DnbjjvbdXrkaNUPY
+DncKjvbdhlEdNtby
+EPDKjvbdemGWfmJk
+DoDLKvbdlhctQtrB
+EObjjvbdnVVZkJqf
+EObjjvbdwuNEpyMO
+DoCjjvbdTpqOuVHm
+EObjjvbdbLLennDA
+DoDLKvbdiGjDZWKV
+EPDLKvbdFjeTDHlu
+DoDLKvbdDxYLstUM
+EPDLKvbdiUzFXSVC
+DncKjvbdJYTbHkpp
+DoCkKvbdZshhxdSn
+EPDKjvbdxrnIlqag
+EOcLKvbdiHJcYvJu
+DnbjjvbdkVwNcaxX
+EObjjvbdpyPIGpcx
+EPCkKvbdauCGxLUI
+EObkKvbdWRnXadkc
+DnbkKvbdVUNUGLvK
+EObkKvbdDxYLsssl
+DnbkKvbdCJKbKhfK
+DncLKvbdbhmKKfXY
+EOcLKvbdZoOIeFZj
+DoDLKvbdkNCLzFHP
+EObkKvbdpxnggQdY
+EObkKvbdYqNFJNEq
+EPCjjvbdyzdnSHhh
+EOcKjvbdczZQYZQb
+DncKjvbdZyDimblS
+DncLKvbdyOTIXrhc
+EObjjvbdhzUelQnG
+EObjjvbdFjeTChNV
+DoCjjvbdwMvANEEm
+DoDLKvbdRXOEDMID
+DncKjvbdiHJcYvJu
+EOcLKvbdhtzFWrVC
+DncKjvbdVYgsykPO
+DoCjjvbdGGKRmiUR
+EPDLKvbdQmXbYnUz
+DnbkKvbdkIGlFemk
+DoCjjvbdSPsgJfDw
+DncKjvbdzjVQPcrt
+EPDKjvbdmfdxNNfy
+EPDKjvbdZyDimblS
+DoDKjvbdANIZSvzY
+DoCkKvbdJqZdoGOF
+EOcKjvbdcJMijewY
+DncLKvbdNQXqWNfs
+DncLKvbdkNBlZeGo
+DoCjjvbdHffzZYXg
+DoDKjvbdjhHMGGOL
+DnbkKvbdiCObdvpq
+DoDLKvbdYlRctNkm
+EObkKvbdiUzEwRuC
+DncLKvbdMfbomPuL
+EPCkKvbdlZSrSyGt
+DncLKvbdvAcxroFI
+DoCjjvbdNGcQNQUk
+DncKjvbdWSNxBeLc
+EPCkKvbdqvokcIyR
+DncLKvbddZyQXxqC
+DoCkKvbdvPTzqLPU
+DncLKvbdZxcjNblS
+EPCjjvbdkMbLzFHP
+EPCkKvbdlYrqsYgU
+DnbjjvbdWSOXbFMD
+DnbkKvbdWeyZtAPT
+EPCkKvbdEKHivYKA
+DoCkKvbdkNBkyeGo
+DoDLKvbdiBoDEvqR
+DoDLKvbdRkYfVGjs
+EOcKjvbddneSkUTr
+EObjjvbdFejRnItR
+DncLKvbdLAjgMbXq
+DnbkKvbdUGznLwVe
+DoDKjvbdLqwNZtpz
+EPDKjvbdUxhTyjnn
+EPDLKvbdkNBkyeHP
+DoCjjvbdgFkzNgHA
+EObjjvbdunszpjnt
+EPCkKvbdtAHQhABS
+DnbjjvbdbKkfOnDA
+DoCjjvbdVviYWEFH
+DoCjjvbdGZUuAdXb
+EObjjvbdhlFDmuCy
+DncLKvbdyfyMAMdw
+EObjjvbdFyUtaDxC
+DnbkKvbdeEoSCXDK
+EOcKjvbdbVCGwjtI
+EOcLKvbdTAEhgand
+EObkKvbdRpUHJecw
+DnbjjvbdZsiJZDrn
+DncLKvbdtSqrxyeD
+DoDKjvbdJSxaSmYM
+EPCkKvbdjuvnECYX
+DoDLKvbdrMyjYkgi
+DnbkKvbdjJegjNXr
+DoDLKvbduaDxsOdh
+DoDLKvbdmIcsptrB
+EObkKvbdFkFTDHmV
+DnbjjvbdYORAYVVt
+DncLKvbdddoRbWcK
+EPDLKvbdLrWmZuQz
+DoDLKvbdliETpuRa
+DoCjjvbdbrcKsdKB
+DoCkKvbdHkazmvpk
+EPCjjvbdUaBpsRRy
+EObkKvbdKfFhBaQu
+DoCkKvbdKQydnfNe
+EOcLKvbdDjIKVxKA
+DncKjvbdpeceUWBI
+DncLKvbdKaLHNBxR
+EPDLKvbdptTfrRkU
+EPDKjvbddndsLTtS
+EObjjvbdMpXpvOHT
+DnbkKvbdaMjaruNH
+DoCkKvbdpecdtVaI
+DncLKvbdRpTfjGEX
+EObkKvbdCSaCsevr
+DoCkKvbdnHEwmNgZ
+EObjjvbdfHjuqmqH
+DoDKjvbdKWVGDeGi
+DoDLKvbdWHxVxHYz
+DnbjjvbdXsLaMsnx
+EPDLKvbdDjHiuwjA
+DnbjjvbdaaWFGQQX
+DnbjjvbdsrrTZZdc
+DoCjjvbddneTKtUS
+DoDKjvbdcJMjLFvx
+DoDKjvbdaNKbTUlg
+DnbjjvbdkHflFfOL
+EObjjvbdJpzFOeme
+DoCjjvbdrounibuf
+DoCjjvbdHgHZxwxH
+EOcLKvbdSKxeuGkT
+EOcLKvbdzQoNJJwA
+EObjjvbdZnnJEdzK
+DoDLKvbdJuuFcdfi
+DncKjvbdIryBSmYM
+EObkKvbdyYJJaozL
+EObjjvbdFkEsDHmV
+DnbkKvbdfMfXHMjL
+DnbkKvbdLGGIBaRV
+EOcLKvbdRXNdDMHc
+DoDKjvbdegjvRnRH
+DnbkKvbdKeegaaQu
+DnbjjvbdkMakzEgP
+DoDKjvbdcTDKtEKB
+DncLKvbdhaoDEvqR
+DncLKvbdmgEwmNfy
+EPDKjvbdCIjbLIfK
+DncLKvbdJvUedEgJ
+DoCjjvbdFVxpPljF
+EOcLKvbdJYUCIMRQ
+EPDKjvbddwyssrFz
+DoDKjvbdiMEdOUcZ
+DoDKjvbdZQleIldq
+EPCkKvbdnQZyVkYb
+DoCjjvbdNGbpNPuL
+DoCkKvbdOStVgFVQ
+EOcKjvbdGBPQxizm
+DnbjjvbdOXoVzcnU
+DncKjvbdyqPNIiwA
+DoDLKvbdkIGlGGNk
+EPDKjvbdbiNKLFvx
+DoCkKvbdCTBCsfWr
+DoDKjvbdShyjRABM
+EPCjjvbdxwhjBozL
+DoCkKvbdqUUHSSLU
+DoDKjvbdbBVdfPow
+DoCkKvbdqYnggRDx
+DoCkKvbdtkwwAsaX
+EPDLKvbdZMSDsnMN
+EPDLKvbdZjTIQGbG
+EPCjjvbdzoPpdblY
+EPDKjvbdVviYWEFH
+DnbjjvbdUsltGLuj
+DoCkKvbdQdDAopcr
+EPDKjvbdZxcjNbkr
+EPCjjvbdZisHpGbG
+EPDKjvbdEuxpPmKF
+EOcKjvbdQwNccLgc
+EPCjjvbdEYYLstUM
+EObkKvbdZRNEhmEq
+DoDKjvbdaRfDIUGL
+DncKjvbduaDxsOeI
+EObkKvbdmaiwYPOV
+EOcKjvbdKDJbqJbx
+DoDKjvbdQvnEDLgc
+DnbkKvbdtlXvaTaX
+EPDKjvbdzQoNIiwA
+EOcLKvbdNeDsiIjd
+DnbkKvbdBdQAvJlf
+DoCkKvbdhzVGMROG
+EPDLKvbdUaCQsRRy
+EOcLKvbdZisHogCG
+DoCkKvbdlqxtzTDi
+DoCjjvbdRkZGUgKs
+EObkKvbdZnmhdeZj
+EOcLKvbdZjTHogBf
+DncLKvbdhytfLqNf
+EPCkKvbdnPyxvKxb
+DncLKvbdjcMKqHVH
+EPCkKvbduWNwjRTA
+DnbkKvbdwygfGXeS
+EObjjvbdTlWOaVoJ
+EPCjjvbdUtNUGLvK
+EObkKvbdKkAgvAKZ
+EObkKvbdaMkCTUmH
+EPDKjvbdOFDshhjd
+EPDLKvbdhzUfLpmf
+EPCkKvbdkySrTYgU
+EOcLKvbdFfKSNhsq
+DncKjvbdOAJTUKSA
+EPDLKvbdrDeJPmvB
+EPCkKvbdKRZdnfNe
+EPCjjvbdRDcAoqDr
+EOcKjvbdNHDQNPtk
+EOcLKvbdVTmTfMVj
+EOcKjvbdrXQMChyR
+DoCjjvbdZQmFJNEq
+EPCkKvbdWRmwadkc
+EObkKvbdSCDeLhyL
+DncKjvbdyNsHxTJD
+EPDKjvbdtSrTYydc
+DoDLKvbdiGjCxuiu
+DoCkKvbdrNZjZLgi
+EPDLKvbdJmADzGuB
+DncLKvbdtcCuWuno
+DnbjjvbdDxXktTtM
+EPCjjvbddZyPxZQb
+EPDLKvbdlqxtysDi
+DoDLKvbdbAueGPpX
+EObjjvbdVviXvDdg
+EPDKjvbdBdQAvKMf
+DnbkKvbdPxmAHSqj
+DoDLKvbdUsltFlWK
+DncKjvbdVhYWYHYz
+DoDKjvbddwzTtSFz
+DncLKvbdIGfzYwwg
+EPCjjvbdmJDsqUrB
+EPCkKvbdGQASwGey
+EOcLKvbdTlWOaVoJ
+DncLKvbdLFehCBRV
+DnbjjvbdTkvOaVoJ
+EPCkKvbdwXMAvBWV
+EObjjvbdpxnhGqDx
+EOcLKvbdsrqryZeD
+DoDLKvbduVnXjQsA
+DncLKvbdRotHKFdX
+EOcKjvbdnUtyjirG
+EOcKjvbdCJLCLJFj
+EOcLKvbdSCEFLiYk
+DoDLKvbdjcMLQgVH
+DoCkKvbdLBLGlaxR
+EObkKvbdZQldiNFR
+EOcLKvbduMXwAsaX
+DncKjvbdxrnIlrBg
+EObkKvbdehKvRnRH
+DoDLKvbdRosfiecw
+DoCkKvbdFjdrcINV
+EPCjjvbdkWWmdBxX
+DnbjjvbdFkFTDHlu
+DoCjjvbdTAEhgaoE
+DoDKjvbdANIZTWyx
+EObkKvbdJSyAsNYM
+EPDLKvbdqTtHRqkU
+EPDKjvbdbBVeFoow
+EPCkKvbdYSkaMsoY
+DncLKvbdDnbkKwDE
+DncKjvbdMSWlzUpz
+DncKjvbdauCHXjsh
+DoCjjvbdTvMQKUBR
+DoDLKvbdrRuLOLAm
+EOcKjvbdatbGxKtI
+DncLKvbdNGcQMotk
+EPDKjvbdiCObeWqR
+DoDKjvbduDDUwVno
+DncLKvbdYlRcsmkm
+DncKjvbdbAueFoow
+EObkKvbdYTMBNToY
+DncKjvbdvAdYsPEh
+EObjjvbdBdQBWKMf
+DnbkKvbduCbuWuno
+EOcLKvbdKWVGEFHJ
+EObkKvbdcyyQXxqC
+DnbkKvbdaMjasUmH
+EPCkKvbdmgEwlmfy
+DoDLKvbdrDdiQOVa
+DoDKjvbdUyIUZjnn
+DnbkKvbdnBjXYOnV
+EOcKjvbdRpTgJfDw
+DncKjvbdjcLjqGuH
+DnbkKvbdZjTIQHCG
+EOcKjvbduVnYKRTA
+DnbkKvbdGckWJbKK
+EObjjvbdZyEJnDMS
+DncKjvbdNsUWGduQ
+EObjjvbdKQzEoFme
+EOcKjvbdVUMtGLvK
+EPDKjvbdrJAKFMoF
+DoCkKvbdNrsvHFVQ
+DncLKvbdSKyGUfjs
+DoCkKvbdVvhxWEFH
+DncLKvbdFejRnIsq
+EObjjvbdVYhUZkOn
+DoCjjvbdxUmEpxkn
+DoDLKvbdBiLCKhej
+DoDKjvbdIjEAJofd
+EOcKjvbdwzHfFwdr
+DncKjvbdFjeTDHlu
+DnbjjvbdbiMjKewY
+DnbjjvbdaNLCTUlg
+EObjjvbdDwxMUUTl
+DoCkKvbdmttykKSG
+EPDKjvbdiUyeXSVC
+EPDLKvbdWIYVwfxz
+EPDLKvbdemFvgMik
+DoCkKvbdUyHszKoO
+EObkKvbdTXkMNzjx
+DoDKjvbdSQTgKFdX
+DnbjjvbdLiBkpxAS
+EPCkKvbdRosgKGEX
+DoCkKvbdmfdwmNgZ
+DncLKvbdiHJbyViu
+DncLKvbdxrnJMqbH
+EOcKjvbdhlFENtcZ
+DoCjjvbdbKkennDA
+DnbkKvbdGckWKBjK
+DnbjjvbdUyIUZkOn
+EPDKjvbdeEnrCXDK
+EOcKjvbdsBfMkgKy
+DncKjvbdxsNiNSBg
+EPDKjvbdkNCLzEgP
+EPDKjvbdSKyGVGjs
+DoDKjvbdrWolChyR
+DncLKvbdWSNwaeLc
+EOcKjvbdJYTbHkqQ
+DnbjjvbdZshiZDsO
+DoDKjvbdSKxfUfjs
+EPCkKvbdptTgRrKt
+EPCjjvbdREDApQdS
+DncLKvbdtvOXjRTA
+EPDKjvbdemGXGljL
+EObjjvbdBdQAvJmG
+EPDLKvbdhuZdwRuC
+DncLKvbdjvWnDaxX
+EPDLKvbdFVxopMie
+EPCkKvbdajkeoNcA
+EPCjjvbdSPsfifEX
+DnbkKvbdBsAcTfWr
+EPCjjvbdEOcLLWcE
+DoCjjvbdZLrDsmlN
+EPCkKvbdxnSgxTIc
+EObjjvbdGQATXGey
+EObkKvbdbsDLUEKB
+DoCjjvbdrSVKmjaN
+EPCkKvbddneTLUUS
+DoCkKvbdxmrgwsJD
+EPDKjvbdGYuVAdXb
+DncLKvbdauBfxLTh
+EPDLKvbdrMzKZLgi
+EObkKvbdUsltGLvK
+DnbjjvbdDxXlTstM
+EObkKvbdsBfNLgLZ
+DncKjvbdidjgUoAO
+EPDLKvbdJJdAKQHE
+EOcKjvbdbBWFFpQX
+EPCjjvbdSZihTDWA
+EPCkKvbdhgKCxuiu
+DncKjvbddneTLUTr
+DoDKjvbdczZPxZRC
+DnbjjvbdlYrrTYft
+DoDKjvbdWXJXvEEg
+EPDLKvbdbhmJkFvx
+EPCjjvbdDxYLtTsl
+EPDKjvbdqdFIonVa
+EObjjvbdCIjbLIej
+DnbjjvbdmbKXXnmu
+EPDKjvbdlZTSTYft
+EPDKjvbdwXMBVaWV
+DnbjjvbdSPtGjGEX
+DoDKjvbdrMzKYlHi
+EPCkKvbdiVZdwSVC
+DnbjjvbdptUHSSKt
+DncLKvbdcSbjscjB
+DoDKjvbdSPsfiecw
+EOcKjvbdegkVqnQg
+EObkKvbdjuvmcbXw
+DncKjvbdCJLCKhfK
+EObjjvbdVqnYBeMD
+DoCjjvbdKCjCqJcY
+DncLKvbdZRMdhmEq
+EOcKjvbdrRtkOKaN
+DoDLKvbdRpTfiedX
+DoCjjvbdRMwbZOUz
+DoCjjvbdrXQMDIxq
+EObjjvbdsrqsZZdc
+DnbjjvbdfjfzbfAE
+DoCkKvbdJSyBTMxM
+EPDKjvbdnCJvwoNu
+DoCjjvbdmbJvwoNu
+DnbkKvbdFWZQPljF
+DncLKvbdxnSgwriD
+DnbjjvbdVvhwucdg
+DoCjjvbdjgfkfFnL
+DncLKvbdzRPMiKXA
+EOcLKvbdqZPHgREY
+EPCkKvbdrylPsAgn
+EPCkKvbdVZITykPO
+DoCjjvbdhkeEOVDZ
+EOcKjvbdUVkpJtAq
+EOcKjvbddCTMrAUN
+EPDKjvbdZeXfzghb
+EPCjjvbdiMFDmuDZ
+EPCjjvbdJKEAJpHE
+EOcLKvbdajkeoODA
+DnbjjvbdZRNEhmFR
+EOcLKvbdNHCpNQVL
+EObjjvbdmRxtzSci
+DoCjjvbdzRPMhjXA
+DnbkKvbdnGdwmNfy
+EObkKvbdvAcxsOeI
+DoDLKvbdBsAcTevr
+DoCkKvbdozmdKxPA
+DnbkKvbdTlVoBVoJ
+EPCkKvbdqwQLcIxq
+DncLKvbdbiMjLGWx
+DoDLKvbdfHkWRnRH
+EOcKjvbdbVCGxKsh
+DoCjjvbdTqRPUthN
+DoCkKvbdbQGgELzd
+EOcLKvbdQZNAHSrK
+DoDLKvbdZyDjNbkr
+EPCjjvbdqiAJdmOe
+EObkKvbdKaLHNBxR
+DncKjvbdyXhjBozL
+EObjjvbdDjIKWYKA
+EOcKjvbdLFegaaQu
+EPDKjvbdZjTIPgCG
+EOcLKvbdfHjuqnQg
+DnbjjvbdlhcsqVRa
+DoCjjvbdMuSqkNAX
+DncLKvbdCIkBkIej
+DncKjvbdUaCQsQqy
+EObjjvbdRbDdkhyL
+EOcKjvbdpssfrRkU
+EOcKjvbdLGFhBaQu
+EPCkKvbdqqtjnLBN
+EOcLKvbdWRmwbEkc
+EObjjvbdpedFTuaI
+DoCkKvbdJJdAJofd
+DoDLKvbdwNWANEEm
+EPCkKvbdYgWdAOri
+DoDLKvbdvAcyTOeI
+DnbkKvbdbhmJjfWx
+EOcLKvbdypnliKXA
+EOcKjvbdZyEJnClS
+DoCjjvbdZoNhdeZj
+EPCkKvbdkDLkRGtg
+EObjjvbdNsUWGdtp
+DnbjjvbdZQldhmFR
+EOcKjvbdYpmEhldq
+EPCkKvbdZQmEiMeR
+DnbjjvbdhytfLpnG
+EObjjvbdmtuZkJrG
+EObjjvbdGLEsDINV
+EPCjjvbdVhXvYHYz
+DoDLKvbdKefICAqV
+DncKjvbdUtMsfLvK
+EOcLKvbduaEZTOeI
+EPDKjvbdddoSBwDK
+DoCkKvbdffLymgHA
+DnbkKvbdbAueGQQX
+DnbkKvbdbrcLTcia
+EPCjjvbdRbEElJYk
+DoCkKvbdGFirNiTq
+DoDKjvbdNdctIhkE
+EPDLKvbdQccAoqES
+DnbkKvbdFfKRnJUR
+DnbjjvbdFfJrNiUR
+EPDLKvbdCfkegAzc
+EPCjjvbdRXNccMHc
+DoCkKvbdZjShPgBf
+EOcKjvbdSLZGUfkT
+DoDLKvbdBcpAujMf
+EOcLKvbduWNwiqTA
+DoDLKvbdpyOgfqEY
+EOcKjvbdcScKtEJa
+EObjjvbdnCJwXoNu
+DnbkKvbdjFLGtoAO
+DoCjjvbdXrlBMsnx
+EPDKjvbdhgJcZWJu
+DoCjjvbdiBoDEvpq
+EPDKjvbdczYoxYqC
+DoDLKvbdjFLHVPAO
+DnbjjvbdbPgGdLzd
+DoDKjvbdWIYWYGxz
+DncKjvbdhytfLpnG
+EObjjvbdfHjuqnQg
+DnbjjvbdmgExMmgZ
+EOcLKvbdhgKDYuiu
+EPDKjvbdmJEURVRa
+DoDLKvbdJpyePGNe
+DoDLKvbdlhdUQuRa
+EObkKvbdmuUzLKSG
+DnbjjvbdxwhjBozL
+EPDLKvbdVZIUZjnn
+EPDLKvbdJpydnfOF
+EPCkKvbdqqtjmjaN
+EPCkKvbdZoOJFFZj
+DnbjjvbdmttzKjRf
+EPDLKvbduWOXjQsA
+EOcLKvbdwtleRYkn
+DoCjjvbdLYpjSzuG
+EObjjvbdIsYaSmYM
+DnbjjvbdyzeORhJI
+EOcLKvbdkWWnECXw
+EPDKjvbdVviYVcdg
+DoDKjvbdBcoaVjMf
+DoCkKvbdiMEcmuDZ
+EObjjvbdLKaHvAKZ
+DncLKvbdJTZArlwl
+EOcLKvbdhaoCeWpq
+DncLKvbdrWpLcJZR
+EObkKvbdHkaznWpk
+DnbjjvbdzjVPocrt
+EOcKjvbdyqPMhiwA
+DoCkKvbdpstHRqkU
+DnbkKvbdRkYfVHKs
+DoDLKvbdVgwvYGxz
+EOcKjvbdFfKSNiUR
+DnbkKvbdqquLOLBN
+DncKjvbdOAJTTjSA
+DoDKjvbddneSkUTr
+EObkKvbdlqyUysEJ
+DoDKjvbdbhmKKevx
+EOcLKvbdiCObdwQq
+EPCkKvbdFejSNiTq
+EObkKvbdwygfGYEr
+EPDLKvbdsQWPKDVf
+DncKjvbdjbkjpfuH
+EPDKjvbdRkZFuGjs
+EPDKjvbdwyhFfXdr
+DncKjvbdcIlikFvx
+DoCkKvbdiUydwSVC
+DncKjvbdiUzFXSVC
+EOcKjvbdjKFgimYS
+EPDKjvbdjvXODaww
+EPCkKvbdRbDdlJZL
+EObkKvbdrEEhpNvB
+EObjjvbdrpVoKDWG
+DoCjjvbdNxPVzcnU
+EPDKjvbdVgwvYHYz
+DnbjjvbdmuUyjirG
+EObjjvbdrSVLNkBN
+DncKjvbdUWLojUBR
+EOcLKvbdwygefXeS
+EObkKvbdhaoDEvqR
+EOcLKvbdGGKRmiUR
+EOcKjvbdeEnqawDK
+EPDLKvbdGGJqnItR
+DoDLKvbddeOrBvbj
+DnbkKvbdiVZeWquC
+DncLKvbdJcJcQjDY
+EPDLKvbdkDMLQgUg
+EObjjvbdemFvflik
+EObkKvbdwzHeewdr
+DoCjjvbdHDjuiajK
+DoCkKvbdrEEiPnVa
+EOcLKvbdypnmJKXA
+DoDLKvbdmgFXmOHZ
+EObkKvbdUsmUFkuj
+EPDLKvbdcScKtDjB
+EPCkKvbdUyITzLOn
+DncKjvbdZnnIddyj
+EPCkKvbdaaVeGPow
+DoCjjvbdSQTfifDw
+DoDKjvbdDoDKkXCd
+DncLKvbdhtzEwRuC
+EObkKvbdMpXqVnGs
+DoDKjvbdDncLLXCd
+DoCkKvbdtcDUwVoP
+DoDKjvbdtSqryZdc
+EPDKjvbdbBWFGPpX
+EPCjjvbdmRxtyrdJ
+DoDLKvbdGckVjCJj
+EObjjvbdzoPpeCkx
+DnbjjvbdKWVFceHJ
+EPCjjvbdSKyGVHLT
+DoDLKvbdelevgNKL
+DoCjjvbdTXjlNzkY
+DoDLKvbdpstHSSLU
+EPDKjvbdhgKCxuiu
+EObkKvbdZQleJMeR
+EPCjjvbdKVuGDdfi
+DncKjvbdUGzmkvvF
+DncKjvbdxrnJMqbH
+EPCjjvbdKVuGDdgJ
+EObjjvbdptTgRqjt
+EObjjvbdCDpAujMf
+EPDKjvbdczZQXyRC
+DncLKvbdqYngfpdY
+EOcLKvbdqBIeAXIE
+EPDLKvbdZLrETmlN
+EPDKjvbdNeEThhjd
+EOcLKvbdmbKWxOnV
+DoCkKvbdCDoaWKNG
+EOcLKvbdEOcKkWbd
+EPCkKvbdNQXpvOGs
+EPDLKvbdFyUtaDxC
+EPDKjvbdbLMGOnDA
+DoDLKvbdJcJcQjDY
+EPDLKvbdOTUWHFUp
+DoCjjvbdmgFXlnGy
+EOcLKvbdRDbaQRES
+DoDLKvbdcyxowxpb
+EPDLKvbdliEURVSB
+EOcKjvbdXnRAXuWU
+DoCkKvbdDnbjjwDE
+DoCkKvbdKVuGEEfi
+EObkKvbdyOTHxShc
+EPDKjvbdySnIlqbH
+DoDLKvbdHELWJbJj
+DnbjjvbdyOTHxShc
+DnbjjvbdczZQXxpb
+EPDLKvbdZLrDsmkm
+EPCjjvbdfNGWflik
+EPDKjvbdmbKWwnmu
+DncKjvbdrDdiPnWB
+EObjjvbdHDjvKCKK
+DnbkKvbdUVkojTaR
+EObjjvbdptTfrSKt
+EPDKjvbdFxttaEXb
+DoCkKvbdjvXNcbYX
+DoCkKvbdSLYfUgKs
+EOcKjvbdHakzEzAD
+DncLKvbdiCObdwQq
+EPDLKvbdZLqdUNlN
+DoDLKvbdhkeDnVCy
+EPCkKvbdemFvgNKL
+EObjjvbdliDtQuRa
+EObkKvbdwuMdpxkn
+EObkKvbdirzhrkJz
+EPCjjvbdJYTahLqQ
+DncLKvbdIHGyxwwg
+EPCjjvbdSQUHKGEX
+DoCjjvbdZshiYcsO
+EOcLKvbdPyNAHSrK
+EPCjjvbdbsCjscia
+EObjjvbdUWLojUBR
+DoDLKvbdKeehBaQu
+EObjjvbdjuwODaww
+DoDLKvbdtkxXAsaX
+DncLKvbddneSkTtS
+DnbjjvbdZtJIxcsO
+DnbjjvbdJTYaTNXl
+EPCjjvbdGKeTDHlu
+DoDLKvbdKQydoGNe
+DoDKjvbdVrOXaeLc
+EPCkKvbdzHYlAMeX
+DoDLKvbdBvzchdov
+EObkKvbdapGgELzd
+DoDKjvbdaMkBsUlg
+DnbjjvbdVUNTelWK
+EObjjvbdiHJcZWKV
+DncLKvbdZoNheEyj
+DncKjvbdDHMFgAzc
+DnbkKvbdFpATXGey
+EPDKjvbdMpXqWOHT
+EPCjjvbdmSZVZrdJ
+EPDKjvbdcIljKfXY
+DoCkKvbdjcLkRGuH
+DoDLKvbdGYuVBEXb
+EObkKvbdWXIxWDeH
+DncKjvbdQlxCZOUz
+DnbjjvbdYNqAXtut
+EPDLKvbdGdKvJbJj
+DoDLKvbdGLFSbglu
+EPCkKvbdRjxfVGkT
+DoCkKvbduCbuXWOo
+DoCjjvbduCbtvuno
+EObkKvbdjAQGaQGj
+DoDLKvbdqBJFAXHd
+EOcKjvbdkClKpgVH
+EOcLKvbdiMFDmtby
+EPDLKvbdjvXNcbXw
+EPCkKvbdxUmFRYkn
+DoDKjvbdHgGyyYXg
+DoCjjvbdRzJhScWA
+DnbkKvbdlZTRsYgU
+DnbkKvbdFVxpQNJe
+EPCkKvbdZyEJmcMS
+EObjjvbdZQldhmFR
+EObjjvbdYSlBMtPY
+DncLKvbdvBDxsOdh
+DoDLKvbdvAdYrndh
+DoCjjvbdZyEJmcLr
+DnbkKvbdKaLGmCXq
+DnbkKvbdZQmFImEq
+EOcKjvbdqvolDIxq
+DnbkKvbdVqnYBdkc
+DoCkKvbdnPyxvLZC
+EOcLKvbdmJEURUqa
+DoDLKvbdfHkVrNpg
+DoCjjvbdznopdblY
+DoCkKvbdjvWmdCXw
+EOcKjvbdunszpjnt
+EObkKvbdzoPqFDMY
+EObjjvbdDxXktTtM
+EObjjvbdBcoaVjMf
+DncKjvbdtcDVWuno
+EObjjvbdpyOggQdY
+DnbkKvbdwWkaWAuu
+EPCjjvbdajkeoODA
+EOcKjvbdKNAEZfta
+EOcKjvbdZisIQHCG
+DncLKvbdEXwksstM
+DoDKjvbdtbbuXVoP
+DncLKvbdDxYMTstM
+DoCkKvbdcyyPwxpb
+EPCkKvbdxmrgwsJD
+DoDKjvbdYSkaNUOx
+EOcLKvbdxwhjCPyk
+DncKjvbdUsmTekuj
+DnbkKvbdkVwOECXw
+EObkKvbdnBjXYOnV
+DncKjvbdcasNSATm
+EPDKjvbdTAFIhCOd
+DnbkKvbdkWWnECYX
+DnbkKvbdFjeSbgmV
+DoCjjvbdJzoewdAN
+DnbkKvbdZeXfzhIb
+DncKjvbdMJCLqYAS
+DoCkKvbdGLFTCglu
+DoDLKvbdMuSrLNAX
+EOcKjvbdqceIomvB
+DoDLKvbdegkVqnRH
+DoDKjvbdKfGICBQu
+EOcKjvbdEvYopNKF
+DnbjjvbdlrZVZsEJ
+DoDLKvbdqqtjmjaN
+DncLKvbdQmXaxmtz
+EPDKjvbdCDoaVjNG
+EPCkKvbdqquLNjaN
+DnbjjvbdKRZdoFnF
+DoCkKvbdkVwOECYX
+DncKjvbdGQATXGfZ
+DncLKvbdCDpAujMf
+EOcKjvbdDxXlUUTl
+EPCjjvbdYkrEUNlN
+DnbjjvbdZtJIyETO
+DoCjjvbdXsMAltPY
+EOcLKvbdxxIjCPzL
+DoDLKvbdSLZFuHLT
+DncKjvbdFVyQQMjF
+DoCjjvbdFaOpyJzm
+EPCjjvbdrJAJdmPF
+EOcLKvbdMuSqjmAX
+DncLKvbdEJgiuxKA
+EPDKjvbdBdQAuimG
+DnbjjvbdWXIxVdFH
+DnbkKvbdHDkVjBjK
+EPDKjvbdnHEwlmgZ
+EPCkKvbdBiKbKhfK
+EPDKjvbdhyuGLpnG
+DoCkKvbdZsiJZDsO
+DnbjjvbddBrlrAUN
+DoCkKvbdYqMeIldq
+DncLKvbdZLqdUNkm
+EOcLKvbdMuSrKmAX
+DoCkKvbdDxXksstM
+EOcKjvbdqdEiPmua
+DoCjjvbdOEdUJIjd
+DoCkKvbdEObkLWbd
+EObkKvbdfekynHHA
+EPCkKvbdrEFIpNvB
+DnbkKvbdnBjXXoOV
+EPCjjvbdmgEwmOGy
+DncKjvbdKCjDQjCx
+EPDKjvbdJqZdoGOF
+DncKjvbdUsmTfLuj
+DoDLKvbdjcMKpgUg
+EPDLKvbdSQUGjGDw
+DnbjjvbdRacdlJYk
+DncKjvbdYgXEAOsJ
+EPCjjvbdhficZWKV
+DoDKjvbdGAnpxizm
+EPCkKvbdRbDeLhyL
+DoDKjvbdiBncEwQq
+DoCkKvbdxZgfFxFS
+DoCjjvbdqvpMChyR
+EObjjvbdbUbGxKtI
+DoCkKvbdEObkKvcE
+DnbjjvbdKQzEnfNe
+DoCjjvbdRWnDblID
+DnbkKvbdkxrqsYgU
+DncLKvbdqwPlCiYq
+EPDKjvbdSZjHsDWA
+DncLKvbdEPCjjvbd
+EOcLKvbdpyPIGpcx
+DncLKvbdbVCGwkTh
+DnbkKvbdnPzZWKxb
+EObkKvbdGKeTDIMu
+EOcKjvbdiifIKNYS
+DncLKvbdnQZxvKxb
+EPDLKvbdGFjSNiUR
+DnbjjvbdRNXaxnUz
+EPCjjvbdOTTvGduQ
+EObkKvbdUtMselVj
+DoCjjvbdnUuZkKSG
+EPDKjvbdQmXaxnUz
+EPCkKvbdNeDtIhjd
+DncLKvbdNxOuzdOU
+DncKjvbdJJdAJpGd
+DoDKjvbdwuNEqYkn
+DncKjvbdZMSDtOLm
+DnbjjvbdNeDsiJLE
+EPCjjvbdJpzEoGOF
+EPCjjvbdkDLkRGtg
+DoCjjvbdUWLpJtAq
+EPDKjvbdfMfWfljL
+EPCkKvbdrMzJyMIJ
+DoCjjvbdJKEAJofd
+DnbjjvbdnBiwXoNu
+DoCjjvbdDihJvYKA
+DnbkKvbdSZigsDWA
+DoCjjvbdFejRmhsq
+DnbkKvbdaMkCTVNH
+EObkKvbdczZPxZRC
+EPDKjvbdVZIUZjnn
+DoDKjvbdkySrTZGt
+DoDLKvbdsPvPKDVf
+DoCkKvbdwWlBVaVu
+EPDKjvbdANIZSvyx
+EPCkKvbdnHFYNNgZ
+DnbkKvbdNdcsiIkE
+EPDLKvbdDoCkLWbd
+EPDKjvbdQccBPqDr
+EObkKvbdSPsfifEX
+EOcKjvbdelfXHNJk
+EObkKvbdFfKRmiUR
+EOcLKvbdKCibqKDY
+EPDLKvbdUWLpJsaR
+EPCkKvbdKfFhCBQu
+EOcKjvbdmuUzLJrG
+EOcLKvbdBdQBVjMf
+EOcKjvbdfpBzvcwh
+EOcKjvbdmRyUzSci
+EOcKjvbdFVxpPlie
+DnbjjvbdDwwlUUUM
+DncKjvbdUyHsyjoO
+DoCkKvbdUslselVj
+DncLKvbdmuUykJqf
+DncLKvbdLFfHbApu
+DncLKvbdhyuFlROG
+EPDKjvbdxnTIYTJD
+EPDKjvbdTulPjUAq
+DoCjjvbdCDoaWJlf
+DoCkKvbdbLMGOnDA
+EPDKjvbdOStVfdtp
+EPCkKvbdZRMeImFR
+DoDLKvbdiVZeXRuC
+EPDKjvbdRosfiedX
+DoCjjvbdnGeYMnGy
+DoCjjvbdiiehKNYS
+DncKjvbdbhmKKfXY
+EOcLKvbdnBjXXoNu
+EPDKjvbduLwwAtAw
+EOcLKvbdygYlAMeX
+DoCkKvbdNsTvHEtp
+EPCjjvbdsrrTYzFD
+EPCkKvbdBdQAuimG
+DncKjvbdmfeYMnHZ
+EOcKjvbdxZhFexEr
+DncLKvbdZshhyETO
+EObkKvbdOFEUJJLE
+DoDLKvbduDCtvuoP
+EOcKjvbdGZVVBEYC
+EObjjvbdZRMeJNEq
+DnbkKvbdkxsRsYft
+DnbkKvbdsBfNLfjy
+EOcLKvbdNPxQvOHT
+DnbjjvbdpstHRqkU
+EOcLKvbdZQleJNFR
+EPCjjvbdxVNEpxkn
+DoCkKvbdwtmEqZLn
+DoCkKvbdGAoQxizm
+DoDLKvbdVqmwaeLc
+DoDKjvbdKfGHaaQu
+DoCjjvbdcJNKLGWx
+EPDLKvbdrzMPsBHn
+DncKjvbdfoazwDxI
+EPDKjvbdZyEJnClS
+DnbjjvbdwMvANDeN
+EObjjvbdZshiZETO
+EPDKjvbdUslselVj
+DoDKjvbdwtmEpyLn
+DncLKvbdJTYaTMxM
+EPDKjvbdvBDxsOeI
+DoDKjvbdxrmhmSCH
+EPDLKvbdjJegjNYS
+EOcKjvbdJvUedEgJ
+DnbkKvbdVZITyjoO
+DoDKjvbddePSCWbj
+DncKjvbdWIXvXgYz
+EPDKjvbdZQmFJMeR
+DnbjjvbdqdEiPnWB
+DoDLKvbdUVkojTaR
+DoDLKvbdFVxpPmJe
+EPCjjvbdxmsHwsIc
+EPDLKvbdiiehJlxS
+EPDLKvbdCTAbsewS
+EPCjjvbdzoPpdbkx
+DnbkKvbdijGHilxS
+EPDLKvbdOYOuzdNt
+EOcLKvbdTppoUuIN
+DnbkKvbdcScLUDia
+EOcLKvbdePFTLUTr
+EOcLKvbdhgKCxvKV
+EPCkKvbdrJAKFNOe
+EOcKjvbdVwJXucdg
+EPCkKvbdNddUJJKd
+DncLKvbdJYUCHlQp
+EObjjvbdkVvnDaxX
+EPCjjvbdNeDsiJLE
+EPDKjvbdyzeNqhJI
+EPCjjvbdmIdTqUrB
+EPDKjvbdZoOJFEyj
+DoDKjvbduaDxsOeI
+EPCkKvbdKjaIWAKZ
+DncLKvbdKaLHMbYR
+EOcKjvbdrafMlHKy
+EPCjjvbdhtzEvqtb
+EPCkKvbdddoSCXDK
+EOcKjvbdzjUpPdTU
+EPCjjvbdLZRJrzuG
+EOcKjvbdaMjaruMg
+DoCkKvbdyOSgwsJD
+EPCjjvbdKDKCqJcY
+EObkKvbdvAcxrneI
+EObjjvbdwuMeQxkn
+DncLKvbdmSZUysDi
+DnbkKvbdcIlijfWx
+DoDKjvbddndrjtTr
+EOcKjvbdwtmEqYlO
+EOcKjvbdYzcFqivZ
+DnbkKvbdCDpBWJmG
+EOcKjvbdaSGCgsfL
+EObjjvbdIwtBhLqQ
+DnbkKvbdyzdmrIIh
+EPDLKvbdWexzUAOs
+DncLKvbdRXNdCkgc
+EOcKjvbdkVwNdBww
+DncLKvbdIGfzYxYH
+DoCkKvbdbAvFGPow
+DoCkKvbdQlxBxnUz
+DncKjvbdqrUkOKaN
+EPDLKvbdZisIQGaf
+DoDKjvbdsQWPJbvG
+DncLKvbdjhHMFfNk
+EObkKvbdwNWAMdFN
+DoCkKvbdeKKRutzn
+EObkKvbdJpyeOfNe
+EOcKjvbdQmXayNtz
+DncKjvbdnHExNNgZ
+EPCjjvbdULuoBVni
+DoCjjvbdqquLNjaN
+EPDKjvbdyzdnSIJI
+DnbkKvbdQvnDcLgc
+DoCkKvbdtcDUvvOo
+DnbjjvbdnGeXmNfy
+DoDKjvbdxsNhmRbH
+DoDKjvbdtTSSyZeD
+DoDKjvbdRadFMJZL
+EOcKjvbdUaCQrpqy
+DoDLKvbdEJgivXjA
+EOcLKvbdGFjSOItR
+EPDLKvbdaSGDIUGL
+DnbjjvbdJYTagkqQ
+EOcLKvbdZLrDsmlN
+EOcLKvbdEJgiuwjA
+DoDKjvbdxUleRYlO
+DnbjjvbdQwODcLhD
+EObkKvbdOTUVgEtp
+EObkKvbdRMwaxnUz
+EObjjvbdrEFJPmua
+EOcLKvbdiUzEvquC
+DoDKjvbdMpYQumfs
+EPCkKvbdhancEvqR
+DncKjvbdkNCMZdfo
+DncLKvbdZHWdAOri
+EObjjvbdlrYuZrci
+EObjjvbdgLGzbfAE
+EObjjvbdcTCkUEJa
+EPDLKvbdVAbRTRRy
+DoCjjvbdYqNEiMeR
+DncKjvbdBvzchdpW
+DnbkKvbdtSqryZdc
+EPCjjvbdwygeeweS
+DoCkKvbdqlzJyLhJ
+EOcLKvbdtbbtvvOo
+DoDKjvbdrSVKnLAm
+DnbkKvbdfMevgNKL
+EObjjvbdRacdkhyL
+EPCkKvbdFpASvgGZ
+EPDLKvbdZoOJFEyj
+EPCjjvbdzjUpPcrt
+EOcKjvbdcbSlrATm
+EOcKjvbdqwPkbhxq
+DnbjjvbdHELVibKK
+EPDKjvbdZQldiMeR
+DnbjjvbdpstGqrKt
+DoDKjvbdGFjRmiUR
+EPCkKvbdssRsZZdc
+DnbkKvbdlqxuZsDi
+DncKjvbdEXwlUTtM
+DnbjjvbdyzdnRhIh
+EPCjjvbdkCkkRGtg
+EOcLKvbdLrWlytpz
+EPCkKvbdCEQAvKNG
+DncLKvbdVwIxWDeH
+EObkKvbduMYXBTaX
+DoCkKvbdRyihTDWA
+DnbjjvbdkaMoNALA
+DnbjjvbdaMjartlg
+DoCkKvbdNVTSKmAX
+DoDLKvbddwystRez
+EPCjjvbdcImJjevx
+DoCkKvbdeAUQlwjG
+DoDKjvbdZxcjNblS
+DncLKvbdkIGlFenL
+DoCjjvbdfHjurNqH
+DoCkKvbdiBoDFXRR
+EPDLKvbdvBDyTPFI
+DnbkKvbdUxhUZkPO
+EObjjvbdqZOhHQdY
+EOcKjvbdSCDeLiZL
+DncKjvbdozmckYPA
+DncKjvbdgGLymgHA
+DncKjvbdILaznWpk
+EPCjjvbdqUTgSSKt
+DoCkKvbdrovOjCuf
+EOcLKvbdKfGIBaQu
+EPDKjvbdCIjajiFj
+EPCkKvbdmoyxujyC
+EObkKvbdySnJMrCH
+EOcLKvbdHDjujBij
+EObjjvbdrMyiyMHi
+DoCkKvbdiifHimXr
+DnbkKvbdbsCkTcia
+DnbkKvbdMfbpNPtk
+EOcLKvbddoErkUTr
+DncLKvbdqZOhGqDx
+DnbjjvbdDncKkXCd
+DoCjjvbdSCEElIxk
+EPCkKvbdbUbHXjsh
+DnbkKvbdCTAcUGWr
+EPDLKvbdZtIiZESn
+DnbjjvbdrDeJPnVa
+DoCkKvbdZisIQHCG
+DncLKvbdgFkzOHHA
+EPCkKvbdmfdxMmfy
+DncLKvbdMIbMRYAS
+EOcKjvbdaogGckzd
+EOcLKvbdLAkHMawq
+DncLKvbdxwiJbQZk
+DncLKvbdauBgYLUI
+DnbkKvbdnQZxvKyC
+EOcKjvbdFkEsChNV
+DoDLKvbdpstGrRjt
+EPDLKvbdlYrrSxgU
+DnbjjvbdZQmFIldq
+DoCjjvbdbhmKLFvx
+EObkKvbdsBellGjy
+DncLKvbduCcUwWOo
+EObkKvbdJuuGEEfi
+DoCkKvbdIwtCHkqQ
+EPCkKvbdaMkBruMg
+DncLKvbdEARiMyvw
+EObjjvbdmgExNOGy
+DoCjjvbdpfDdsuaI
+EPDLKvbdEzspdlCi
+EPDKjvbdqdFJQNua
+DnbkKvbdnBjWxOnV
+EPDLKvbdZisHogBf
+EPCkKvbdjcMKpftg
+DnbkKvbdauCGwjsh
+DoDKjvbdlYrrTZHU
+EOcLKvbdzjVPpDrt
+DoCkKvbdQdDApQdS
+DoDKjvbdehLWRmpg
+EPDLKvbduoTzpkPU
+DoCkKvbdliDspuRa
+DoDKjvbdEXxLsssl
+EObjjvbdZsiJYcrn
+DoCkKvbdaaWFGPpX
+DoCkKvbdrafNMHLZ
+DoCjjvbdmgEwlnHZ
+EPCkKvbdFkEsCgmV
+DncKjvbdqmZjYlHi
+DoCkKvbdfILWSORH
+DoDLKvbdnCKXYOnV
+DnbkKvbdHgGyyYYH
+DoDLKvbdEKHjVxKA
+EPDKjvbdbAueGPow
+DnbkKvbdFyUuBDwb
+EPDKjvbduCcUvvOo
+EObkKvbdauBfxKsh
+EObjjvbdZjTIPgBf
+EObkKvbdNGbolpVL
+EOcKjvbdeFOqbWbj
+DoCjjvbdvwMAvBVu
+DnbkKvbdzRPMhjXA
+DncKjvbdFkErcIMu
+EPCjjvbdhlFEOUcZ
+DoCkKvbdJbjCpicY
+EPCkKvbdZGwEAOri
+DnbkKvbdNQYQunHT
+DoCkKvbdkIHMFfOL
+EObkKvbdHELVjBij
+DoDLKvbdZQldhleR
+DoDLKvbdVTmTelVj
+DnbjjvbdJTZArlwl
+DnbkKvbdCDpAvKMf
+DoCjjvbdDxYLtUTl
+DoDLKvbdwkWcgzyf
+EPDLKvbdLBKgNCYR
+DoDLKvbdZMSEUNkm
+EOcLKvbdxUmEpxkn
+EOcKjvbdGLFTDHlu
+EOcLKvbdyYJKCPyk
+DoCjjvbdDnbjjvcE
+DoDLKvbdatbHXjtI
+EObjjvbdbiMjLGWx
+EPDKjvbdTYKlNzjx
+EOcKjvbduDDUvvPP
+EObkKvbdliETpuSB
+DnbjjvbdrWolDIxq
+EObjjvbdqZOggQcx
+EOcLKvbdyXiKBoyk
+DnbjjvbdqmZiyMIJ
+EPCjjvbdULuoAuoJ
+DoDLKvbdYzcGRivZ
+DnbjjvbdtkwwBTaX
+DnbjjvbdJbicQicY
+DoCkKvbdTukojTaR
+EPCkKvbdHbLydzAD
+EObjjvbdVTltGLvK
+EPCjjvbdUsmUFkuj
+EPDLKvbdTqROuVIN
+DncLKvbdYkrETnLm
+DoCkKvbdeFPSBwDK
+DnbjjvbdNGcPmPtk
+DnbjjvbdWHwuxHYz
+DoDLKvbdNUsRjmAX
+EOcKjvbdZjTHpHBf
+DncKjvbdWXIwvDeH
+EOcLKvbdrJAKEloF
+DoCjjvbdFeirOJUR
+EOcKjvbdWWhwvEEg
+DncKjvbdKeehBaQu
+DnbjjvbdZLrDsmlN
+EOcLKvbdZnnIeFZj
+DoCkKvbdjKGHjMwr
+EObkKvbdmIctQtqa
+DoCjjvbdkClKpfuH
+DnbjjvbdcTDKscia
+DnbjjvbdADSYKZiQ
+EObkKvbdygZMANFX
+EPCjjvbdaMkCTUlg
+DoDKjvbdzjVPodTU
+EPCkKvbdIxTagkpp
+EPCjjvbdZjSgpHBf
+EOcLKvbdiCOcEvpq
+EOcLKvbdsQWOibvG
+DoDKjvbdEuxoomJe
+DoDKjvbdmuVZkKSG
+DoCjjvbdSZjITDWA
+DoCkKvbdCJLBkJGK
+EPCkKvbdliDsqVSB
+DoCjjvbduaDxrneI
+EOcLKvbdtvNxJpsA
+EOcKjvbdEuyPoljF
+DnbjjvbdwWlAuaWV
+DncLKvbduMXvaTaX
+EObjjvbddxZstSFz
+EPDLKvbdmttykKSG
+EPCjjvbdfIKvRnRH
+DoDLKvbdjgfkeemk
+DoCkKvbdHELVjBjK
+EObjjvbdaRecIUGL
+DnbkKvbdmSYuZrci
+DoDLKvbdKfGHaaQu
+EOcLKvbdIwsahLpp
+EOcLKvbdEuyPomKF
+DoCkKvbdsQWPJcVf
+DnbjjvbdbPgHDkzd
+DoDKjvbdZMSETnMN
+DoDKjvbdJSyBTMwl
+EPCkKvbdSCDeMIxk
+DoDLKvbdtkwwBTaX
+DoCjjvbdtbcVWuoP
+EPCjjvbdozmdKxPA
+DoCjjvbdtkwwBUBX
+DoDLKvbdQdDBPpcr
+DoCjjvbdJbjCpjDY
+EPCjjvbdCTBDTfWr
+EPDKjvbdYNqAYUut
+DoDKjvbdURRPVUgm
+EOcLKvbdNPwqVmfs
+DoDKjvbdsCGMkgLZ
+DoDLKvbdZtIiYcsO
+EObjjvbdhficZWJu
+EPCjjvbdTqRPUuIN
+EPCjjvbdyOShXsIc
+EOcLKvbdliETqVRa
+DncKjvbdYqMdhmEq
+DoCkKvbdKfGHbBQu
+DnbkKvbdqBIeAXIE
+EPDLKvbdQZNAHTRj
+EObkKvbdRosgJecw
+EPCjjvbdKQzEnfOF
+DoDKjvbdzRPMiKXA
+DnbkKvbdGcjvJbJj
+DoCjjvbdbAvEeoow
+DncKjvbdFVyQPmKF
+EPDLKvbdRzKIScWA
+EPCkKvbdKkAhWAJy
+EPCkKvbdJqZdnenF
+DoCkKvbdVUMtGMWK
+DncKjvbdBiLBjiGK
+DnbkKvbdjvWnDbYX
+DnbkKvbdwuNEqYkn
+DoDKjvbdegjurORH
+EObjjvbdpeceTvAh
+DoCkKvbdAMgySwZx
+EPCkKvbdlZSqsZGt
+EPDLKvbdbrbkTdKB
+EPDKjvbdhzUekpnG
+DncLKvbddeOqbWbj
+EPCjjvbdsPunibvG
+EOcLKvbdVwIxVdEg
+DoCjjvbdkIHLefNk
+DnbkKvbdxmrhXrhc
+EPCkKvbdziuPocrt
+EOcLKvbdNUsSLNAX
+DncKjvbdhkddNtcZ
+DoCjjvbdMpYRWNgT
+EObjjvbddZxoxYqC
+EOcLKvbdNVTRjmAX
+EPDKjvbdZjTIQHCG
+DnbkKvbdHEKvJbKK
+EOcKjvbdiGibxvJu
+DnbjjvbdsCGNMGjy
+DoCjjvbdBhkBjhfK
+EPCkKvbdSCDdkhyL
+DnbjjvbdNPwpvNfs
+EOcLKvbdJTZBTNYM
+DncKjvbdqGEFTvBI
+EObkKvbddneSjtTr
+DncLKvbdqdFJPmua
+EPDKjvbdrbFmMGkZ
+DoCjjvbdhXZAzzAJ
+EOcKjvbdkxsSSxgU
+EPDKjvbdrEEhonVa
+DnbkKvbdYzcGSKVy
+DoCjjvbdzROmJJwA
+EPDLKvbdOEdUJJKd
+EPCjjvbdqquKmkAm
+EOcLKvbdZyEKODLr
+DnbkKvbdIsZAsMxM
+DnbjjvbdZjTHofaf
+DoCjjvbdrSUkOLAm
+EPCjjvbdBsAbsewS
+EObkKvbdUsltGLuj
+EPCkKvbdANHyTWyx
+EObkKvbdsBemMGjy
+EObjjvbdMoxRVmfs
+EPCkKvbdNGbolouL
+EPDLKvbdjKGHimXr
+DncKjvbdUMWPAuni
+EOcLKvbdOEdUIhkE
+EPCkKvbdjKGHimXr
+EPCkKvbdhuZdwSVC
+DoCjjvbdCIkBjiFj
+EPCkKvbdxZhGFxFS
+EObjjvbdOFDtJJKd
+DoCkKvbdfNGWgNKL
+EPDLKvbdcarmSATm
+DoDKjvbdkNCMZeHP
+DoDLKvbdkMakyeGo
+DnbjjvbdiHJcYvKV
+DnbjjvbdWWhxVcdg
+EPDKjvbdVUNTelVj
+DoDKjvbdZGvdAPTJ
+DoCjjvbdDncLLXCd
+EPDKjvbduDCuWuno
+DoCkKvbdPyNAHTSK
+DncKjvbdqwPlDIyR
+EOcKjvbdYzbfSJvZ
+DnbkKvbdRotGifDw
+DoDLKvbdRDcBQRDr
+DoDKjvbdEARiNZvw
+DncKjvbdJSxaTNYM
+EPDKjvbdVwJXvDeH
+EOcKjvbdQwOECkhD
+DoCjjvbdEPCkLWbd
+EPDKjvbdVBBpsRSZ
+EOcKjvbdddoSBwCj
+EOcKjvbdFkFScINV
+EObjjvbdpstGrSLU
+EPDLKvbdhaoDFXRR
+EPDKjvbdKfGICApu
+EObkKvbdBsAcTevr
+EObkKvbdhkeDmtby
+DoCkKvbdqYngfpdY
+EOcKjvbdsPvPKCvG
+DoDLKvbduVmwiqTA
+EOcKjvbdidkGtoAO
+EPCkKvbdyzeORgiI
+DoCkKvbdmJDsqUqa
+DncLKvbdiGibyVjV
+DncKjvbdhtzEwSVC
+EOcLKvbdZRMdiNFR
+EOcKjvbdrafMkgKy
+DoDKjvbdZGwEAOsJ
+EOcLKvbdjmCMZeHP
+DncLKvbdjKFgimYS
+EPCjjvbddZxpYZRC
+DncKjvbdjmBkzEgP
+EObkKvbdkIHLeemk
+EPDKjvbdjAQGaQGj
+DncLKvbdSPtHJfDw
+DoCkKvbdGKdsChNV
+EPCjjvbdrouoJbuf
+EPDKjvbdlhcsqUqa
+DoCjjvbdwXMBWAvV
+DnbkKvbdhkdcmtby
+EOcLKvbdFkEsDHmV
+EOcLKvbdCIkBjhej
+DoCkKvbdiLeDnVDZ
+DoDLKvbdDxXlTssl
+DnbjjvbdNrtVfduQ
+EPCkKvbdHDkWJajK
+EPCjjvbdTulQKUBR
+DoDKjvbdJYUBhLpp
+DncKjvbdiCOcFXRR
+DoCkKvbdxsNiMrBg
+EObkKvbdQlxByNtz
+EPCjjvbdBhkBjiFj
+EPCjjvbdNeDsiIjd
+DncLKvbdBsAcTfXS
+DncLKvbdDwwlUTsl
+EOcKjvbdUQqPVUgm
+DncKjvbdmttzKirG
+EPCjjvbdKWUfEFHJ
+EPCjjvbdGKdrcINV
+EPDLKvbdkxrrTYgU
+DoCkKvbdQdCaQQcr
+DnbkKvbdvAdYroFI
+EObkKvbdFxttaDwb
+DnbkKvbdQdDBPqES
+DncKjvbdkVwODbXw
+DoCkKvbdrounicVf
+EPCjjvbdBcoaVjMf
+DncKjvbdcImKKevx
+DoCjjvbdxLWdHzyf
+EOcLKvbdcbTNSATm
+EPDKjvbdRacdlJZL
+EPDLKvbdZQleIleR
+EPCkKvbdTfznLwWF
+EObkKvbdsCFmLgKy
+DoDKjvbdyqOlhiwA
+EOcKjvbdtcCtwVoP
+DnbjjvbdRWmdCkgc
+EOcKjvbdqUTfqrKt
+DnbkKvbdRyjHsDWA
+DoDLKvbdYqMdiNEq
+EOcKjvbdhbPCeXRR
+EOcKjvbdVrNwbFLc
+EObkKvbdZLqcsmkm
+DoDKjvbdRWmdDMID
+EPCjjvbdkWXNcbYX
+DncLKvbdZyDinClS
+EOcLKvbdqUTfqqjt
+DncLKvbdUtNTelWK
+EPDKjvbdkWWmdCXw
+DoDKjvbdezuxdhtX
+DoCkKvbdaSGCgtGL
+EPDKjvbdVwJYWDdg
+DoDLKvbdWSOYCFMD
+EObkKvbdxwiJaozL
+DoCjjvbdTpqOuVIN
+DoCkKvbdrzLpSaHn
+DnbkKvbdJutecdfi
+DnbkKvbdhgKDZVjV
+DncKjvbdCJKajiGK
+EPCkKvbdbrcLTcia
+DncKjvbdxxIibPzL
+DoDLKvbdNUsRkNAX
+DoCkKvbdZRMeJMdq
+DnbjjvbdxsOJMqbH
+DncKjvbdqAheAWhE
+DoCkKvbdZnnIddyj
+DoCjjvbdrpWOibuf
+DoCjjvbdDxXlUUTl
+EPDKjvbdZirgofbG
+DnbjjvbdDnbkKvbd
+EOcLKvbdoznDkXoA
+DnbjjvbdozmdKxPA
+DnbkKvbdfHkVqmqH
+DoDLKvbdkDMLRGtg
+EPDKjvbdDxXlUTtM
+DoDLKvbdZLrETmkm
+DoCjjvbdLAkGlbYR
+DncLKvbddndsLUUS
+DoCjjvbdaRfDIUFk
+DnbjjvbdjJfHjNXr
+DncLKvbdeFPRbXDK
+DoCkKvbdJYTbIMRQ
+DnbkKvbdptUGrRjt
+EOcKjvbdkMbLzEfo
+DoCjjvbdezuxeJUX
+DoCjjvbdZMRctOLm
+DoDLKvbdWWiXudEg
+DnbkKvbdiiehKNXr
+DoCkKvbdXrkaNUOx
+EPDLKvbdZjTIQGbG
+EObjjvbdeOeTLTtS
+EPDKjvbdBraCsewS
+EPDLKvbdLBKflaxR
+DncKjvbdRzJhScWA
+EPDLKvbdGKdrbhMu
+DoDKjvbdFeiqmiUR
+DnbjjvbdFWYooljF
+DnbkKvbdUWLoisaR
+EPDKjvbdfRaWzkbo
+EPDLKvbdKQzEnfNe
+DoDLKvbdnUtyjiqf
+DnbjjvbdyNrgxSiD
+EOcKjvbdjlakzFHP
+DoCkKvbdjvXODaxX
+DnbkKvbdLFfHaaRV
+EPCkKvbdwuMeRYlO
+EPDLKvbdtSqrxzEc
+DncKjvbddwytTqez
+EOcKjvbdZLqcsnMN
+DoCjjvbdkxsSTZHU
+EPDKjvbdiZtekqNf
+EObkKvbdnCKWwnmu
+EObjjvbdauBgYKsh
+EPDKjvbdrSVKmkBN
+EObkKvbdxrnImSBg
+DncKjvbdZnnJEeZj
+DoDKjvbdZjTIQHBf
+DncLKvbdmIctRVRa
+DoCjjvbdziuQQDsU
+EPDKjvbdZRNFJNEq
+EOcKjvbdTqRPUthN
+EPCkKvbdePFSjssr
+EPDLKvbdfIKuqmqH
+DoDKjvbddZyQYYpb
+DoDLKvbdWRmwaeMD
+DoDLKvbdOYOuzcmt
+DoDLKvbdxsNiNRbH
+EPCkKvbdNeEThiLE
+EPCkKvbdNPxQunHT
+EPCjjvbduCbtvuoP
+EOcLKvbdjgfkeemk
+EObjjvbdjlbLydfo
+DoDLKvbdxmsIXrhc
+DoCkKvbdlrZVZsDi
+DoDKjvbdEztRElCi
+EObjjvbdBsAbsfWr
+DoDLKvbdZHWdAOsJ
+DnbjjvbdSCDdkhxk
+EObjjvbdeFOqbWcK
+EPDLKvbdZtJJZESn
+EPCkKvbdKfFhBaQu
+DoCkKvbdMpYQvNfs
+EObjjvbdrpWOjCvG
+EPDLKvbdJSxaTMxM
+EPCjjvbdOSsvGduQ
+DoDLKvbdtumxKRTA
+EPDKjvbdBcpBWKMf
+DnbkKvbdtbbuWvPP
+DoDLKvbdKWUfDdfi
+EPDKjvbdOStVgFVQ
+EObkKvbdZnmheFZj
+DoDLKvbdQwODcMID
+DoDKjvbdVrNxBeMD
+DoCkKvbdaSFbgsek
+DoCjjvbdTvMQKTaR
+DoCkKvbdZsiIxdSn
+EObkKvbdakMFnnDA
+DoDLKvbdJutedFHJ
+EOcLKvbdhzVFlQnG
+EObjjvbdzjUpQDsU
+EPCkKvbdzoQQeCkx
+DncKjvbdZjShPgCG
+DnbjjvbdMgCpMpVL
+DnbkKvbdNGbpNPuL
+EObkKvbdKfFhBaRV
+DnbjjvbdKQzFPFnF
+EPDKjvbdCIkBkJGK
+EObkKvbdmajXXnnV
+DoCkKvbdNwnuzcnU
+EObjjvbdauCGwkTh
+DnbkKvbdbiNKKfXY
+DnbjjvbdQmYCYnUz
+DoDKjvbdiLddNtcZ
+EOcKjvbdeEoSBwDK
+DoDKjvbdcTCkUDia
+DnbkKvbdZRNEhmEq
+EPCkKvbdHfgZxxXg
+EObjjvbdbsDLUDjB
+EPDKjvbdhbPDFWqR
+DncLKvbdKNADyfuB
+EObkKvbdEztREkcJ
+DncLKvbdbLMFnnDA
+EObkKvbdZjShPgBf
+DncLKvbdbVCHXkTh
+DnbkKvbdqTtHSRkU
+EObkKvbdfSBWzlDP
+DnbkKvbdGKeTDIMu
+EOcLKvbdGcjvJbJj
+EPCkKvbdMowqWOHT
+DncKjvbdYpmFIleR
+EPDKjvbdZxcjNblS
+DncLKvbdNrtVgEuQ
+EOcKjvbdqrVKnLBN
+DnbkKvbdatbHXkUI
+DoCkKvbdEPDKkWbd
+EPDLKvbdmIdURVRa
+DoCkKvbdMoxRWNgT
+EObjjvbdLBKflbXq
+DoCkKvbdSwjkmzkY
+DoDKjvbdJbicQicY
+EObkKvbdNQYQumgT
+DoDKjvbdxxJKCPzL
+DncLKvbdnGdxNNgZ
+DoCkKvbddijSVtzn
+EPDKjvbdrJAJdmOe
+DnbjjvbdzoQQeDLx
+DoCjjvbdZRMeIldq
+DnbjjvbdkHgMGGOL
+DoCjjvbdaSGChTfL
+EOcLKvbdCJLCKiFj
+DoCkKvbdVhXvYHYz
+EPCjjvbdcSbjscia
+EOcKjvbdxZgeewdr
+EPDLKvbdYkqdUNlN
+DnbkKvbdREDApQdS
+DnbjjvbdmozZVkYb
+EPDKjvbdaRecITfL
+DncLKvbdZyEJmbkr
+EOcKjvbdZnnIdeZj
+DncLKvbdeXzTsrFz
+DoCjjvbdZRMdhmEq
+EOcLKvbdGGJqmhtR
+EPDKjvbdIidAJpHE
+DncKjvbdMRwNZtpz
+DncLKvbdnBiwXoOV
+DoDLKvbdqYnhGqEY
+EOcKjvbdWexytAOs
+EOcKjvbdiZuFlQnG
+EObkKvbdVAaqTRRy
+EPCkKvbdTAEhgaoE
+DoDKjvbdMoxQvNfs
+EPDKjvbddjJqvUzn
+EObkKvbdBiKajhfK
+EPDLKvbdZLqcsmlN
+DoCjjvbdgPazwDwh
+EPCkKvbdwkWcgzzG
+EPDKjvbdlYsSSyGt
+EObjjvbdZLrDsmkm
+DncLKvbdbsCkUDia
+EObkKvbdkxrrSyGt
+DnbkKvbdnBivxOnV
+DoDLKvbdZirhPgCG
+EObjjvbdfMevfmKL
+EPDKjvbdSQTgJecw
+DoDLKvbdUWMPitAq
+DoDKjvbdwtleRZMO
+EObjjvbdKRZdoGNe
+DoCjjvbdauBgYKsh
+DoDKjvbdXrlAlsnx
+DncKjvbdUMVnaVni
+DncKjvbdiHKDYvKV
+DnbkKvbdySnJNSCH
+EPCjjvbdfNGWgNKL
+EOcLKvbdnQZxujxb
+EObjjvbdVgwvXgYz
+EOcLKvbdjKGHimYS
+DnbkKvbdhanbeXQq
+DncLKvbdhzUfLpmf
+DoDLKvbdczZPxZRC
+EPDKjvbdRNYBxnUz
+EOcLKvbdlrZVZrdJ
+DncKjvbdtcDUwWOo
+EPCkKvbdQvmdDLhD
+EPCjjvbdfMfWfljL
+DoCjjvbdZyEKNbkr
+EOcKjvbdgPazvcxI
+DncKjvbdfNGXHMjL
+DncLKvbdEKHjWXjA
+EObkKvbdZjSgogCG
+EPCjjvbdxnSgxShc
+EPCjjvbdqrVKmkBN
+EPCjjvbdbBVdepQX
+DoCkKvbdrXQLbhxq
+DoCjjvbdbVBfxLTh
+EPCkKvbdHlBznWqL
+EPDKjvbdTAEhgaoE
+DnbjjvbdCfkfHAzc
+DnbkKvbdptTfqqjt
+EPDLKvbdWIXuwgYz
+EObjjvbdrJAJeNPF
+DncLKvbdKDKDRJcY
+DnbkKvbdrDeIpNvB
+DncLKvbdVwIwudFH
+DncKjvbdICMZdzAD
+EPCkKvbdsQVnjDVf
+EPDKjvbdiZuGMRNf
+DoDLKvbdIGfyyXwg
+EPDLKvbdYORAXtut
+DoCjjvbdhzVGMQnG
+EPDLKvbdQwNcbkgc
+EObjjvbdsBemLgLZ
+DoDLKvbdZtIiYdSn
+DoCjjvbdelevfljL
+DoCkKvbdcyxowxqC
+EPDLKvbdZMRdUNlN
+EOcLKvbddZyPwyRC
+EPCjjvbdZLrDsnLm
+EPCkKvbdgPazwEYI
+DoDKjvbdqFdEsvBI
+EOcKjvbdVviXvDdg
+EPCjjvbdCWzdIdov
+DncKjvbdrSVKnLBN
+EObkKvbdiLddNtcZ
+EPDLKvbdrDdiPmvB
+EPDKjvbdKDKDRKCx
+DoDKjvbdtSqsZZeD
+DoDLKvbdwuNFRYlO
+DoCjjvbduLwvaTaX
+EObjjvbdtkxXBUBX
+EOcLKvbdSQTgJfEX
+EObjjvbddneTKtUS
+DoDLKvbdAMhYsXZx
+EOcLKvbdczZPwxqC
+EPDLKvbdjbkjqGtg
+EOcLKvbdFkEsChMu
+EObjjvbdbsCkUDia
+EObkKvbdEzsqElDJ
+EPDLKvbdGZUuBEYC
+DoCkKvbdzROmJJwA
+EPDKjvbduMXwAsaX
+EPCjjvbdqwQMDJZR
+DoDKjvbdqUUHSRkU
+DoCkKvbdwtleQxkn
+DnbkKvbdQvnEClHc
+EPDKjvbdjvXNcaww
+DoCjjvbdjggMFenL
+EPDLKvbdJYUBhLpp
+DnbkKvbdkNCLyeGo
+DoCjjvbdDoCkLWcE
+EOcKjvbdYqMeJNFR
+EPCjjvbdRDcApQdS
+EObjjvbdjblKpgVH
+EPDKjvbdqqtjnKaN
+DoDLKvbdwtmFRYlO
+DoCjjvbdnHEwmNgZ
+DncLKvbdaMjasVNH
+DncKjvbdnUtzLKSG
+DoDLKvbdkySrSyGt
+EPCjjvbdyNsIXriD
+DoCkKvbdRadFMIyL
+EOcKjvbdqvokbhxq
+EPCjjvbdYkrEUOLm
+EPDKjvbdrpWPKCvG
+DncKjvbdxUldpyLn
+EObjjvbdrbFmMHKy
+DoCjjvbdZHWdAPTJ
+DncKjvbdEPDLKwDE
+DnbjjvbdZHWdAPTJ
+DoDLKvbdNrsvHFUp
+DncLKvbdCTBDUFvr
+EPDLKvbduDDUvuno
+DoDLKvbddwystSFz
+DnbkKvbdmbJvwoNu
+EPCjjvbdcbTNSAUN
+DnbjjvbdnVUzKjRf
+EOcLKvbdYlRdUOMN
+DoCjjvbdTAFIgand
+DnbkKvbdpeceUVaI
+DoDLKvbdlZSrTYft
+EPCjjvbddePRbXDK
+EOcLKvbdJqZdnfNe
+EPCkKvbdRaceLhyL
+EPDKjvbdLAkGlaxR
+EPCjjvbdqGDdsvAh
+DnbjjvbdxZgefYEr
+EObkKvbdKWVGEFGi
+EPCjjvbdSQUHKFdX
+EPDKjvbdDxYLsssl
+EPCjjvbdfHjvSNqH
+EPCkKvbdQwODbkhD
+EOcKjvbdZnmiFEyj
+EPCkKvbdqwQMChyR
+EOcLKvbdZyDimcLr
+EObjjvbdjAQGaQGj
+EPCkKvbdZtJJYdTO
+EObjjvbdjFKgUoAO
+DnbkKvbdcScLUEKB
+EPDKjvbdjcMLRGuH
+EObjjvbdqlzKZLgi
+EOcKjvbdFfJrNiUR
+EObkKvbdKaKgNBxR
+EOcKjvbdHDjujBij
+EObkKvbdFejSOJUR
+DncLKvbdMIalRYAS
+EOcKjvbdVTlsekvK
+DoCjjvbdUQqOtthN
+DnbjjvbdVYgtZkOn
+DnbkKvbdrovOicVf
+DncKjvbdKfGIBaQu
+DnbjjvbdjuvnDaxX
+EPDLKvbdHakzEzAD
+EPDLKvbdyzdnRhIh
+DoCjjvbdZGvdAPTJ
+DoDLKvbdqvolChyR
+DncLKvbdjlbLyeHP
+EPCkKvbdmIdTptrB
+EPCkKvbdQcbaPqES
+DoDLKvbdddoSBwCj
+DnbjjvbdjvWnECXw
+DnbjjvbdZisHofbG
+EOcKjvbdZQldhldq
+DnbkKvbdfekymfgA
+DnbjjvbdLBKgMbYR
+EPCjjvbdEARiMzWw
+EObjjvbdtSrTYzEc
+EPDKjvbdZoOIddyj
+DnbkKvbdcSbjtEKB
+EObjjvbddndsKssr
+DoCjjvbdxnSgxShc
+EPCjjvbdOTUVfdtp
+DoCkKvbdUtMselWK
+DnbjjvbdJpydoGNe
+DoCkKvbdGQASwGey
+DnbjjvbdnGdxMnGy
+EPDKjvbdHDkVibKK
+DoCjjvbdtbbuXWOo
+EPDKjvbdKWVGEEgJ
+EObkKvbdGLEsCgmV
+DoCkKvbdbrbjtEKB
+EPDLKvbdRzJgrcWA
+EPCkKvbdaRecITfL
+EObjjvbdrbGMlHKy
+DnbkKvbdZdwfzgiC
+EPDKjvbdVwJXudFH
+DoCjjvbdiZtekqOG
+EObkKvbdqrUkOKaN
+EObkKvbdySnImRbH
+EObjjvbddoFTKstS
+EOcKjvbdyOTHxTJD
+DncKjvbdFVxoolie
+DoCkKvbdFejRnIsq
+EPDLKvbdptUGrRkU
+EOcKjvbdajlGOnDA
+EPDKjvbdrRtkOKaN
+EOcKjvbdzoQQeDLx
+EPCjjvbdrafMlGkZ
+EPCjjvbdmpZyWKyC
+DoCkKvbddBrlrAUN
+DnbkKvbdMgDPlpVL
+DnbjjvbdUxhTzKoO
+DoCkKvbdSCDdlIyL
+EPDKjvbdmbJvxPOV
+EPCkKvbdNGcQMpUk
+EPCjjvbdVqmxCFLc
+DoDKjvbdrDdhonWB
+EOcLKvbdYTLaNToY
+DoCkKvbdkIGlFemk
+EPDKjvbdNrsvHFVQ
+EPDLKvbdrzLoraHn
+EObkKvbdraelkgLZ
+DoDLKvbdBdQAujMf
+DncKjvbdwzIGGYFS
+EOcKjvbdZeXfzhIb
+DoDKjvbdbAueGPpX
+DoCjjvbdZtJJYcrn
+DoDKjvbdyqPNJKXA
+DoCkKvbdTAFIhCPE
+DoDLKvbdjblLQgVH
+DoCjjvbdZtJJZDsO
+EOcLKvbdrNZixkhJ
+DoCjjvbdzoPpdblY
+DnbkKvbdqcdhpNvB
+DncKjvbdYpldhleR
+DoCjjvbdmRyUysEJ
+DoCjjvbdJXtBgkqQ
+EOcKjvbdVwJYWDeH
+DoDLKvbdZLqdUOLm
+EPDKjvbdEXwlUUTl
+EObkKvbdoznDkYPA
+EPCkKvbdEASJNZvw
+EPCjjvbdFjdsCglu
+DoCkKvbdTlWPBWOi
+DnbjjvbdcTCjsdKB
+EObkKvbdkySrTYft
+EPCkKvbdLrXMytpz
+DncKjvbdZQmEhleR
+EOcLKvbdHkaznWpk
+DnbkKvbdHfgZyXxH
+EObkKvbdpecdtWAh
+DnbkKvbdRadElJYk
+EPCjjvbdTXkMNzjx
+DoCjjvbdmSYtzTEJ
+EPCkKvbdZsiJZDsO
+DncKjvbddoErkTtS
+DoCkKvbdZRMdiMeR
+EObkKvbdTfzmkvvF
+DncKjvbdpxnhHQcx
+EPDLKvbdaMjbStlg
+DoCjjvbdkHfkefOL
+DoCjjvbdqqtkOLAm
+DnbjjvbdyzeNqgiI
+EOcKjvbdiLeDnUby
+DncKjvbdyYIjCPyk
+EOcKjvbdpfEFUVaI
+EPCjjvbdZirgpHBf
+DnbkKvbdKWUecdgJ
+EOcLKvbdiHKCxvJu
+EPDKjvbdcTCkUEKB
+EOcLKvbdaMkBsVNH
+EPDLKvbdJutfEFGi
+EPCkKvbdFaOqZJzm
+EObjjvbdhaoCdvqR
+EPCkKvbddZxpXxqC
+DnbjjvbdZxcinDLr
+DoDLKvbdpssfqrKt
+DoCjjvbdqTsgRrLU
+EPDLKvbdEYXlUTtM
+EObjjvbduVmwjQsA
+EOcLKvbdNPxQunHT
+DnbjjvbdBhjajiGK
+DoCkKvbdUGznMXVe
+EPDKjvbdVwIwvEFH
+EObkKvbdRMwayNtz
+DoDLKvbdQZNAGrrK
+EObjjvbdKWUedFGi
+DoDLKvbdaNKartlg
+DncKjvbduWOXipsA
+EObjjvbduVmxKRTA
+DoDKjvbdygZMAMdw
+DoDLKvbdqTsfrRkU
+DoCjjvbdEvYpQMjF
+EObkKvbdNPxQunGs
+EObkKvbdsZlPsAgn
+DnbkKvbdZnnIddzK
+EPCkKvbdNQXqWOHT
+DnbkKvbdGLFSbhMu
+DoDKjvbdrzMPraIO
+DnbkKvbdZirgofaf
+EPDKjvbdijFhJlxS
+DncKjvbdWRmxBeLc
+DnbkKvbduDDUvuoP
+DoDKjvbdiZuGMQmf
+EObkKvbdelfXGljL
+EPDLKvbdfNFvfljL
+DncKjvbdGKdrcINV
+EObjjvbdFfJqnIsq
+EOcLKvbdILaznWqL
+DncLKvbdJutedFHJ
+EOcLKvbdIwtBhLpp
+EPDLKvbdsrrSyZdc
+EPDKjvbdczZQXxpb
+DncLKvbdDoCjjvcE
+EPCjjvbdpxoIHREY
+DoCkKvbdxxJJbPzL
+EPCkKvbdVZIUZkPO
+EPDLKvbdULuoBWPJ
+EPCkKvbdfMfWfmJk
+DnbjjvbdZtIiZETO
+DoCjjvbdiMEcnUby
+DoCkKvbdcyyPxZQb
+DoCkKvbdZirgofaf
+EObkKvbdozmdLYPA
+DoDKjvbdYkrEUNkm
+DoCkKvbdLqwMzVQz
+EObjjvbdLFfICBRV
+EObjjvbdjJehKNYS
+DoCjjvbdEJgiuwjA
+EPCkKvbdyqPNIiwA
+EPDKjvbdNdcsiIjd
+EPCjjvbdauBgXjsh
+DnbkKvbdyzeORgiI
+EPCkKvbdsCGNLgLZ
+EObkKvbdtbbtwVno
+EObjjvbdwuMdqZLn
+EObjjvbdSQTfiedX
+EPCjjvbdmttyjjSG
+DncLKvbdnHFYMnGy
+DncKjvbdxmsIXrhc
+EPDKjvbdQYmAGsRj
+EObjjvbdfoazvdYI
+DoDLKvbdhaoDEvpq
+EObjjvbdDihKVwjA
+DoCjjvbdZMSDtNlN
+DnbjjvbdhlFDnVDZ
+EPCjjvbdiCPCdwRR
+DncLKvbdULuoBVoJ
+DoDLKvbdyYJKBpZk
+DoDLKvbdRbDdlIyL
+EOcKjvbdYSlAlsoY
+DoCkKvbdySmhlqbH
+EOcKjvbduWNxKRTA
+DnbkKvbdFjeTDIMu
+DoDLKvbdzaAPGgCM
+EPCkKvbdBhkCLJGK
+DnbkKvbdYpmFJNFR
+EPCjjvbdQccBQQdS
+EOcKjvbdqGDdtVaI
+EOcLKvbdILazmvqL
+EPDLKvbdajkennDA
+DoDKjvbdxVMdqZLn
+EPDKjvbdNPxQunGs
+EObjjvbdhytfMROG
+EPDKjvbdEXxLtTtM
+EPDKjvbdZnnIdeZj
+DoDKjvbdGKeTChNV
+DncLKvbdjmCMZeGo
+DnbkKvbdQwNdClHc
+DncKjvbdXrlBMtOx
+DoCkKvbdzaAOgHBl
+DncLKvbdcIlijewY
+EObjjvbdrbFllHKy
+EOcKjvbdmbJwXnmu
+EObkKvbdssSSxydc
+DoDKjvbdSQTgKGEX
+DnbjjvbdUyHtZkPO
+EPCjjvbdFyUuAdYC
+DoCkKvbdqFcdsvBI
+EOcLKvbdqwQLbhyR
+DoCkKvbdbsCkUEKB
+EPCjjvbdIjEAKQHE
+DnbkKvbdaNKbTUmH
+EObkKvbdnCKWxPOV
+EOcLKvbdZxcinClS
+EObjjvbdhlFDnVDZ
+DncLKvbdpyPHfpdY
+EOcKjvbdTlVoAuoJ
+EOcKjvbdmbKXXoOV
+DoCkKvbdxsOImSBg
+DncKjvbdZHXEAPTJ
+DoDLKvbdDjIKVwjA
+DoDLKvbdnCJvwoNu
+EPCjjvbdZeYGzghb
+EPDKjvbdHffzYxXg
+EObjjvbdirzhrkJz
+DoCjjvbdZnnJFFZj
+EPDKjvbdeATqMwif
+DoDKjvbdbVCHXjsh
+DoCjjvbdGckVjCKK
+EOcLKvbdyYJJbPzL
+DoCjjvbdiCPDFWpq
+EOcLKvbdIwtCILqQ
+DoDLKvbdKQzFOfOF
+EOcKjvbdNPwqWNgT
+EObjjvbdZLqcsmkm
+EPDLKvbdnPyxvKxb
+DoDLKvbdKjaHvAKZ
+EObjjvbdjKFgjNYS
+DnbkKvbdLAkGmCXq
+DoDLKvbdeEoSBwCj
+DnbjjvbdHlBznXRL
+DnbjjvbdKfGHbBRV
+DnbkKvbdZQldiMdq
+EOcLKvbdnBivwnnV
+DncKjvbdsQVoKDWG
+EObkKvbdypnlhiwA
+EObkKvbdrykpTAgn
+DoCjjvbdaMkBsUmH
+EPDLKvbdRDcBPqES
+DoCjjvbdpxngfpdY
+EOcKjvbdEztRFLbi
+EOcLKvbdcbTNSAUN
+DoCkKvbdjcLjpfuH
+EPCkKvbdjSzhsKiz
+EPCkKvbdoAKztIDn
+EPCjjvbdMgDQNPuL
+DoDLKvbdKNAEZgVB
+EPCjjvbdZsiJZDsO
+EOcLKvbdkCkkQfuH
+DoCjjvbdnGeXmNfy
+DnbjjvbdrpVoJbuf
+DoCkKvbduCbuWuoP
+EObjjvbdSwkMNzkY
+DoCkKvbdrNZiyMHi
+DnbjjvbduDCtvuoP
+DoDLKvbdMuSqjmAX
+EObkKvbdsQVnicVf
+EPCjjvbdmfeYNNgZ
+DncLKvbdmIdURUqa
+EPCkKvbdGBPQyJzm
+EPCjjvbdZRNFImEq
+DncKjvbdNddUJJLE
+EObkKvbdaSFbgsek
+DncKjvbdDoCkKwDE
+DoCjjvbdtkxWaUBX
+DncLKvbdfNGXHMjL
+EPCkKvbdqTtHSSKt
+DnbkKvbdxmrhXsJD
+DnbjjvbdmttykKSG
+EObjjvbdqcdhomua
+DoCkKvbdVTlsfMVj
+DnbkKvbdRECaPpcr
+DnbkKvbdijFhKNYS
+EObkKvbdIwsbIMRQ
+EPDLKvbdJbibqJbx
+EPDKjvbdxxJKCPyk
+EOcKjvbdjuvnECYX
+DnbkKvbdKRZePFme
+DnbkKvbdMpYRVnGs
+EOcKjvbdfMevgNKL
+DoCkKvbdmfeXmOHZ
+DncLKvbdFpATXGey
+DoDKjvbdJXtCIMQp
+EObjjvbdZshiZDsO
+EPDLKvbdaRfDHsfL
+DncKjvbdMIakqYAS
+EObjjvbdSLZGUfjs
+DoDKjvbdBcoaWJmG
+DoDKjvbdEuxpPlie
+EObjjvbdJcJbqKCx
+DoCjjvbdxwhiapZk
+DnbkKvbdsBemLfkZ
+DoDLKvbdHgGyxwxH
+EOcKjvbdQdDApRDr
+EPDLKvbdKWUfDeHJ
+DnbjjvbdjvXODbYX
+DoDLKvbdHELWJbKK
+DncLKvbdgFkynHHA
+EPCkKvbdPxmAHSqj
+DoDLKvbdYkqdTnLm
+EPCkKvbdJYUCILpp
+EOcKjvbdxwhjBpZk
+DoCjjvbdiMFENtcZ
+DoCjjvbdnCJvwoOV
+DoDKjvbdSKxetgKs
+EOcKjvbdWRmxCFMD
+EOcLKvbdpedFTvBI
+EObkKvbdbAvEfPow
+EObkKvbdZnmiEeZj
+DnbkKvbdtTSSyZeD
+EPCkKvbdPxmAGsRj
+EPCkKvbdVTmUGLvK
+EObkKvbdJmADyfta
+EOcKjvbdwWlBVaWV
+DoDLKvbdjcMKqGtg
+EOcLKvbdGGJrNiTq
+DnbkKvbdgPazvdYI
+EPCkKvbdGLEsDHmV
+DnbjjvbdqceIomua
+DncLKvbdjbkjpgUg
+DoCjjvbdSxLLmzkY
+EPDLKvbdjKGHilxS
+EPDKjvbdmbJvwoNu
+EPDKjvbdjmBkyeHP
+EPDLKvbdzROliJwA
+DnbjjvbdUaBprprZ
+DoDKjvbdtbbtwWPP
+DnbjjvbdURQoVVHm
+DoCjjvbdjbkjqGuH
+DoCjjvbdRbEFLhyL
+DncKjvbdBcpAujMf
+DoCkKvbdPxmAGrqj
+EPDLKvbdZRMeImFR
+EOcLKvbdcScKscia
+EObjjvbdeXytTrFz
+EPCjjvbdKfGICBQu
+DncKjvbdijGIKMwr
+EObjjvbdZLqctOLm
+EObkKvbdSLZFuGjs
+DnbjjvbdZMRcsnMN
+EPCkKvbdWSOYBeMD
+EObjjvbdRacdlJYk
+DnbjjvbdFyVUaEXb
+EObjjvbdRbEFLiYk
+EObjjvbdZjTIQGaf
+EPCkKvbdNsTugEtp
+DoCkKvbdEASIlyvw
+DoCjjvbdsrrSxzFD
+DoDLKvbdQwOEDMID
+EPDKjvbdaaVeGQPw
+DoCjjvbdFejRnItR
+EObkKvbdRacdlIyL
+DnbjjvbdGGJqnIsq
+DoDLKvbdGYtuBDxC
+DncKjvbdbLMGPODA
+EObjjvbdqYoIGpcx
+DncKjvbdrykosAgn
+EPCjjvbdJbjDQjCx
+EObjjvbdkySqsYft
+EPDKjvbdxwhjBpZk
+DncKjvbdauBfwkTh
+EPCkKvbdtSrSxydc
+DoDKjvbdMRvmZuQz
+DncLKvbdnUtyjiqf
+DoDKjvbdSLYetgKs
+DoDLKvbdJbjCqJcY
+EPDLKvbdShyiqAAl
+EPDLKvbdSQUHJfDw
+EOcLKvbdijFhJmYS
+EPDLKvbdvwMBWAvV
+EObjjvbdeXytUSFz
+EObjjvbdWXJXuceH
+EPCkKvbdrDeIomvB
+DncKjvbdczZQXyRC
+DnbjjvbdQlxCZOUz
+EPCjjvbdQccApRDr
+DoCkKvbdqiAJdloF
+DoCjjvbdDwwktTtM
+EPCjjvbdRpUGjGEX
+DnbkKvbdWfYytAPT
+EPCjjvbdUMVoBVni
+EObkKvbdxnShYTIc
+EObjjvbdVAaqSprZ
+DncLKvbdKVtfDdgJ
+DoCjjvbdliEUQtqa
+DnbjjvbdiGjCyWKV
+DnbjjvbdqrVLOLBN
+EObkKvbdUaCRSqSZ
+EObkKvbdTkvPAuni
+DoCjjvbdIGgZyXwg
+DoDLKvbdssRsYzEc
+DnbjjvbdZLqdTmkm
+EPCjjvbdUtNTfLvK
+DncKjvbdfMewGmJk
+EOcLKvbdCTBDTfWr
+EPDKjvbdFpASwGey
+EPCjjvbdZLrETmkm
+EPDLKvbdyXhjCQZk
+DnbkKvbdeATqMxJf
+DoCjjvbdjJfHilwr
+EPDKjvbdzitopESt
+EPDKjvbdEuxopMjF
+DoCkKvbdvBEYroFI
+DnbkKvbdrNZiyMIJ
+EPCjjvbdxVMdpyMO
+DnbkKvbdQlxCZOUz
+DnbkKvbdqmZiyLhJ
+DncLKvbdXnRAXuWU
+EObkKvbdRadElJYk
+DncKjvbdLiBkqYAS
+DnbjjvbdmRyUysDi
+DoDKjvbdKCicQjDY
+EOcLKvbdRkZGVGjs
+DoDKjvbdtSrSyZdc
+EOcKjvbdRyjISbvA
+EPCjjvbdHffyyYYH
+EOcKjvbdaogHDkzd
+EPCjjvbdidkGuPAO
+EOcKjvbdCDpAujMf
+DoCkKvbduVnXjQsA
+DnbjjvbdTulQJtAq
+DncKjvbdqTsgRrLU
+DoCkKvbdzdynzdyp
+EObkKvbdemGXHNKL
+EOcKjvbdJXtCHlRQ
+EPDKjvbdegkWRnQg
+DoCjjvbdyXiKCPyk
+EPDLKvbdlZTRsZHU
+DoCjjvbdfNFvgNKL
+DnbjjvbdbVBgYLTh
+DncKjvbdcJMikFvx
+EPDLKvbdUMVnaVoJ
+DoCkKvbdgQBzvcxI
+DoCjjvbdZtIhxdSn
+EPCjjvbdRWnEDMID
+EObkKvbdjlakydfo
+DncLKvbdrpWOicVf
+EOcKjvbdhgKDYuiu
+DoDKjvbdmIdTqUqa
+EPCjjvbdwtleQxkn
+EObkKvbdcJNKKfWx
+DncLKvbdNsUWGdtp
+DoDKjvbdWSOXbEkc
+EPCkKvbdpyOhHREY
+DoDKjvbdkyTSTYft
+EPCjjvbdFjdrbgmV
+DncLKvbdrounjDWG
+DoDKjvbdVTmTfLvK
+EPDLKvbdSCDeLiYk
+DoCkKvbdrXPlDIxq
+DncLKvbdKVuGDeHJ
+DnbjjvbdrWokcIxq
+EObjjvbdKVuGEEfi
+EPDLKvbdrbGMlGjy
+EPDKjvbdlqxtzSci
+EOcLKvbdwygeeweS
+EObjjvbdjKGIKNYS
+EObkKvbdVrOXbElD
+DnbjjvbdrMzKZLgi
+EPCkKvbdMpXqWNfs
+EPDLKvbdrSUkOLAm
+EPDKjvbdZisIPfbG
+EPDLKvbdRDbaQRES
+DncKjvbdVTmUGLvK
+EOcKjvbdYzcGRjWZ
+EObjjvbdMuSrLNAX
+DncKjvbdjgflGFnL
+DncLKvbdWIXvXfxz
+DoDLKvbdNHComPtk
+EOcLKvbdSBceLhyL
+DoCkKvbdZRMeImFR
+EPDLKvbdiifIKMwr
+DoCkKvbdvBDxsOeI
+EPDLKvbdxmsHxShc
+EOcKjvbdcyyPxZRC
+DoCkKvbdsBfNMHKy
+DoDLKvbdaRebhTfL
+DncLKvbdypoNJKXA
+EObkKvbdzRPNJKXA
+DnbkKvbdTvLoitBR
+EOcKjvbdWHwuxGxz
+EObjjvbdZHWdAPTJ
+DnbjjvbdySnJMqag
+EPCkKvbdtTRsYzFD
+EPDLKvbdhytelQnG
+EPCkKvbdTppntuHm
+DnbjjvbdZeYGzhIb
+EPCjjvbdIwsaglQp
+DoCkKvbdpstGrRkU
+EObjjvbdCJLBjiFj
+EOcLKvbdePErjstS
+EPDKjvbdpxnhGqDx
+DnbjjvbdZyEKOClS
+DoCjjvbdpyOhHREY
+DncLKvbdNGcPmPuL
+DoDLKvbdQwNccLgc
+EPDKjvbdmbJvxPNu
+DnbkKvbdQwOEDMHc
+DoDKjvbdXrlAltOx
+EPCkKvbdGQASvgGZ
+EOcLKvbdmttykKSG
+EOcLKvbdGLFSbgmV
+DncLKvbduCbuWvOo
+EPDKjvbdSQTfiecw
+DoCkKvbdYkqctNkm
+DoDLKvbdlZSqsZHU
+DoDLKvbdqGEEtVaI
+EObjjvbdhytekpmf
+DoDKjvbdmuUzKiqf
+EObjjvbdrMyiyLhJ
+DoDLKvbdEARhlzWw
+EObjjvbdaRfCgsek
+EPDKjvbdaNKaruNH
+EOcLKvbdJqZeOenF
+DnbjjvbdTfzmlXVe
+DoCjjvbdzQoNIjXA
+EObkKvbdMpYQvNfs
+DncLKvbdVrOYCElD
+DoCjjvbdijGIJlwr
+DoDLKvbdrXQMDIyR
+EPDLKvbdEYYMUTtM
+DncKjvbdkHgMFenL
+DnbjjvbdqdFIpOWB
+EObkKvbdqFceTvAh
+EObjjvbdyOSgxSiD
+EOcKjvbdDnbkKvcE
+DoDLKvbdYqMeImFR
+EObkKvbdwtleRZMO
+EPCkKvbdrWolCiYq
+EObjjvbdrXPkcJYq
+DoCkKvbdtlXvaUBX
+EOcLKvbdeYZssrFz
+DoDLKvbdnGeYMnHZ
+EObkKvbdYTLaMtOx
+DoDLKvbdJcJcRKDY
+EPDKjvbdeKJrVtzn
+DoCkKvbdrSUkNjaN
+DncKjvbdeATqNXjG
+EObkKvbdqlzJyLhJ
+EObjjvbdDjIJvXjA
+EObjjvbdzGyMAMdw
+DoDLKvbdFfJrNiTq
+EOcLKvbdBhkCKiGK
+EObjjvbdpssgSRjt
+DncKjvbdKaLGlbXq
+EOcLKvbdlYrqrxgU
+EPCjjvbdVqmxBeLc
+EPDLKvbdZQmFJNFR
+DoCkKvbdkCkkQfuH
+DncKjvbdauCGwjsh
+DoCjjvbdEASIlywX
+DncKjvbdLAjgNBxR
+DncKjvbdCDpBVimG
+EOcLKvbdqlzJxkhJ
+EPDLKvbdtvNxKRTA
+DnbkKvbdGLFScINV
+DoCkKvbdQvmdCkhD
+EPDKjvbdFjdrbhNV
+EPCkKvbdZLrETnLm
+EPDLKvbdTvLoisaR
+EPDLKvbdsrrTZZdc
+EPCkKvbdZMRcsmlN
+DncLKvbdxnTHxTIc
+EOcKjvbdzROliJwA
+EOcKjvbdsQVnjDVf
+EObkKvbdqGDdsvBI
+DncKjvbdwtleQxkn
+EObjjvbdTqRPUuHm
+DnbjjvbdVwIwvEFH
+EPCjjvbdZshhxcsO
+DoCkKvbdKCibqJbx
+EOcKjvbdUVlQKTaR
+EObkKvbdVTmUFlWK
+EOcLKvbdmIctRVRa
+DoDKjvbdPIAYZAYa
+DoCkKvbdjvWnDbXw
+DnbjjvbdtvNwjRTA
+EObjjvbdNHComQUk
+EOcKjvbdySnImRbH
+DoCjjvbdDjIKVxKA
+DncLKvbdKefHbApu
+EObjjvbdehLWRmpg
+EOcLKvbdJTZAsMwl
+DoDKjvbdZirgpHCG
+EObkKvbdozmcjxPA
+EObkKvbdsZkosAgn
+EPCjjvbdSxKlNzjx
+DoCjjvbdfILVrNpg
+EPCjjvbdGGKRnJTq
+DnbjjvbdpssgSSLU
+DoDKjvbdrDdiPmvB
+EPCkKvbdZtJJYcsO
+DoDLKvbdNdctIhkE
+EPCjjvbdcImJkFvx
+EOcLKvbdGLErbhNV
+DoCkKvbdnQZxukYb
+EPCkKvbdWSNxBeLc
+EPCkKvbdsPvOjDWG
+EOcLKvbdeFOqavbj
+EPCjjvbdjAQHApHK
+EPDKjvbdwXMBVaVu
+DncLKvbdMowqWNfs
+DoCkKvbdRbEFMJYk
+DoCkKvbdrNZjZLhJ
+DoCjjvbduDCtwWPP
+EObjjvbdNeEUJIjd
+DnbkKvbdlYsRsYgU
+DoCjjvbdUxgsyjnn
+EObkKvbdbLMGPODA
+DoCkKvbddneTKtUS
+EOcKjvbdvvkaWAuu
+EPDKjvbdVUNUFkuj
+EObjjvbdKDKDQjCx
+EPDKjvbdnUuZjiqf
+DoCkKvbdsCFmMGkZ
+DncKjvbdrpVnjDWG
+DnbjjvbdiZtfMQmf
+DoCkKvbdwWkaVaVu
+DoCjjvbdSCDeLiZL
+DncKjvbdEYYLtTsl
+EPDLKvbdOSsufeVQ
+EOcLKvbdWSOXadlD
+EPDLKvbdpaJFAXHd
+DncKjvbdSCDdkhyL
+DoCjjvbdIMBzmvqL
+DnbkKvbdVUMsfLvK
+DoCkKvbdlhctQuSB
+DncKjvbdJuuGEFGi
+EPCjjvbdJSyAsMwl
+EOcKjvbdUtMtGMVj
+EPCkKvbdHDkWKCKK
+DncLKvbdySnImRag
+EPCjjvbdwMvAMcdm
+DnbkKvbdelevfmJk
+EPDKjvbdYORAYUvU
+EPCkKvbdVwIxWDeH
+EObjjvbdtvOXipsA
+DncLKvbdhlEdOUcZ
+EOcLKvbdTlVoAuoJ
+EPCkKvbdNQXpunHT
+EOcLKvbdWXJXvDdg
+DnbkKvbdZoOJFEzK
+EObkKvbdmbKWwoOV
+DnbjjvbdiHKDYvKV
+DncKjvbdfSBWzlDP
+DoCkKvbdLBKflawq
+EObkKvbdUsmUFkvK
+EObjjvbdLqwNZtpz
+DoCkKvbdsBfNLfjy
+DncLKvbdjvWmcbYX
+EObkKvbdaMkBruMg
+EPCkKvbdHkazmvqL
+DnbjjvbdRyjHrbvA
+EPCkKvbdNQXpvOHT
+EObjjvbdOYPVzcnU
+DoCjjvbdaSGCgtFk
+DoDKjvbdxmsHxSiD
+EObjjvbdZirgogCG
+EOcLKvbdmuVZkKSG
+DncLKvbdUyHszKnn
+DnbkKvbdxmsHxTJD
+EPCkKvbdVrOYBdkc
+EOcLKvbdhkdcmuDZ
+DncKjvbdwuMdpyLn
+EObkKvbdxVMdpxlO
+EPDKjvbdmbKWwoOV
+DoCjjvbdhkeDmtby
+DncLKvbdLFehCBQu
+DoCkKvbdYSkaNUOx
+DnbkKvbdmaivxPNu
+EPDKjvbdfNFvgNKL
+EPDKjvbdhlEdOUcZ
+EPDLKvbdTukpKUAq
+DncKjvbdUVlQKTaR
+DnbkKvbdYgWdAPSi
+DoDKjvbdIwsbHkpp
+EOcKjvbdlZTSTYgU
+DoCkKvbdNHColpVL
+EPCjjvbdxrmhmRag
+EObkKvbdUxgsyjnn
+DoCjjvbdsQVoJbvG
+DoCkKvbdBdQBVjMf
+EObkKvbdIHHZxxXg
+EOcKjvbdJuuFdEgJ
+DoDLKvbdwyhGGXeS
+DnbkKvbdSKyFuGkT
+DoDKjvbdiGibxvKV
+DncKjvbdnBjXXoNu
+DnbkKvbdFpATWffZ
+EPCjjvbduDCtvvOo
+EObjjvbdIsZArlxM
+DncKjvbdEvYopMjF
+EObjjvbdwuMdqYkn
+DoCjjvbdwyhFfYEr
+EPCjjvbdqUTfrSLU
+EOcLKvbdzGxlANEw
+EPCjjvbdEOcKjwCd
+EPCkKvbdOSsvGeUp
+DncKjvbdhlEcnUcZ
+EPCkKvbdUVkoitAq
+DnbjjvbdOAJTTjSA
+DncKjvbdqmZiyLhJ
+EObjjvbdpstGqrLU
+EPDLKvbdFxuVAcwb
+DoCkKvbdauBgYKsh
+DnbjjvbdZMRcsmkm
+EOcLKvbdqrVLNkBN
+DoDKjvbdNQYRWNgT
+DoCjjvbdCTBCtFvr
+DncKjvbdZyEKNcMS
+EPCkKvbdVviYVdFH
+DoDKjvbdePErjtUS
+EObkKvbdwtmFRZLn
+DncKjvbdpedEsvAh
+EPCkKvbdzoQRFClY
+DoDKjvbdIxTbIMQp
+DoDLKvbdxsOImSCH
+EPCjjvbdYfwEAOri
+EOcKjvbdnPyyWLZC
+EOcKjvbdhlFEOVCy
+DoCjjvbdwyhFfXdr
+DnbkKvbdZQmEhleR
+DnbjjvbdbAudepPw
+DnbjjvbdMpXqVmgT
+DncLKvbdNeEUIhjd
+EObkKvbdMfbomQUk
+DoCkKvbdqvpMDJYq
+DoDLKvbdfekzNfgA
+EOcLKvbderAvzlCo
+EOcLKvbdiZtelQnG
+EPDLKvbdRXNdClHc
+EPDKjvbdNrsufeUp
+DncKjvbdZQldiMeR
+EObkKvbdiLdcmtby
+DncLKvbdZQmEhleR
+DncLKvbdZRNEiMdq
+DncLKvbdWRmwadlD
+EPDLKvbdGLEsDHlu
+DncLKvbdZjTIPgCG
+EObjjvbdxnTIXsIc
+EPCjjvbdliETptqa
+EOcKjvbdlrZUyrci
+DoDKjvbdbKlFnnDA
+DnbjjvbdwXLaWBWV
+DoCkKvbduaEZSoFI
+EPCjjvbdRyjHrbvA
+EPCjjvbdLhakpxAS
+DoCkKvbdmaiwXoNu
+EOcKjvbdyNrhYShc
+EObjjvbdsCFllGjy
+DnbkKvbdZshhxdTO
+DoDKjvbdZjShPfaf
+EOcKjvbdmajWwnmu
+EObjjvbdJvUfEFHJ
+EPCkKvbdOEcsiIkE
+EPCkKvbdkNBlZeGo
+DoCjjvbdVviXudFH
+DnbkKvbdjJfHjMxS
+DoDLKvbdGBPRZJzm
+EOcKjvbdiCObdvqR
+DnbjjvbdVwJYWDeH
+DncKjvbdGAoQxizm
+EObjjvbdxmsIYSiD
+DncLKvbdqqtkOLAm
+EObjjvbdvvlAvBWV
+DncKjvbdvAdZTPFI
+EOcKjvbdjAQHAogK
+EObkKvbdpxoIHRDx
+EPCkKvbdffLynGgA
+EPDLKvbdTvLpKUAq
+EOcKjvbdmttzKjSG
+DoCkKvbdqwQMChyR
+DoDKjvbdrzMPsAgn
+DoDLKvbdyYJKCPyk
+DoCkKvbdRbEEkhxk
+EPCkKvbdBdQAuilf
+EPDLKvbdRaceMIyL
+EOcKjvbdraelkfjy
+EOcLKvbdEASIlzWw
+DnbkKvbdOSsvGeUp
+DnbjjvbdmuVZkJrG
+DnbkKvbdVwIwvDeH
+DoDKjvbdwWlAvBVu
+DncKjvbdSKyFuGjs
+DoCkKvbdOXnuzcmt
+DncKjvbdrXPlDJZR
+EPDLKvbdsBfNMGjy
+EPDLKvbdiifHilwr
+DnbkKvbdjvWmcbYX
+DoDLKvbdZnmhddyj
+EPCkKvbdemFvfmKL
+EPDLKvbdNxPVzcnU
+DnbjjvbdRkYfUgLT
+EPCkKvbdZRMdhldq
+EObjjvbdYqMdhmFR
+DncLKvbdJvVGDeGi
+EPDKjvbdUtMsfLuj
+DoDLKvbdZyEJnClS
+DnbkKvbdjcMKqGtg
+EPCjjvbdDnbjkXDE
+DnbjjvbdLGGICAqV
+EPDKjvbdWIXvYGxz
+EOcLKvbdBiLCKhfK
+DnbkKvbddwzUURez
+EOcLKvbdZQldiMdq
+DncLKvbdKVtfEFGi
+DoCkKvbdvAcxsPEh
+DncLKvbdjvWmcbXw
+EObkKvbdqiAJeNOe
+EOcLKvbdUMWPBWPJ
+EPCjjvbdOFDshhjd
+EOcLKvbdVrNxBeMD
+EPDKjvbdiGicZWKV
+EObkKvbdtTRrxzFD
+DoCjjvbdjJfHilxS
+DoCjjvbdelfXGmKL
+EPCjjvbdIrxaTMwl
+EOcLKvbdRECaPpcr
+DnbkKvbdiLeDmtby
+EPDLKvbdGcjvKCJj
+EOcKjvbdWWiXuceH
+DoCkKvbdpstHRrLU
+EPDLKvbdkHgLeemk
+EPCkKvbdzGxlANEw
+EObkKvbdjKGHjMwr
+EPCkKvbdiUzEvquC
+EOcLKvbdwXMBWBVu
+EObkKvbdeKKRvUzn
+DncLKvbdSBceLhxk
+DoDLKvbdJbibqJbx
+DncKjvbdeAUQlxJf
+EPDKjvbdbUafwkUI
+DoCkKvbdxnTIXriD
+EPDLKvbdRacdlJYk
+EOcLKvbdmgFXlnGy
+EOcKjvbdHELWJaij
+EPDLKvbdLhbMQxAS
+DnbkKvbdhbPDFXRR
+EOcKjvbdqwQMDIxq
+DncKjvbdeOdrkTsr
+EObjjvbdyOSgwriD
+EPCkKvbdjmCLyeHP
+DnbjjvbdZisHpGbG
+EOcKjvbdIHGzZXwg
+DncLKvbdwWkaWAvV
+DoDKjvbdffLzOHHA
+EPCjjvbdqZPIHREY
+DoCkKvbdDjHivYKA
+DoDLKvbdYNqAYVWU
+EPCkKvbdzjUpPcrt
+DncLKvbdlqyVZrdJ
+DncLKvbdDoDLLXDE
+DoCjjvbdcSbjtDia
+DoDKjvbdDxXlUTsl
+DncLKvbdJYTahLpp
+EObkKvbdNQXqVnHT
+EObjjvbdijGIJlxS
+EObjjvbdOStVfdtp
+EPCkKvbderBWzlCo
+EObjjvbdKQzEnenF
+EPCjjvbdmtuZkKRf
+EPCkKvbdEJhJuxKA
+EPCjjvbdgGLymfgA
+EObjjvbdRbDeLhxk
+EOcKjvbdrSUkNkAm
+DoDLKvbdEOcLLXDE
+EObjjvbdBhjbKiFj
+DoDLKvbdBdQAuimG
+DnbjjvbdDwwkstTl
+DoDLKvbdVwJYVdEg
+EOcKjvbdACqwizJQ
+EObjjvbdZsiIyETO
+EObkKvbdGLFSbhMu
+EOcLKvbdFkFTChNV
+DnbjjvbdVBCRSprZ
+DoCjjvbdssRsYydc
+DoCkKvbdUMWOaWOi
+DoDKjvbdYSlBMsnx
+EObkKvbdNsTvHFVQ
+EPDKjvbdZisIPfaf
+EOcLKvbdpssfqqjt
+EPCkKvbdNHCpMpVL
+EPDKjvbdczZPwxpb
+EPCjjvbdnBivxPOV
+DoDKjvbdUtNTelVj
+EPDKjvbdjhHMFfNk
+EObjjvbdEuyPolie
+EPDLKvbdKQydneme
+EPCkKvbdQvnECkgc
+EPDLKvbdatbGxLTh
+DoDLKvbdNPxQvOGs
+DoDLKvbdySnImSCH
+EObkKvbdvBEZTOeI
+DoCjjvbdatagXkUI
+DnbjjvbdmbKXXnnV
+EOcLKvbdmbKXXoNu
+EPCkKvbdNsUWGduQ
+DncLKvbdpssgSRjt
+EPDLKvbdiUzFXSUb
+EObkKvbdyzeORgiI
+EOcLKvbdKDKDQibx
+DoCjjvbdmJDtQuSB
+DncLKvbdaNKaruMg
+DnbkKvbdOEctJJKd
+EObjjvbdkVvnECXw
+EObkKvbdKaLHMbXq
+DoCjjvbdYzcFqiuy
+DoCkKvbdvwLaWAvV
+EPDLKvbdnBiwXoNu
+EOcLKvbdLBKgNBwq
+EPCkKvbdCJLBjiFj
+EObjjvbdptUGqrLU
+DoCkKvbdWXJYWEFH
+EOcLKvbdNeEThiLE
+EPCjjvbdtAHQhAAr
+EOcKjvbdUGzmlXVe
+DnbkKvbdrylPsBIO
+EPCjjvbdICLzEzAD
+EPDKjvbdrpVoKCuf
+EPCjjvbdRkZFuGjs
+Dnbjjvbdznopdbkx
+DoDLKvbdmgFYNNfy
+EObjjvbdptUHRrKt
+DoCkKvbdhfjDZWJu
+DncLKvbdLGFgbBRV
+EPCjjvbdZnnIeEyj
+DoDKjvbdmtuZjirG
+EPCkKvbdmbJvwoOV
+DncLKvbdJpydoFme
+EPDKjvbdFyUtaEXb
+DnbkKvbdqFcdtWAh
+DnbjjvbdWRnXaeMD
+EOcKjvbdCIkBkJGK
+EOcKjvbdJTZBSlxM
+DnbjjvbdziuPocsU
+DnbjjvbdhzUelQmf
+EPCjjvbdUaBqSprZ
+DncLKvbdxZgefXdr
+EObjjvbdKVuFdEgJ
+EPCjjvbdAMgyTWzY
+DnbjjvbdiHJbxuiu
+DoDLKvbdUtNTekuj
+EPCjjvbdUQpnttgm
+DoDLKvbdVAbRTRSZ
+DncKjvbdkxsSTYgU
+DnbkKvbdMfbomQUk
+DoCjjvbdTAEiHbOd
+DoCjjvbdczZPxYpb
+DnbkKvbdUVkojUBR
+DncKjvbdddnqavbj
+DoDLKvbdxwhiapZk
+DoDKjvbdZirhPfaf
+DoDKjvbdTukoitAq
+DoCjjvbdrJAKFMne
+EObkKvbdZQmEhmFR
+DoCjjvbdHgHZyXxH
+DncLKvbdNHCpNPuL
+DoCkKvbdfIKvRmpg
+DoCjjvbdNsUWHEtp
+DoCjjvbdpfDdtWAh
+DoDLKvbdBhkCKiGK
+EObjjvbdtSqsYydc
+EPDLKvbdQccBPqES
+EOcLKvbduMXvaUAw
+EOcLKvbdZMRctNkm
+EObjjvbdRadFMIxk
+DncLKvbdjhGlFfOL
+DoCjjvbdhtzEvqtb
+DnbjjvbdUtNUGMWK
+EPCjjvbdaaWEfQQX
+DncKjvbdunszpkOt
+DoDKjvbdEJgjWYKA
+DoCkKvbdQYmAGsRj
+DoCjjvbdmozYujyC
+DnbkKvbduVnYKRTA
+DnbkKvbdZxcjNblS
+EPDKjvbdzRPNIiwA
+EObkKvbdzitopESt
+EObjjvbdfILVrNpg
+DoCjjvbdNGcPmPuL
+DnbjjvbdEYXlUUTl
+DnbjjvbdraellHKy
+DoDKjvbdZQmEhmFR
+DoCkKvbdZnnIdeZj
+DnbjjvbdjcMKpgVH
+EObkKvbdTfznLvue
+EOcKjvbdFkErcIMu
+DncKjvbdGdKvKBjK
+DoCjjvbdVvhwvEFH
+EPCkKvbdmJEUQuSB
+DncKjvbdIsZBSlxM
+DnbkKvbdmbJvxPNu
+DoDKjvbdTqRPVUhN
+DoDLKvbdwygefXdr
+DnbjjvbdLGGHbBRV
+DncLKvbddijSVtzn
+EObkKvbdZnnJFFZj
+EOcKjvbdCTBCsfXS
+DoDLKvbdmttzKjSG
+EOcKjvbdyNsIXsIc
+EOcKjvbdbVBgXjtI
+EOcLKvbdGFjRnJUR
+DnbkKvbdYTMBMtOx
+EPCkKvbdNGcQMouL
+DoDKjvbdJcKDQibx
+DoDLKvbdrpWOicWG
+EOcKjvbdRaceMIyL
+EPDLKvbdWWiYWDeH
+EPDLKvbdczZQXxqC
+DoDKjvbdLBKgMaxR
+DnbjjvbdZjShQHBf
+DoCkKvbdKaLGlbXq
+DnbkKvbdGdKujCJj
+EObkKvbdIBkydzAD
+DnbkKvbdqUTgSRkU
+EOcLKvbdBiKbKhfK
+DoDKjvbdVwIwvEEg
+EPDKjvbdIjEAKQHE
+DoCkKvbdEPCkLWcE
+DoDLKvbdrDeJQNua
+EOcLKvbdNddUIhjd
+EPCkKvbdYNqAXtvU
+EObkKvbdUaCRSqRy
+EPCjjvbdqqtjmjaN
+EPDLKvbdhbOcFWpq
+DoDKjvbdULvPBVni
+DoDKjvbdGGJrOJTq
+DoCkKvbdqceIpNvB
+EOcKjvbddePSCXCj
+EPCjjvbdVUNTekuj
+DnbjjvbdLGGHbApu
+DoCkKvbdcTDLTcia
+DnbkKvbdNsUWGeVQ
+EObjjvbdZLqcsmlN
+EObkKvbdxrnJMrCH
+DnbjjvbdqvolChxq
+EPCjjvbdaNKbSuNH
+DnbkKvbdlYrrTYft
+EPCjjvbdwtldpyMO
+DnbkKvbdNddThiKd
+EPCkKvbdjJfIJlwr
+EPCjjvbdJpzEoFme
+DnbkKvbdiMEcmuDZ
+EOcKjvbdkVvmdBww
+EOcLKvbdAMgxrwZx
+EObjjvbdatbGwjtI
+EOcKjvbdTAEhhCOd
+DnbjjvbdfNFwHNJk
+EObjjvbdVBBqSpqy
+EPCjjvbduaEZSndh
+EPDLKvbdpstGqqkU
+DnbkKvbdIwtCHlQp
+DncKjvbdrbGNMGkZ
+EOcKjvbdILaznWqL
+DoCjjvbdTXjkmzkY
+DoCjjvbdIGfyyXxH
+EOcKjvbdjKFhKNXr
+EPDKjvbdRDcApRES
+EObjjvbdmfdxNNfy
+EObjjvbdDihKWYKA
+DoCjjvbdzaAOffal
+EPDLKvbdQccBQQcr
+EPCjjvbdTlWPAvOi
+DnbjjvbdqUTfrSLU
+EObjjvbdVAbRTRRy
+DoCkKvbdnCKWxPOV
+EOcKjvbdFjdrbhNV
+DnbjjvbdrzLpTAhO
+DoCjjvbdDxYMUUUM
+DnbjjvbdmoyxujyC
+DnbjjvbdUVkoitAq
+EObjjvbdrEEhpOWB
+DncKjvbdRjyGVGjs
+DoCkKvbdJJdAKPgE
+DoDKjvbdKDJbqKCx
+EPDLKvbdcTDLUDia
+DoCkKvbdePEsKssr
+EPCjjvbdJbjCqJbx
+DoDLKvbddBrmSATm
+EOcLKvbdlhcsqVRa
+EOcLKvbdKfGICBRV
+EPDLKvbdrovPJbvG
+DoCjjvbdbAvFGQQX
+EPDLKvbdlZTSSxft
+DnbjjvbdLqvmZuQz
+DncLKvbdZshiYdSn
+EOcLKvbduMXvaTaX
+EObjjvbdZtJJYcrn
+EOcLKvbdczZPwxpb
+EPDKjvbdatafwjtI
+EObkKvbdsQVnicWG
+DnbjjvbdrWokcIyR
+DncLKvbdJuteceGi
+EOcLKvbdADRwiyiQ
+EPDKjvbdCIkBjiFj
+EPDKjvbdrNZjYkgi
+DnbkKvbdSLYeuHLT
+DoDKjvbdkNBkzEfo
+DnbkKvbdcyxowyQb
+EPDKjvbdYkrETnMN
+DoDKjvbdwWlAvAvV
+EPCkKvbdczZPxZQb
+EPCkKvbdKCibpjCx
+EOcKjvbdhytfLqOG
+DnbjjvbdxmsHwriD
+EPDKjvbdmfeYMmgZ
+DoCkKvbdNQXpvNfs
+DncLKvbdirziSkJz
+EOcKjvbdHffzYxYH
+EOcKjvbdWXIxWDdg
+DncLKvbdVvhwuceH
+DoDLKvbdFxtuBDxC
+DncLKvbdJcKCqJbx
+DoCkKvbdxLWcgzyf
+DnbjjvbdCJLBjiGK
+EPCjjvbdcasMrATm
+DoDLKvbdLFfICAqV
+EPDKjvbdqmZjZMHi
+DncKjvbdczZPwxqC
+EObkKvbdrWpMDJYq
+EPCjjvbdLFehCBQu
+EPCkKvbdRzJgsDWA
+DoDKjvbdIsZArlxM
+DncLKvbdqFcdsuaI
+DncLKvbdULvPBVni
+EOcLKvbdWXJXuceH
+EPDLKvbdaNLCTVMg
+EObkKvbdUxhUZjnn
+DncLKvbdeATplxKG
+DoCjjvbdmSYtzSci
+EOcLKvbdkMbLzEfo
+EPCjjvbdrpVoJcWG
+EPCjjvbdXrlAlsoY
+DoDLKvbdUxhTzKnn
+EPCjjvbdOEdUJJLE
+EObjjvbdKDJcRKCx
+EPDKjvbdcyxpXxqC
+DnbkKvbdZxdKODMS
+DncLKvbdcImJjfWx
+DnbjjvbdpfEFTuaI
+DnbkKvbdZoNheEyj
+EOcKjvbdjFKfuPAO
+DnbkKvbdFVyQQNKF
+DnbkKvbdDjHiuwjA
+EPCkKvbdMgDPlotk
+EPDKjvbdxnShXsIc
+DoDLKvbdOTUVfduQ
+DncKjvbdFejRnIsq
+DncKjvbdSQUHJfEX
+DncLKvbdRXOEDMHc
+DoCkKvbdsZkosAgn
+DoDKjvbdUsmUGLuj
+EPDKjvbdiifIJmYS
+DoDLKvbdZQmEhmFR
+EObjjvbdeUAUASlv
+DoDLKvbdUsltFlVj
+DoCjjvbdSiZjRABM
+EOcLKvbdegkVrORH
+DoDKjvbdYlRdTnLm
+DncKjvbdzitopESt
+DnbkKvbdhbPDEwQq
+DncKjvbdSKxetgLT
+DncKjvbdZQmEiNFR
+EPDLKvbdUyITzLPO
+DnbjjvbdznpQdblY
+EObkKvbdbLMFoODA
+EPDLKvbdBhjbLJFj
+DoDKjvbdNwoVzdOU
+DncKjvbdvBDxsPEh
+DnbkKvbdSBceLiZL
+EPCkKvbdOhAXyAZB
+EObjjvbdZisIQGbG
+EOcLKvbdAMgxrvyx
+EPDKjvbdCDpAvKMf
+DoDKjvbdxVMdpxlO
+EOcKjvbdJbicRJbx
+DoCkKvbdTppnuVIN
+EObjjvbdZjTIPfbG
+DoCkKvbdpyOhHQcx
+DoCjjvbdfHjvSOQg
+DoCjjvbdzoPpdcMY
+EPDKjvbdmfeYNNfy
+EPCjjvbdXGYzUAPT
+DoDLKvbdypnmJKXA
+DnbkKvbdBsAcUFwS
+DoDLKvbdQYmAGsRj
+EObjjvbdUxhTyjnn
+DoCkKvbdrouoKCvG
+DoDLKvbdhtydwSUb
+EPCkKvbddwytUSFz
+EOcKjvbdrbFmLgLZ
+EObkKvbdbPffckzd
+EObjjvbdDxXlTtUM
+DnbkKvbdqGEFTvAh
+EPCjjvbdDoCkKwDE
+EOcLKvbdVviYWDeH
+EPCjjvbdWSOYCFLc
+DncKjvbdmbKWxPNu
+DoCkKvbdZshhxdTO
+DoDKjvbdwtldqYkn
+DoDLKvbdYSlBMsoY
+EPDKjvbdRkZFuHKs
+DnbkKvbdeYZstRez
+DoCjjvbdrNZixlIJ
+DoCjjvbdmgFXlmgZ
+EPCkKvbdYlRcsmlN
+DoCjjvbdOFETiJKd
+EPDLKvbdBhkCLJFj
+EPCjjvbdmuVZkJrG
+DnbkKvbdFjeTChMu
+DoCjjvbdJTZBSlwl
+DnbkKvbdozmdLYPA
+EObjjvbdtbbtvuoP
+DncKjvbdqUTfrSKt
+DncKjvbdyTOImSBg
+DnbjjvbdcTCkTdKB
+EOcKjvbdKaKgNCXq
+EPDKjvbdZoOIeEyj
+DoDKjvbdYqMeIleR
+DncKjvbdnPzZWLZC
+EPDLKvbdZirhPfbG
+DnbkKvbdGQATXGey
+EOcKjvbdZsiJYcsO
+DnbkKvbdrWpMDJYq
+DoCkKvbdMuTSLNAX
+EObjjvbdpxnhHRDx
+EOcKjvbdzitpQESt
+EPCjjvbdhuZeXSUb
+DoCjjvbdNeDtJIkE
+DoCkKvbdCEQBWKMf
+EPCkKvbdHEKvKCJj
+EPCjjvbdatbHYLTh
+EObkKvbdLGGICBRV
+DncKjvbdRjxeuGjs
+DoDKjvbdnHFYNOHZ
+EObkKvbdIryAsNYM
+EObjjvbdmfdwlnGy
+EOcLKvbdNeDsiIkE
+DnbjjvbdJTYaSlxM
+DoCkKvbdRadEkiYk
+DncLKvbdjKFgjNYS
+EObkKvbdZjShQGaf
+EOcKjvbdKfFgaaQu
+DoDKjvbdhgJbyVjV
+DoCkKvbdwuNFRZMO
+DncLKvbdfekzNfgA
+DncKjvbduCcVWuno
+EPDLKvbdVrNxBdkc
+DnbkKvbdRkYeuHLT
+DoDLKvbdwuNEpxlO
+DoCjjvbdQccAoqDr
+EOcKjvbdUGzmkvvF
+DncKjvbdEJhKWYKA
+EOcLKvbdssSSxyeD
+DoCjjvbdVviXvEEg
+DnbjjvbdEuxopNKF
+EObkKvbdLAkGlbXq
+DoCkKvbdZsiJZESn
+DoCkKvbdhkeEOUby
+DnbkKvbdbhlikGXY
+EObkKvbdLBLGmCYR
+EPCjjvbdxUleQyLn
+DncLKvbdrbGNMGjy
+DoCkKvbdddoSBwDK
+EPDLKvbdkyTRsYgU
+EPDKjvbdehLVqmqH
+EPDLKvbdrbFmMHKy
+DncLKvbdmbJvwoOV
+EOcLKvbdVUNUFkvK
+EPDLKvbdrpWPJbvG
+DncKjvbdGAnpxizm
+EOcKjvbdyzeNqghh
+DoDLKvbdhbPDFWpq
+DoDLKvbdfVzxQJzs
+DoDLKvbdUMWPBVoJ
+EOcLKvbdRpTfjFdX
+EPCkKvbdpfDeUWBI
+EObjjvbdmuUyjirG
+EObjjvbdtbbtwWOo
+EObkKvbdrylPsAgn
+EOcLKvbdmSYtysEJ
+DncKjvbdSCDeMJYk
+DoCjjvbdTppoUthN
+EPDKjvbdVTmUFkuj
+EObjjvbdIsZAsNXl
+EOcKjvbdSBcdlJYk
+DnbkKvbdZQleIleR
+DnbjjvbdddoSBvcK
+EOcLKvbdNHComPuL
+DncKjvbdiCPCdvqR
+EOcKjvbdliDspuSB
+EObkKvbdzoPpeCkx
+DnbjjvbdcJMijevx
+DoDKjvbddZxpYZQb
+DoDKjvbdkySrSxft
+DoDKjvbdyXhiapZk
+EPCkKvbdOAIrsirA
+EObkKvbdUaBqSqSZ
+EPCkKvbdZtJIyESn
+DnbkKvbdTvLoitAq
+EPCjjvbdyzeNrIJI
+EOcKjvbdiCPDEwRR
+EPCkKvbdnCJvwoNu
+EPCkKvbdIGfzZYXg
+DoCkKvbdkySqrxft
+DoCjjvbdZdxGzgiC
+DncKjvbdzitpPcsU
+DncLKvbdbVCHXjsh
+EPCkKvbdlhcsqVSB
+EPCjjvbdGYtuAcxC
+EOcLKvbdjAQGaQHK
+EObjjvbdjlakzFGo
+EOcLKvbdvwMAvAuu
+EPCjjvbdTqQoVUhN
+EPCkKvbdeEnrBwCj
+DoCkKvbdsCGMkgKy
+DnbjjvbdhkeDnVDZ
+EPCjjvbdOFDshiLE
+DnbjjvbdDwwlUTsl
+EPCkKvbdKWUedEgJ
+EPDLKvbdsQVnicWG
+EPCkKvbdjgflFfOL
+EObkKvbdQYmAHTSK
+EObkKvbdSPsgJecw
+EObjjvbdjAQGaPgK
+DoDLKvbdDxXlUUUM
+DoCjjvbdegjuqnQg
+DnbkKvbddwzTsqez
+DncKjvbdxxJJbPyk
+EOcKjvbdGKeTChMu
+DoCkKvbdeFPSCWcK
+EObkKvbddeOrBwDK
+EPCkKvbdaNLBsUmH
+DoDLKvbdRpTgJedX
+EPCkKvbdkySrSxgU
+EPCkKvbdVYhTzKoO
+EPCjjvbdxxIjCPyk
+EPDLKvbdVrOXadkc
+EOcLKvbdEOcKjwDE
+DncLKvbdmfeYMnGy
+EPCkKvbdVAaprprZ
+EPCjjvbdFWYpQMjF
+DoCkKvbdqrUjmkAm
+DoCjjvbdQvmdDLhD
+EPDLKvbdeATqNYKG
+DnbkKvbdLGGHaaQu
+EObjjvbdezvZEhtX
+DnbkKvbdjuwNdBww
+DncKjvbdJTZAsMwl
+EPDKjvbdkxrrTYgU
+EPDKjvbdbAudfQQX
+DoCkKvbdVUNUGMVj
+EPDLKvbdaNLBsUlg
+EPDLKvbdDwxLtUUM
+EPCjjvbdMgColpUk
+EPDLKvbdaogGdLzd
+EPDKjvbdzGxlANFX
+EPCkKvbdUQqOuUgm
+DoDKjvbdEPDKkXCd
+EPDKjvbdbsCkTcia
+EObjjvbdTAEhhBnd
+EPCkKvbdhzVFkpmf
+DnbkKvbdaSFcHtGL
+DoCjjvbdGBOpxizm
+DncLKvbdGYttaEYC
+DoDKjvbdqYoHfpdY
+EOcKjvbdrouoKCuf
+EOcKjvbdiCPDFWqR
+DnbjjvbdVAaprqRy
+EPCjjvbdePFSjtUS
+DnbkKvbdLGGICBRV
+EPDLKvbdkMalZeHP
+DoDLKvbdJutfEFHJ
+DoDKjvbdVBCRSqSZ
+EObjjvbdvvlBWBWV
+EOcLKvbdFVxpPmJe
+DoDLKvbdKfGHaaRV
+DnbjjvbdBvzdIdpW
+DncKjvbdNsUWHFUp
+EPDLKvbdrSVLNjaN
+EPDKjvbdgGMZnGgA
+DnbkKvbdSBceMIyL
+EOcLKvbdSBdFLiYk
+EOcLKvbdRyigrcWA
+EPDKjvbdaMkBruNH
+DncKjvbdUaCRSpqy
+DnbjjvbdIMBzmvpk
+DnbkKvbdbVCGxKtI
+DncLKvbdliDtQuSB
+EObkKvbdHDkVjBjK
+DncKjvbdmSYtyrci
+DnbkKvbdxVMdpxlO
+EPCjjvbdRpTfjGDw
+EPCkKvbdhancEvpq
+EPDLKvbdNsTvHEuQ
+DoDKjvbdfekymfgA
+EObkKvbdUWLojUBR
+EPCjjvbdJXtBgkpp
+DoCjjvbdEPCkLXCd
+EPCjjvbdZxcjNcLr
+DoCjjvbdZsiJYcrn
+EPCkKvbdZtIiZDrn
+EObkKvbduLxWaUBX
+EObkKvbdZdxGzghb
+EOcKjvbdkClLRHVH
+EOcLKvbdFjdsDINV
+DncKjvbdNeEUIiKd
+EPCkKvbdYpmFJNFR
+EPDKjvbdlhcsptqa
+DoDLKvbdnCKWwoOV
+EObkKvbdDnbkLXCd
+EObkKvbdQwOECkhD
+EOcKjvbdUaCRSpqy
+EPCjjvbdBcoaVjNG
+DnbjjvbdxmrhXsJD
+EObjjvbdcImKKewY
+DnbkKvbdpyOgfpdY
+DnbjjvbdpyOggRDx
+EObjjvbdEOcKjwDE
+DnbkKvbduCcUwVoP
+EOcKjvbdhgKCxuiu
+DoDKjvbdiZtelQmf
+DoDKjvbdnBjXYOnV
+EPDLKvbdczZPwxpb
+EPCjjvbdADRwizJQ
+EObjjvbdfVzwpJzs
+DnbjjvbdxxIiapZk
+EPCjjvbdjcLkQfuH
+EPCjjvbdcyyQYYqC
+DoCkKvbdEuyPpNJe
+DncLKvbdcJNJkGWx
+DoDKjvbdZoOIdeZj
+DoCjjvbdWHxVwgYz
+DnbjjvbdeEoRbWbj
+DncKjvbdZMSDsnLm
+EOcLKvbdbiNKLFvx
+DnbkKvbdjcLjqHVH
+DnbjjvbdEYXktTtM
+EPCjjvbdCSaCsfWr
+EOcLKvbdBdQAuimG
+EObkKvbdqdFIpOWB
+DncLKvbdelevgNKL
+EObkKvbdZMRdUNkm
+EPCkKvbdrDdiQOVa
+DoDLKvbdCWzdJFQW
+EObjjvbdxUleQyMO
+DncKjvbdBsAcTfXS
+EOcKjvbdRMxBxmtz
+EOcKjvbdSKyFuGkT
+EPCkKvbdEuxooljF
+DncLKvbdYgWdAPSi
+DoCkKvbdiHJcYvKV
+EPCkKvbdZQldiNFR
+DncKjvbdjAPgAofj
+EObjjvbdkVvmdBxX
+DoDLKvbdsBfMlHLZ
+DoDLKvbduWNxKQsA
+EObjjvbdOTTugEtp
+DoCjjvbdIxUBgkqQ
+EOcKjvbdqFceUWAh
+DnbjjvbdTkunaVoJ
+EPDKjvbdiZtfLqOG
+DoCjjvbdcImJkGXY
+DncLKvbdpstGrSLU
+DncLKvbdRpTfjGDw
+DnbkKvbdznpREblY
+DnbjjvbdqdEhomvB
+DncLKvbdIwtBhMRQ
+DoDKjvbdhtzFWqtb
+EOcKjvbdiBncEwQq
+EPDKjvbdZQleJMdq
+EOcLKvbdLAkGlaxR
+DoCkKvbdZsiIyDsO
+EObkKvbdeOdsKssr
+DnbjjvbdJcKCpjDY
+EPDLKvbdSBdElIyL
+EPCkKvbdyOTHwrhc
+EPDLKvbdGLEsDIMu
+EPCjjvbdmJETqVRa
+DncKjvbdKDJbqJbx
+EOcKjvbdbsCkTdKB
+EOcKjvbduDCuXVno
+EOcKjvbdrXPlDIxq
+EOcKjvbdqlyixkhJ
+EObjjvbdRkYfUgLT
+EPDLKvbdLAkGmCXq
+DnbjjvbdHgGzYxXg
+DncKjvbdpstHSSKt
+DoCkKvbdqvolCiYq
+DoCkKvbdmgFYNOHZ
+DnbkKvbdqGDeTvBI
+DoDLKvbdyzeNrHhh
+DnbkKvbdwzHefXeS
+DoDKjvbdbiMjLGXY
+DnbkKvbdTulQKTaR
+DnbjjvbdsPunicVf
+DncKjvbdqvpLcIyR
+DncLKvbdOFEThhkE
+EOcKjvbdZshhxdSn
+DncKjvbdpyPHfpdY
+DoDLKvbdNGcPmQUk
+DoCkKvbdVgwvXfxz
+DoCjjvbdCgLegAzc
+DnbjjvbdauCGxLTh
+DoDKjvbdqFceTvBI
+DoCjjvbduMYXAsaX
+EPCkKvbdrSVKmkAm
+EObkKvbdOYOuzcnU
+DncKjvbdYkqctNlN
+DncKjvbdSZjHrcWA
+DoCjjvbdrEFJQNua
+EPCjjvbdRosfjFcw
+EObkKvbdZoNiFEyj
+EPDKjvbdVgwvXfxz
+DoDLKvbdhbPCdvqR
+DncKjvbdqvokcIyR
+DnbjjvbdpssfqqkU
+DncLKvbdzoPpdbkx
+DnbjjvbduaDySoFI
+EOcKjvbdEASImZwX
+DncKjvbdbrcKtDjB
+DoCjjvbdQccBQQdS
+DoCkKvbdDigjVwjA
+DnbkKvbdbVBfwkUI
+EOcKjvbdIsYaSlxM
+DoDLKvbdKVtedEgJ
+EPCjjvbdIryArlxM
+DncKjvbdpeceTuaI
+EObkKvbdZshiYdSn
+DncLKvbdZtIhyESn
+DnbjjvbdOYOuzcnU
+DoDKjvbdUxhTyjoO
+EObjjvbdTppoVVHm
+DncKjvbdrWolCiYq
+DoDLKvbdNVSrKmAX
+EObkKvbdiGicZWKV
+DoDKjvbduVmwipsA
+EPCjjvbdNPwqVnHT
+EObjjvbdelewGmJk
+EOcLKvbdgGLzNgHA
+DoDKjvbdcJNJjfWx
+DoCkKvbdyOTHwriD
+EObjjvbdEzspeLcJ
+DnbjjvbdjhHLeenL
+DncKjvbdOStWHFVQ
+EOcLKvbdsZlPsBHn
+EPDLKvbdtcCuWuno
+DnbkKvbdULunaVni
+EPDKjvbdJqZdnfNe
+EOcKjvbdqwPkcIxq
+EObjjvbdrJAJeNOe
+DnbjjvbdRECaPpdS
+EPCjjvbdpfEEsvBI
+EPDLKvbdIsZArmYM
+EPDLKvbdJYUCILpp
+EOcLKvbdYlSDtNlN
+EPCjjvbdJYTbHkpp
+EPDKjvbdYzbfSJvZ
+EPCjjvbdRaceMJYk
+EObjjvbdZisHofaf
+DnbkKvbdRbEElIyL
+EOcLKvbdijFhKNXr
+EOcKjvbdRXNdDMID
+DncLKvbdbiNKLGXY
+DoDLKvbdlZSrSyHU
+EObkKvbdqZPIHRDx
+DoDKjvbdnPzYujxb
+EObkKvbdnHEwlmfy
+EObkKvbdCWzdIePv
+EObkKvbdqlyiyLgi
+EPCjjvbdkySqryHU
+EObkKvbdcImKKevx
+DncKjvbdEASJMzWw
+DncKjvbdRkYfUfkT
+EPCjjvbdqYoIGpcx
+DncKjvbdGckWKBjK
+EPCjjvbdYTLaNUOx
+EPDKjvbdwtleRZMO
+EObkKvbdGFiqnJUR
+DncLKvbdlhdURVRa
+EObjjvbdqlzJxkhJ
+DncLKvbdFaPQyJzm
+EPCkKvbdpssgRrLU
+EObjjvbdiCOcFXRR
+DncKjvbdqTtGqrLU
+EPCjjvbdsCFlkgLZ
+EOcKjvbduWOXiqTA
+EOcKjvbdkClKqGuH
+EPCjjvbdMowpvOGs
+EPCkKvbdxrmhmRag
+DoCjjvbdiUzFXRuC
+EOcLKvbdUMWPAvOi
+DoDLKvbdmfdwlmgZ
+EPCjjvbdehKurNpg
+EOcLKvbdBsAcTevr
+EPCjjvbdZjTIPgBf
+EObjjvbdPIAXyAZB
+EPCjjvbdCDoaVjNG
+DncKjvbdrpVnicVf
+DoDKjvbdlZTSSxgU
+DncKjvbdGZVVAdYC
+EPDLKvbdsCGMkfjy
+EPCjjvbdSPsfjFdX
+DoCjjvbdJXsbIMQp
+DncKjvbdzeZnzdyp
+DnbkKvbdlYsRsYft
+DncKjvbdbiMjLFwY
+EPDKjvbdyOShYSiD
+DoCkKvbdOTTufduQ
+EPDLKvbdVwJYVcdg
+DoCkKvbdGFiqnJTq
+EOcLKvbdUslselWK
+EObjjvbdkxsSSyHU
+EOcLKvbdxsNhmSBg
+DnbjjvbdqqtkOLAm
+DnbjjvbdeFPRawDK
+DnbkKvbdLZQirzuG
+EPCkKvbdFWYpPlie
+EObkKvbdrWpMCiYq
+EOcKjvbdiiehKNXr
+EPDKjvbdEvYopNJe
+EPCkKvbdxrmhmSCH
+DoCkKvbdptUHSRkU
+EOcKjvbdKCjDRJcY
+DoDLKvbdrMzKYkgi
+DoCjjvbdZLrDtNkm
+DoCkKvbdqYnggQcx
+DnbkKvbdrovOibvG
+DncKjvbdADRwizIp
+EOcLKvbdZisHpHCG
+EPCjjvbdZRNFImFR
+EPDKjvbdVwIxVceH
+EOcKjvbdrDeJQNua
+EPCkKvbdIxTaglQp
+DncKjvbdGFiqmiUR
+EPCjjvbdVwJXvEEg
+DnbkKvbdwuMeRZMO
+EPCkKvbdZRNFImFR
+EPCkKvbdnHEwlmgZ
+EPDKjvbdLYqKSzuG
+DoDKjvbdZsiJYdTO
+DoDLKvbdShyjRAAl
+DoDKjvbdRadFLiYk
+DnbkKvbdjbkjpgUg
+EObkKvbdUaBpsRRy
+EOcKjvbdehKuqnRH
+EObkKvbdDwxMUTsl
+EOcKjvbdptUHSSKt
+EPDKjvbdHEKuibJj
+EOcKjvbdxxIjBpZk
+EObkKvbdelewGmJk
+DncLKvbdTvLpKUAq
+EPCjjvbdGLErbhNV
+DncLKvbdfHjvRmqH
+DnbjjvbdkMakyeHP
+EPDKjvbdJcKCpjDY
+DoCkKvbdRECaPpcr
+EOcLKvbdmgFYMmgZ
+EObjjvbdZRMdiMeR
+DoCjjvbdYzcFqivZ
+DoCkKvbdeOeTKtTr
+EPCkKvbdXFxytAPT
+DncLKvbdZnnJEdzK
+DncLKvbdhtyeWrUb
+EOcKjvbdEJgivXjA
+EPDLKvbdssSTYyeD
+EPDLKvbdLBLGmCXq
+DnbkKvbdKeegbApu
+DoDLKvbdJYUBhLqQ
+EPDKjvbdwNWANDdm
+DoCjjvbdKfGIBaRV
+DoCjjvbdbhljLFwY
+DncLKvbdmgFXmNgZ
+DoDKjvbdZRMeJNFR
+DoCkKvbdWeyZtAOs
+DoCkKvbdbiNKLFvx
+EPDKjvbdUsmTfMVj
+EPCkKvbdijFgjMwr
+DnbkKvbdbsCjtDia
+DnbjjvbdZQleJNFR
+DoDLKvbdNQXqWNfs
+EOcLKvbdULunaVoJ
+DncLKvbdrEEhpOVa
+DncLKvbdRyigsCvA
+DoCkKvbdVwJYWEEg
+DncLKvbdjKGIKMwr
+EObkKvbdrEFIpNvB
+DoCjjvbdGLEsDINV
+EOcLKvbdJSyArlxM
+EPCjjvbdTJZiqABM
+DncLKvbdCTAbsewS
+DnbjjvbdZjTIPfaf
+EPCjjvbdbPfgELzd
+DnbjjvbdLBLHMbXq
+EPCjjvbdqiAKFMoF
+DnbkKvbdIBlZdzAD
+EPDLKvbdyTNiNRag
+DoDLKvbdZjSgogCG
+EPCjjvbdjAPgAofj
+EPCjjvbdxmrgxTJD
+EObjjvbdSPsgKGEX
+EObkKvbdRWnDblHc
+DnbjjvbdZQmFImFR
+DoCjjvbdjuwODaww
+EOcLKvbdVviXvEFH
+EPCjjvbdcImJkGXY
+EPDKjvbdVAbQrqSZ
+DoCjjvbdWWiXudFH
+EPDKjvbdapGfdLzd
+EObkKvbdQwOEDMID
+EPCjjvbdKDKCqKCx
+DncKjvbdJvUfEEgJ
+EObkKvbdDoDLKvcE
+EOcKjvbdqwPkbhyR
+EObjjvbdyTOJNSCH
+EObkKvbdZsiIxdTO
+DoCjjvbdaSFbhTfL
+EOcKjvbdUslsekvK
+DoDKjvbdehLWSORH
+EPCkKvbdBsBDTfWr
+DoCkKvbdMfbpNQVL
+DoCkKvbdezvZFJUX
+EObjjvbdJYUBhMRQ
+DncKjvbdlhcsptqa
+DoCkKvbdiZtfMQnG
+EObkKvbdZRMdhleR
+EPDLKvbdkySrSxgU
+DoCkKvbdYlSDsmkm
+DnbkKvbdkNBkzEfo
+EPDLKvbdyYJKCPzL
+EOcKjvbdqwPkbiZR
+DncLKvbdqdFJQOWB
+DoDKjvbdFyUtaDxC
+DnbjjvbdZyDinDMS
+EOcKjvbdqrVKnKaN
+DoCjjvbdMgDPlotk
+EPCjjvbdUVlPitBR
+DoDLKvbdbsCkTcjB
+EPCjjvbdnGdwlnGy
+DnbkKvbdapGfdLzd
+EPDKjvbddndsKtTr
+DncLKvbdsrrTZZeD
+EObkKvbdqdFJQOWB
+DncKjvbdRadFLhxk
+DnbkKvbdfILWSORH
+DnbkKvbdqZOggQcx
+EPDKjvbdCDpAujMf
+EObjjvbdxsOImSBg
+DoDKjvbdrSUjmjaN
+EObkKvbdrMyjYkhJ
+EObkKvbdANHySvzY
+EObkKvbdgGLynGgA
+DoDLKvbdNdcshiKd
+EObjjvbdePErkTtS
+EPCkKvbdSCEFLhxk
+DoDKjvbdIxUBhLqQ
+EPCkKvbdVvhxWDdg
+EOcLKvbdKfGHbBQu
+DoCjjvbdajlFoNcA
+DoCkKvbdQdDAopdS
+DoDKjvbdSBceMJZL
+DoDKjvbdOStWGdtp
+DoCjjvbdGdLWKBij
+DnbkKvbdvOszpjnt
+DncLKvbdUVlPjTaR
+DoDLKvbdliDsptrB
+EOcKjvbdZisHpHCG
+DoDKjvbdkVwODaxX
+DoDLKvbdfVzwpJzs
+DnbkKvbdDjIKWYKA
+EObkKvbdrJAJdmPF
+EObjjvbdeATpmYJf
+DnbkKvbdQmYByOUz
+EPDLKvbdxmrhXsJD
+EPDLKvbdCJLBjiGK
+DoCkKvbdYpmFJMeR
+DoDKjvbdXnRAXuWU
+DoDKjvbdiMFDmtby
+DnbkKvbddZyQYZQb
+DncLKvbdZtIiYdSn
+EObjjvbdwMvANDdm
+EPDLKvbdIwsbHkqQ
+DncKjvbdURQntthN
+EObkKvbdTqROttgm
+EPCjjvbdTkvOaVni
+EOcLKvbdfNFwHNKL
+EObkKvbdjgflFfOL
+EObjjvbdUQqOuUhN
+DncLKvbdegjurNqH
+EPDLKvbdxUmEqZMO
+DoDKjvbdGcjvKBjK
+DoDKjvbdVTltFkuj
+DnbkKvbdLYqKSztf
+DoDKjvbdUyHtZkOn
+EPDLKvbdvAcyTOdh
+DncKjvbdqFcdsvAh
+DncLKvbdrbFmMHKy
+EOcKjvbdYlRdTnLm
+DoCjjvbdEASJMzXX
+EObkKvbdMoxQvNfs
+EOcKjvbdiHJcYujV
+DnbjjvbdvAcyTPEh
+DoDLKvbdGQASwGfZ
+EObkKvbdMoxRVnHT
+EObkKvbdhgJcYvJu
+DnbjjvbduWOXipsA
+DoDLKvbdQcbaQQdS
+EObkKvbdUsltFkvK
+EPDKjvbdKyQirzuG
+EPCjjvbdmJDtQuSB
+EObkKvbdXrkaMsoY
+EOcKjvbdrEFIpOVa
+EPDKjvbdVqmwadkc
+EOcKjvbdqYoIGqDx
+EObkKvbdtbbtwWOo
+EPCkKvbdSKxfUfkT
+EPCkKvbdmJDsqUrB
+DncKjvbdhaoCeWpq
+EObjjvbdFxuVAdYC
+EPCkKvbdqFcdsvBI
+EPDLKvbdOTUWGeVQ
+EPCkKvbdlhdUQtrB
+DoDKjvbdCJLCLJGK
+EPDKjvbdMgCpMotk
+DnbjjvbdrbFlkgLZ
+DoDKjvbdqBJFAWhE
+EPCjjvbdpyPHfqDx
+EOcKjvbdTlVoBVni
+EPCjjvbdrRtkNkBN
+EPCkKvbdWWhwuceH
+EPDKjvbdcImKKewY
+EOcKjvbdYSlBNToY
+EObkKvbdZRMeIldq
+EPDLKvbdMoxRWNgT
+EObjjvbdMIbMQxAS
+EPCjjvbdQdDBQQdS
+EObkKvbddZyPwxqC
+EOcLKvbdACrXiyiQ
+EPDLKvbdcSbkUEJa
+DncLKvbdTkunaWPJ
+DnbjjvbdvBEYrndh
+EObjjvbdmIctQuRa
+DncKjvbdiUydvqtb
+DoCjjvbdhkdcnUby
+EOcKjvbdePFTLTsr
+EOcLKvbdiHJbxujV
+EObjjvbdZsiJZESn
+EOcKjvbdpxoHfqEY
+EPDKjvbdFyUuBDwb
+DoDLKvbdBiLBkJGK
+EPCkKvbdliDtQuRa
+DoDKjvbdhbOcEwQq
+DncLKvbdRosgJfDw
+EObjjvbdrzMQSaIO
+EObkKvbdUsmTfMVj
+EOcKjvbdWXIxWEFH
+EPCjjvbdcTCjtDjB
+EObkKvbdbBVeGQPw
+EOcLKvbdaSGDHtFk
+DoDLKvbdqFdFUVaI
+EPCkKvbdxxIjBozL
+DncLKvbdNddUIiLE
+EObjjvbduMYWaUAw
+EPCkKvbdWWiXvDdg
+EObjjvbdJXsbILqQ
+DnbkKvbdDnbjjwCd
+DnbkKvbdxUldqZMO
+DoCjjvbdKyRKSztf
+DncLKvbdLFehBaQu
+EPDLKvbdjvXNdBww
+EOcLKvbduaEZTPFI
+DoCkKvbdfMevfmKL
+EPCkKvbdpxoIGqEY
+EPCkKvbdKWUecdgJ
+EObkKvbdmbJwYOmu
+EPCkKvbdIsZArmYM
+DnbjjvbdxLXDgzyf
+DncLKvbdEvYopMjF
+DncLKvbdmJETqVRa
+DnbkKvbdrouoKDWG
+EPDLKvbdbVCGwkTh
+DoDKjvbdZirhPgCG
+EPDKjvbdTvMQKUAq
+DnbkKvbdLrWlzVQz
+EOcLKvbdrEEiPmua
+DnbjjvbdczZQXyRC
+DncKjvbdnUtzKjSG
+EPCjjvbdkNCLzFHP
+DncKjvbdZyEKNbkr
+EObkKvbdJuuFdEgJ
+DncLKvbduCbuXWPP
+EPCjjvbdyNrhXriD
+DnbkKvbdIxTaglQp
+EPCjjvbdJvVFceHJ
+EPCkKvbdVBBprqSZ
+EOcKjvbdkxrqsYgU
+EPCjjvbdGLFSbhMu
+EObjjvbdnPzZWLYb
+EObkKvbdjblLRGuH
+DoDLKvbduaDyTPFI
+EPCjjvbdiifIJmXr
+EObkKvbdYkqctOMN
+EPCkKvbdelfXHMjL
+EPDLKvbdeFOrCWbj
+EObjjvbdeUAUATNW
+EPCjjvbdWRmxBeMD
+DoCjjvbdZxcinDMS
+EOcLKvbdWRmwbElD
+DoDLKvbdpssfrSLU
+DncLKvbdQccApRES
+DoDKjvbdGdKujBij
+DoDKjvbdZLqdTmlN
+DoCjjvbdbiNKLGXY
+DoCjjvbdVZITzKoO
+DoCkKvbdsPuoKCvG
+EPDKjvbdNGbomQVL
+DnbkKvbdkIHMGFnL
+EPDKjvbdvPTzpjoU
+EOcKjvbdczZPxZQb
+DncKjvbdliEURUrB
+DnbkKvbdGZUtaDxC
+EPCjjvbdrMyjZLhJ
+EPCjjvbdTulPjTaR
+DoCkKvbdZeYGzhJC
+DncLKvbdwygefYEr
+DnbjjvbdehLVrOQg
+DnbjjvbdZxcjNblS
+DoCjjvbdSLYetgKs
+EPCkKvbdVAbQrpqy
+EPCjjvbdtTSTZZdc
+DnbkKvbdSCEFMIyL
+DoDKjvbdrDeJPmvB
+EOcLKvbduDDVXVno
+DoDLKvbdZdxGzhIb
+EObkKvbdhgJbxujV
+DncLKvbdlYsRsZHU
+DoDLKvbdhzUelQmf
+EObkKvbdWWhwvDeH
+EPCjjvbdjgfkfFmk
+EObkKvbdzaAPHGal
+DoDLKvbdEPDLLXDE
+DoCjjvbdTukpKTaR
+EOcKjvbdhaoCeWpq
+EPDKjvbdwjvdHzzG
+EPDLKvbdJTZBTNYM
+DoDLKvbdRECaPqDr
+DncKjvbdjhGkfGNk
+EObkKvbdjhGkfFmk
+DncLKvbdqlyixkhJ
+EObkKvbdjEkHUoAO
+EPCkKvbdcasMrAUN
+EObjjvbdhzUfLqOG
+DoCkKvbdEvYopNKF
+EPCjjvbdjuwODaxX
+DncLKvbddiirWUzn
+EObkKvbdOStVfduQ
+DnbjjvbdypnmIjXA
+DnbjjvbdRWnEClHc
+EOcLKvbdbhljLFvx
+EPDLKvbdJXsaglRQ
+EObkKvbdhzUfLqOG
+EObkKvbdnPyxujyC
+DoDKjvbdBiKajiFj
+DoDKjvbdZjTHpHBf
+EPCjjvbdaSFcITek
+EObjjvbdYzcFqiuy
+DncLKvbdqdFIpNvB
+DoDKjvbdLYqJrzuG
+DoDLKvbdVwJXucdg
+DnbjjvbdhbObdvqR
+DoCkKvbdCEQBWJlf
+DoDLKvbdSCDdlJYk
+EPDLKvbdZyEJnCkr
+DoDKjvbdvAcyTOeI
+DoDKjvbdkIHLfFmk
+EPCjjvbduaEYroFI
+DnbkKvbdjblKpgUg
+EOcKjvbdwygefYFS
+EOcKjvbdliDsqUqa
+DnbjjvbdjcMLRGtg
+EObkKvbdRbEElJYk
+EPCkKvbdqrUkNjaN
+EOcLKvbdRotGifDw
+DnbkKvbdUsmUGLuj
+DoCjjvbdeKJqvUzn
+EPDKjvbdQwNdClHc
+EOcLKvbdcScLTcjB
+DoCjjvbdvBDxroEh
+DoDLKvbdIxUBglQp
+EPDLKvbdfVzxQJzs
+DncLKvbdqlzKYlIJ
+DoDKjvbdaNLCSuMg
+EOcKjvbdwjwDgzyf
+EPDKjvbdIxTaglRQ
+DoDKjvbdVTltGLuj
+DoCkKvbdiMFENuDZ
+EOcLKvbdZyEJnDMS
+DnbkKvbdiBoCeXRR
+EPCkKvbdbiMijewY
+EOcKjvbdmttzLJqf
+DncKjvbdYTLaMtOx
+EPCjjvbdfIKuqmqH
+DoCjjvbdBdQBVjNG
+EObkKvbdieLGuPAO
+EPDLKvbdsZlQSaIO
+DnbkKvbdEztQeMDJ
+EPCjjvbdIjEAJpHE
+EOcLKvbdfILWRmpg
+EPCjjvbdZyDinDLr
+DncKjvbdLGGIBaRV
+DncLKvbdmozZWLZC
+DoCkKvbdlZSrSxft
+EOcLKvbdFjdrcINV
+EOcKjvbdQvnDblHc
+DoCkKvbdqUUHRqkU
+EPDKjvbdnBjWwnmu
+DoCjjvbdZxcjNbkr
+DncKjvbdZisIQHCG
+DoCkKvbdJcJcRJbx
+EPDLKvbdlhdUQtqa
+DnbkKvbdrzLpSaHn
+DoDKjvbdziuPpDrt
+EPDKjvbdEYXlTtUM
+EObkKvbdqdFIpOVa
+DncKjvbdpxnhHQdY
+DnbkKvbdLhakqYAS
+EPCkKvbdrRtkNkBN
+EObkKvbdqrVKmjaN
+EOcKjvbdxUldqZMO
+EOcKjvbdrbFllHKy
+DoCkKvbdySmhlrBg
+EPCkKvbdkxrqsYgU
+EPCkKvbdZLqcsnMN
+DncKjvbdFpATXHFy
+EPDLKvbdZRMdiMeR
+EPDLKvbdRNXbYmtz
+DoCkKvbdpyPIGqEY
+DoDLKvbdKaKfmCYR
+EPDLKvbdrylPsBIO
+EObjjvbdUQqOuVHm
+EPCkKvbdezvZFItX
+EOcKjvbdZirhQHCG
+DoDKjvbdePFSjssr
+EOcKjvbdCTAcTfXS
+EOcKjvbdkxsRsYft
+EPDLKvbdQwODcMHc
+DoDKjvbdwuNFRZMO
+EPCjjvbdEuyPomKF
+DoCkKvbdpxnhGpcx
+DncKjvbdiVZeWrUb
+EOcKjvbdrEEiPmvB
+EOcLKvbdZxdJnDLr
+EObjjvbdUtNUFkvK
+DoDLKvbdZQmFIldq
+EObjjvbdnCJvwnmu
+EPCkKvbdRWmccLgc
+DnbkKvbdnUtykJqf
+DnbkKvbdVBBqSpqy
+EPCkKvbdZoOIddyj
+DnbkKvbdZQldiNFR
+DncLKvbdmRyVZsDi
+DoCjjvbdcasMrATm
+EOcLKvbdtbbtvuno
+DoDLKvbdZtJJYdSn
+DnbkKvbdGKeTDHlu
+DoCkKvbdZjTHpGbG
+EOcKjvbdHDjvKCKK
+EObjjvbdddnqbXCj
+EObkKvbdlZTSTYgU
+EPCjjvbdqqtjmkBN
+EObjjvbdtAGqIAAr
+EObkKvbdrRtjmjaN
+DnbjjvbdMRwMytpz
+EPCkKvbdsQWPJbuf
+DoDKjvbdqFceUWBI
+DoCkKvbdnBjWxPNu
+DoDLKvbdiUzFXRuC
+EObkKvbdQccBPqES
+DnbjjvbdOFDtIiLE
+EPDKjvbdYlRcsnMN
+DncKjvbdFfJrNhsq
+DoCkKvbdsCFmMHKy
+EPDLKvbdYkrETnMN
+DoCjjvbdYNqAXuWU
+EPDKjvbdrovPKDWG
+DoDLKvbdbKlGOmcA
+DoCkKvbdOStWHFVQ
+EObjjvbdhbObeXQq
+EPCjjvbdeEnrBwDK
+DoDLKvbdrbFmMGkZ
+DncKjvbdxZhGGYFS
+EPDKjvbdbrbkTdKB
+EPDKjvbdraellGkZ
+EPCkKvbdssSTZZeD
+EPDKjvbdDjHiuxKA
+DoCjjvbdzoPqFDMY
+EPCjjvbdlAlnmALA
+DoDKjvbdmtuZjjRf
+DoDKjvbdFpASvfey
+DoCkKvbdjlakyeGo
+DoDKjvbdxnSgxTIc
+EPCjjvbdxZhFfXeS
+EPCkKvbdqcdiPnVa
+EOcLKvbdmfeYMnHZ
+DoDLKvbduCbuWvOo
+DoDKjvbdmIcsqUqa
+EPDKjvbdzoQQdblY
+DoDLKvbdRNXayOUz
+DnbjjvbdrJAKFNOe
+DnbjjvbdZLrEUOMN
+EOcKjvbdwygeexEr
+EPCkKvbdbVBfwjtI
+EObkKvbdKDKDRJbx
+DoCkKvbdGckWKBij
+EOcKjvbdzjVQPdSt
+EPDLKvbdqlzKYkhJ
+DnbjjvbdajkennDA
+DoDLKvbdRzJgsCvA
+EObjjvbdehKuqmqH
+DncKjvbdajlFnnDA
+DnbjjvbdjEkHUoAO
+DoCjjvbdFVyPomKF
+DoCkKvbdJcJbpjCx
+DnbkKvbdRaceLiZL
+EPDKjvbdeEnrBwDK
+DoDLKvbdxKvdHzyf
+DoCkKvbdSPtHKFcw
+EObkKvbdjhHMGGOL
+EOcLKvbdGGJqnItR
+DoCjjvbdnGdxNNgZ
+DoDKjvbdbKkfOmcA
+DnbjjvbdelewHNKL
+EPCkKvbdcSbjsdJa
+EPCkKvbdTAEhgbOd
+DncLKvbdUslselVj
+DnbjjvbdVrOYBeMD
+EObjjvbdEzspeMDJ
+EPCjjvbdcTDLTcjB
+EPDLKvbdsPvPJbuf
+EOcKjvbdqGEFUWBI
+EPDKjvbdVgxWYGxz
+EOcLKvbdSPtGjGDw
+EObkKvbdGckVibJj
+DoDLKvbdeEoSCWcK
+EPCkKvbdQvmdClID
+DncLKvbdhytelROG
+EPCkKvbdeXzTtSFz
+EPCkKvbdrXQMDIxq
+EObkKvbdtlXvaUAw
+DnbkKvbdiMFDmtcZ
+EPDLKvbdJqZeOfNe
+EPDLKvbdmIdUQtrB
+DoDKjvbdVTltGLvK
+DncLKvbdZRNEhleR
+EPDKjvbdjlakydfo
+DnbjjvbdFpASvfey
+EPCkKvbdkySrTYft
+EOcLKvbdVUMtGMVj
+EPDLKvbdmRyUysDi
+EPCkKvbdGKeScHlu
+EObjjvbdczZPwyRC
+EPDLKvbdVYhUZkOn
+DncLKvbdJbibqKDY
+EPDLKvbdfekzNfgA
+EObkKvbdKQydoGOF
+EObkKvbdVgwvXfxz
+DncLKvbdQdDApQcr
+DncLKvbdGFjRnJUR
+DncKjvbdjgflFemk
+DoDKjvbdlhctRVSB
+DncLKvbdZLqctOLm
+DncKjvbdfSAvzlCo
+EPDKjvbdZRMeIleR
+EObjjvbdZRMeJMdq
+EOcKjvbdMuTSKmAX
+DncKjvbdqYngfpdY
+DnbkKvbdxrmiMqbH
+EObjjvbdbPgGckzd
+DoCkKvbdpstGqqkU
+DncLKvbdmJDsqVSB
+EPDLKvbdtunYKQsA
+EObkKvbdDnbkKwCd
+EPDLKvbdEXwkstUM
+DoDKjvbdrRtkNkBN
+DncLKvbdIwtCIMQp
+EPDLKvbdZQmEhmEq
+DnbkKvbdxmrhYTIc
+DoCjjvbdCSaDUGWr
+EPCkKvbdatagXkUI
+DncLKvbdEPDKkWcE
+DncKjvbdZjShPgBf
+EPDKjvbdHDkVjCJj
+DoCjjvbdsrrTYzEc
+EObjjvbdhlEcnUby
+DnbjjvbdemFvfmKL
+EObkKvbdlhcsqUqa
+DoCkKvbdZtIiYdTO
+EObkKvbdEXwlTssl
+DoDKjvbdhaoCdvqR
+EObkKvbdliEURUrB
+DoDLKvbdEYXkstTl
+DncKjvbdFkEsDINV
+DoDKjvbdFkErcHmV
+DoDLKvbdKCjCpjDY
+EPCjjvbdjJegjMxS
+DnbkKvbdnCKWwnmu
+DnbjjvbdqwQLbiYq
+DoDLKvbdSZigsDWA
+EObjjvbduVnYKRTA
+EOcKjvbdTlWOaVoJ
+DnbjjvbdSCDeMJYk
+DnbkKvbdQvmdClID
+EPCkKvbdziuQPdTU
+EOcLKvbdhficZWJu
+EOcKjvbdZLqdTmkm
+DoDKjvbdcImKKevx
+EOcLKvbdGFirOJUR
+EObkKvbdREDApRES
+DoDKjvbdHELWKBij
+EOcKjvbdrSVLNkBN
+EOcKjvbdBdQBWJlf
+DoCjjvbdFpATXHGZ
+DnbjjvbdqZOhGpdY
+EPDLKvbdCSaDUGWr
+DoDLKvbdrpWPJcWG
+DnbjjvbdZsiJYdTO
+EPDKjvbdJvVGEFGi
+EPCkKvbdmIctRVSB
+DncKjvbdBiLCKhfK
+DoCkKvbdZisIQGbG
+DoCjjvbduWNwjQsA
+EOcLKvbdiHKCyVjV
+EPCjjvbdlZSrTZGt
+EObjjvbdNPxRWNgT
+DncKjvbdeAURNXif
+DncLKvbdOStWGeVQ
+DoCjjvbdJvUeceGi
+DoDKjvbdXsMBMsnx
+EPDKjvbdGLFSbhMu
+EPDLKvbdEvZPolie
+EOcKjvbdrRtjnLBN
+EPDKjvbdyOTHxTJD
+EPDKjvbdmajWwnmu
+EPCjjvbdrNZjZLhJ
+DncKjvbdajlFoODA
+DoDKjvbdrEFIpOVa
+DnbkKvbdpedEtWBI
+DncKjvbdqwQMChyR
+DnbjjvbdnCKWwnnV
+DoCjjvbdNUsRkNAX
+EOcLKvbdULvPBWPJ
+DncLKvbdjlalZdfo
+EPDKjvbdjJfHjNYS
+DoDKjvbdPxmAHTSK
+DnbkKvbdmIctQtqa
+EObjjvbdnHFXmNfy
+EPCkKvbdqlzJyLhJ
+DnbjjvbdVqnYCElD
+EPDKjvbdqTsgRqkU
+EPCjjvbdADSYKZhp
+EPDLKvbdEvZPoljF
+DoCkKvbdLFfICBRV
+EOcLKvbdZRNFJNFR
+EPDKjvbdpedFUWBI
+EPDKjvbdVwJYVceH
+DoCjjvbdGYtuBDwb
+DoCjjvbdVYgtZjoO
+DncKjvbdQccApQcr
+EOcLKvbdWWiYWDdg
+DncKjvbdyTOJNSBg
+DnbjjvbdbAueFpQX
+DnbkKvbdiUydwSUb
+DoDKjvbdKVtfDeHJ
+DoDKjvbdEObjkXCd
+EOcKjvbdqlyjYlHi
+EOcKjvbdfRaWzlCo
+EObjjvbdRWmcblID
+DoDLKvbdCDpAvKMf
+DncLKvbdmuVZjjSG
+EPDLKvbdkaMnmALA
+EPCkKvbdcSbkTdKB
+DnbjjvbdZtJIyESn
+EPCkKvbdQvmccMHc
+DncLKvbdfHjvRmpg
+DoCjjvbdVvhwvEEg
+EPCjjvbdXrkaNTnx
+DnbkKvbdGFirNiUR
+EObkKvbdZLrDsnLm
+EObkKvbdySnJNRbH
+DncKjvbdaMkBsUmH
+EPCkKvbdqGEFUWBI
+EObjjvbdmajXYOnV
+DnbkKvbdHELWKBjK
+EPDKjvbdWSOYCFLc
+DncLKvbdehKurNqH
+EPDLKvbdSZjIScWA
+DncKjvbdZQldiNEq
+DncLKvbdVwIwvEEg
+DnbjjvbdauCGxKsh
+DnbkKvbdKefHbApu
+DoCkKvbdssSTYyeD
+DnbjjvbdSPsgJfEX
+DoCkKvbdeKKRvUzn
+DoDLKvbdiMEcnVCy
+DoDLKvbdoAKzsgcn
+DoDKjvbdDoDKjvbd
+DncKjvbdFWYopMie
+EPDLKvbdRNXaxmtz
+EOcLKvbdKefHaaRV
+EPDKjvbderAvzkbo
+EObjjvbdzoQREcMY
+DnbkKvbdijFgjMwr
+EObjjvbdhbObdvqR
+EPCkKvbdySmiMqbH
+EObkKvbdyzeOSIIh
+DnbkKvbdjcLkRHUg
+DoDLKvbdJpydoGNe
+DoDKjvbdwXMBWBWV
+EObkKvbdsBfMkgKy
+DnbkKvbdYkqdTnMN
+EPCjjvbdEPDLLWbd
+EObkKvbdDwxLtUUM
+DncKjvbdNrtVgFUp
+EPDKjvbdZQleJNFR
+EPDKjvbdJKEAKPfd
+DnbjjvbdhgKCxvJu
+EObkKvbdLAkHMbXq
+EPDKjvbdhancEvqR
+DoCjjvbdNsUWHEuQ
+DnbkKvbdZjTHofaf
+EPCjjvbdrDdiQOVa
+EPDKjvbdkMbLzEgP
+EPCkKvbdZoOJFEyj
+EPCkKvbdADRxJyhp
+EObjjvbdaSGCgsfL
+DnbjjvbdJbjDQibx
+EPCjjvbdpfEEtWBI
+EOcLKvbdZxdJmblS
+EPCkKvbdRpTgKGEX
+DoCjjvbdzRPNIiwA
+EObkKvbdzoPpeClY
+EObjjvbdeFOrBwDK
+DoCkKvbdOTTvHEtp
+DnbjjvbdGQATWgFy
+EPCjjvbdEvZQQNJe
+EObkKvbdjvWnECYX
+DoDLKvbdyTOIlqag
+DnbkKvbdEASJNZvw
+EOcKjvbdsZkosBHn
+DoDLKvbdtSqsYyeD
+DncKjvbdqlyixkgi
+EPCjjvbdTppnuVHm
+DncKjvbdatbHYKsh
+DoCkKvbduVmwjQsA
+EPCkKvbdvAcxsOeI
+EObkKvbdRjyFuHLT
+EObjjvbdTukoitAq
+EOcLKvbdkySqrxft
+EObjjvbdQccBPpdS
+DoDKjvbdffLzNfgA
+DoDKjvbdiCOcEvqR
+DncKjvbdIBkzEzAD
+EObjjvbdVZHsyjoO
+EOcLKvbdZoNheEzK
+DnbkKvbdsZkpTAhO
+DnbjjvbdqFdEtVaI
+DnbkKvbdIGfzZXwg
+EPDLKvbdlrZVZsEJ
+EObjjvbdBcpAvJmG
+DnbjjvbdtSqsYzFD
+EPDLKvbdJJdAJogE
+DncKjvbdxVMdpyMO
+EPCjjvbdQwOEDLhD
+DoCjjvbdmgFXmNgZ
+DoDLKvbdjEkGuPAO
+EPCjjvbdACrXjZiQ
+DoCjjvbdZMRdTmlN
+DncLKvbdiLeDnVDZ
+EObjjvbdVAaprpqy
+DoDLKvbdRjyFuGjs
+DnbjjvbdVAbQrprZ
+EObkKvbdSZjHrcWA
+EPDKjvbdVrOYBeMD
+EPDLKvbdDwxMUTsl
+EPDKjvbdRadElIxk
+DnbjjvbdmozZWKyC
+DoDLKvbdptTgRrKt
+EPCjjvbdatagXkUI
+DncLKvbdZLqcsnMN
+DoDLKvbdfNFwGmJk
+EObkKvbdqTsfrSKt
+DncLKvbdZjTHpGbG
+DoCjjvbduWNwipsA
+EPDKjvbdauCGwkTh
+DncLKvbdKVuGEFGi
+EObjjvbdZirhPfaf
+DoDKjvbdxKvcgzyf
+DnbkKvbdxsNhlrCH
+DoCkKvbdBsBDUGWr
+DncKjvbdfMfXHNJk
+DnbjjvbdOSsugFVQ
+DncKjvbdZisIPfaf
+DnbjjvbdZHXEAOsJ
+DnbjjvbdLZRJrzuG
+EObkKvbdwuNFQxlO
+DncKjvbddxZtURez
+EPCkKvbdxrmiNSCH
+DoDKjvbdiUydwSVC
+EObjjvbdiifIJlwr
+DncLKvbdssSSxyeD
+EPDKjvbdOEcsiJLE
+EOcKjvbdySnIlrBg
+EPCkKvbddZyQYZRC
+DnbjjvbdWXJXudEg
+DoDLKvbdKaLHNCXq
+DoDKjvbdGGKRmiTq
+DnbkKvbdlrYtyrdJ
+EPDKjvbdhtzEvrVC
+EObkKvbddZyQYYqC
+DoDLKvbdhaoCdwRR
+EPCkKvbdxLWdHzyf
+DoDKjvbdySmhmRbH
+DnbkKvbdZLqcsmlN
+EObjjvbdZtJIxdTO
+DoDKjvbdDwwksssl
+EPDKjvbdFyVVAdXb
+DoCkKvbdUtNUFkvK
+EPDLKvbdxmsIXsIc
+EPDLKvbdUsmUFkuj
+EOcKjvbdGKdsDHlu
+EOcKjvbdACqwjZiQ
+EPDKjvbdFpASwHGZ
+DoCkKvbdGZUtaDxC
+DncKjvbdmSZVZsEJ
+DoCjjvbdJbicRKCx
+DncLKvbdTvMQJsaR
+DoCjjvbdNeDtJJKd
+EPCjjvbdnPzYvKxb
+DoDLKvbdyTNhlrCH
+EPDKjvbdRosgJecw
+EObkKvbdTAEiICOd
+EOcKjvbdapHHDkzd
+DoCkKvbdjlakzFGo
+DncLKvbdrpWPJbuf
+DnbjjvbdNQXqVnHT
+EOcLKvbdkNCLzFHP
+EObjjvbdTukpKTaR
+EOcLKvbdEuxpPlie
+EPCkKvbdJuuFdFHJ
+EPDKjvbdGGJqmiTq
+DnbjjvbdOAIrtJrA
+DnbjjvbdelfWgNKL
+EObkKvbdhbOcEwRR
+DncLKvbdqiAKFNPF
+DncKjvbdVqnYCFMD
+DoDLKvbdWHxWXgYz
+EOcLKvbdNVTSKmAX
+EPDKjvbduaDySndh
+DnbkKvbdiifIJlxS
+EPDKjvbdeATpmYJf
+DncLKvbduCcVWuoP
+EPCjjvbdhficYvJu
+DncKjvbdehLVqnQg
+EPCkKvbdrDeJPmua
+DoCjjvbdTfzmlWue
+DncKjvbdZoNiFEyj
+DoDLKvbdxmsHxSiD
+EObkKvbdVwJYVdFH
+EPCjjvbduMXwBUBX
+DnbkKvbdTqROuVIN
+EPCjjvbdGKeTCglu
+EPDLKvbdcyyPwxpb
+EPDLKvbdQmXayOUz
+EPDLKvbdZyDinCkr
+EPDLKvbdZoNheEyj
+DncLKvbdmfdxMnGy
+DnbkKvbdkClLRGuH
+DncLKvbdJXsbIMQp
+DnbjjvbdjJegilxS
+DoCkKvbdnPyxukZC
+EPDKjvbdZMRcsnLm
+DoCkKvbdHffzYxYH
+DnbkKvbdbsDLTcjB
+DoDLKvbdSwjlNzjx
+DncKjvbdkaMnmALA
+DncLKvbdqmZjZLhJ
+DoDKjvbdqrUkNkBN
+DncLKvbdmfeXmOGy
+EPCjjvbdZMRdTmlN
+DnbkKvbdypnlhjXA
+EPDLKvbdyOTHxTJD
+EObjjvbdMRwMzVQz
+EPCjjvbdSCDeMIxk
+EObjjvbdOXnuzdOU
+EPDKjvbdOStWHFVQ
+DoDLKvbdrzLpTAgn
+DnbkKvbdULuoAvPJ
+EPDKjvbdZxdKODMS
+EOcKjvbdbAvEfPpX
+DncKjvbdyOSgwriD
+EPDLKvbdrJAJdmPF
+EPDLKvbdauCGxKtI
+DncLKvbdqrVLOLAm
+EPDKjvbdkHgLfFmk
+DncKjvbdUaCRSqSZ
+DnbkKvbdbQGgELzd
+EOcKjvbdcJMijfXY
+EPCkKvbdeOeTLUTr
+EOcKjvbdQmYByNtz
+EPDLKvbdFxuVBDwb
+EOcKjvbdGGJrNiUR
+DoDKjvbddndsLTtS
+EOcLKvbddZyPxYqC
+EPCkKvbdSKxfVHLT
+EOcKjvbdSCDdkiYk
+DnbjjvbdtvNwjQsA
+EOcKjvbdJXsbILqQ
+EObjjvbdjcLkRHVH
+EObjjvbdkCkkQgUg
+DoCjjvbdTqQnttgm
+EPCkKvbdEuyPoljF
+DoCkKvbdTqQnuUgm
+DoDLKvbdLrWlzVQz
+EPCjjvbdRjyGVGkT
+DoDLKvbdHEKvKBjK
+DoCjjvbdnCJvxOnV
+EObkKvbdptUGrRkU
+EPDKjvbdQwNcblID
+DoCjjvbdIidAKPgE
+DoCjjvbdTYLMNzkY
+DnbjjvbdEztRFMCi
+EObkKvbdBhkCLJGK
+EPDLKvbdZisHpGbG
+EPDLKvbddePRbXDK
+EObkKvbdUQpntuIN
+EObjjvbdEPCjjvcE
+DncKjvbdbiNJjewY
+EPDLKvbdVrOYCElD
+EPCkKvbdSBdElIyL
+DoDLKvbdzjVQQETU
+DoCjjvbdCDpAvKNG
+EObkKvbdNHComPuL
+EOcKjvbdGdKvJaij
+DnbkKvbdqmZjYkgi
+DncKjvbdQvnEClID
+DncLKvbdWWiXudFH
+DoDLKvbdCEQBWJlf
+DncKjvbdMpXqWOGs
+EPDKjvbdVBCRSqRy
+EPDLKvbdqUTgSRjt
+EOcLKvbdJXtCHkqQ
+EObkKvbdBiLBkJFj
+EOcLKvbdVvhwvEEg
+EOcKjvbdCTBCsewS
+EOcKjvbdyNsHwriD
+DoDKjvbdwzHfFxEr
+DnbjjvbdypoMiJwA
+DoCjjvbdJbicQjCx
+EOcLKvbdVUMsekuj
+EOcKjvbdCEQBWJlf
+EObjjvbdIjEAKQGd
+DoCjjvbdDjIJvXjA
+DoDLKvbdFyUuAdYC
+DncLKvbdRotGiedX
+DoCjjvbdBhkBjhej
+EOcKjvbdBhkCKhfK
+EPCkKvbdLFfHbBRV
+DoCkKvbdNUrrLNAX
+EOcKjvbdZoOIeEzK
+EPCjjvbdkMbMZeHP
+DoCjjvbdkVwNdBxX
+EPCkKvbdNddThiKd
+DnbjjvbdjcLkQftg
+DnbkKvbdFkErcHmV
+DnbjjvbdqGEEtWAh
+DncKjvbdmSYuZsEJ
+DoCjjvbdUsmTfMWK
+DoCkKvbdVUMtFkvK
+EOcKjvbdKfGICBRV
+DnbkKvbdMSWlzUpz
+EOcLKvbdVBBprpqy
+EPCjjvbdnHEwmNgZ
+DoCkKvbdeEoRawDK
+DnbkKvbdpssgSSLU
+DncKjvbdOSsugFUp
+DnbkKvbdwzHfGYFS
+DoCjjvbdTAEiHbPE
+EObkKvbdKaLGmCXq
+DnbkKvbdCWzciFQW
+DncLKvbdnVVZjiqf
+EPCjjvbdOStWHEtp
+DoDKjvbdkIGkfFmk
+DoDKjvbdZjTIPfbG
+EOcKjvbdXsMAlsnx
+DnbjjvbdILazmwRL
+EOcKjvbdrDdiPmvB
+EPDKjvbdiUzEwRuC
+EOcKjvbdqAheAXHd
+EPCjjvbdRyigsCvA
+DoCjjvbdpyOggQcx
+EPCkKvbdZyDjNblS
+DncLKvbdFejSNiTq
+EPDKjvbdzRPNIjXA
+DncLKvbdaMkBsVMg
+EObkKvbdLYqJrzuG
+DncKjvbdsBfNMHLZ
+EPDKjvbdjgflFfOL
+DoDKjvbdCTAcUGWr
+DnbjjvbdSLZGVGkT
+DoCkKvbdZQmEhldq
+EPDKjvbdUsmTfMWK
+DoCjjvbdKefICBRV
+EPCjjvbdZMSDsnMN
+EObkKvbdwzIGGXdr
+EObjjvbdrRtjnLAm
+EPDKjvbdXrlAmTnx
+EPCjjvbdZtJJZETO
+DnbjjvbdieLGtoAO
+DnbkKvbdnCJvxPOV
+EPDKjvbdjKFgjNYS
+DoCkKvbdlhcspuRa
+EPDKjvbdbAvEfQPw
+EOcLKvbdiGjDYuiu
+DncKjvbdnQZxvLZC
+DoDLKvbdaogHDkzd
+DnbjjvbdMfcQMouL
+DncKjvbdKaKgMbYR
+DncKjvbdrbGNMHKy
+DoCkKvbddoFSjtUS
+EPDLKvbdNddTiIjd
+EPDKjvbdhgKDZViu
+EPDLKvbdkMbLzEfo
+DoDKjvbdjmCMZdfo
+DoDKjvbdSCDeLhyL
+DoCkKvbdQwODcMID
+DnbkKvbdgGLymgHA
+EPDKjvbdWIYVwfxz
+DnbkKvbdZLqdUNkm
+DoCkKvbdYlSETmkm
+DnbkKvbdLqvlyuQz
+DnbkKvbdZRMdiMdq
+EOcLKvbddePSCXCj
+EPDLKvbdRacdkiYk
+DnbjjvbdZisIQGbG
+EObjjvbdrpVnibvG
+DncLKvbdIxUCHlRQ
+EPCkKvbdhuZeXRtb
+DnbjjvbdQwODblID
+DoDKjvbdezuyEhsw
+DncKjvbdiLddNtcZ
+EPCkKvbdiLeENtby
+DnbjjvbdxKvcgzzG
+EPDLKvbdRXNdClID
+DncLKvbdEKHjVwjA
+EOcLKvbdzoPqFCkx
+DoDLKvbdliEURUqa
+DoCjjvbdyOTIYTJD
+DncLKvbdIHGyyXwg
+EPCjjvbdShyjRABM
+DoCkKvbdnPyyWLYb
+EObjjvbdsPvPJcVf
+EPDKjvbdTXjlNzjx
+DoDKjvbddneTLUUS
+EOcKjvbdmuUyjiqf
+DncKjvbdZoOIddzK
+DoCjjvbdpyOhGqEY
+DoCkKvbdwjwDgzyf
+DnbkKvbdxZgeexEr
+EOcLKvbdHDjvKCKK
+DoCkKvbdpxnhHQdY
+DoDLKvbdLrWlzUpz
+EPDKjvbdatbHXkTh
+DoDLKvbdZyDinDLr
+EPCjjvbdGGJqnJTq
+DoDKjvbddneTLTsr
+DncLKvbdyzdmqhJI
+EObkKvbdRjxfVGkT
+EPDKjvbdOAJTTirA
+EPCjjvbdZoNiFEzK
+DnbjjvbdOhAXyAYa
+DnbjjvbdACqwizIp
+DoDLKvbdcImJjevx
+EPDLKvbdxmrhYTIc
+DoDLKvbdjcLkRGuH
+EPCkKvbdxVNEpxlO
+EPCkKvbdKCibqJbx
+DoCkKvbdjJfIKMxS
+DoDLKvbdVYhUZjoO
+EPDLKvbdrJAKEmPF
+EOcLKvbdRDbaQRDr
+DoCkKvbduWOXiqTA
+DoCjjvbdZyDjNcLr
+EObjjvbdbBWEeoow
+EPDLKvbdUQpnttgm
+EOcKjvbdlBNOmALA
+DnbjjvbdSPsfiecw
+DnbjjvbdwzIGGYFS
+EOcKjvbdLGFgaaRV
+EOcKjvbdrXQLcJYq
+DnbkKvbdmbKXYPOV
+DoCkKvbdZisHogCG
+EPCkKvbdFVyPpMjF
+EOcKjvbdYkrDsmkm
+DoDKjvbdxUmEqYlO
+EPDKjvbdKNAEZgUa
+DoDLKvbdqZPIGpcx
+DoCjjvbdMgComPtk
+EObjjvbdUyHszKoO
+DoCkKvbdeEnqavcK
+EPDKjvbdqYoIGqEY
+DoDLKvbdCDoaWJmG
+EPDLKvbdlZSrTZHU
+EPCkKvbdZxcinDMS
+DoCkKvbdgFkzNfgA
+EOcKjvbdYNqAXtvU
+EObjjvbdwygefYEr
+EPCkKvbdbBVdfQQX
+DnbkKvbdqrVLOLAm
+EOcKjvbdFjeTDINV
+DnbjjvbdnHFYMnGy
+EPCjjvbdrbFllHKy
+EPCjjvbdZLrDtOMN
+EPDLKvbdcJNKKfWx
+DoCjjvbdraemMHLZ
+DoDKjvbdeJjSWUzn
+EPCkKvbdZnmiEdyj
+DnbjjvbdwtleQxlO
+DnbkKvbdDwwlUTtM
+DoDKjvbdrWpMDJZR
+EOcKjvbdegkVrORH
+EPCkKvbdiCOcFWqR
+DnbkKvbdBsBDTevr
+DoCjjvbdjcLjpfuH
+DnbjjvbdZxdKODLr
+DoCjjvbdqceIpOVa
+DoDLKvbdVvhxVceH
+EObkKvbdsrqryZdc
+DnbkKvbdMSWlytpz
+DoDLKvbdqTsfqrKt
+EPCjjvbdjKGIKNYS
+EOcLKvbdiGibxvKV
+EPCjjvbdKDKCpibx
+EPDKjvbdQdDBPqDr
+DncKjvbdozmdLYPA
+DoCkKvbdTvLojUAq
+DnbkKvbdbhmKLFwY
+EPDKjvbdCIjbLIej
+DncKjvbdkHfkeenL
+DoDKjvbdtAGqIABS
+EPCjjvbdRosfjFdX
+EOcKjvbdraemLgLZ
+DnbkKvbdxmrgxTIc
+DoCkKvbdOAJStJrA
+EPCjjvbdqYngfpdY
+EPDLKvbdBvzdJEov
+DoDKjvbdrDeIpOWB
+EObjjvbdqUTfrSKt
+EOcKjvbdxnShXsIc
+DoDKjvbdEzsqFLcJ
+EObjjvbdDxYMUUUM
+EOcKjvbdjKFhKNYS
+EOcKjvbdjgflGFmk
+DoCkKvbdGGKRnItR
+EPCkKvbdREDApRDr
+EOcLKvbdNQYRWOHT
+EPCjjvbdxmrgwriD
+DncLKvbdbsCjsdJa
+EOcKjvbdypoNIiwA
+DncKjvbdZoOJFEyj
+DoCjjvbdrbGMkgKy
+EPDKjvbdyTNiNSBg
+DoCjjvbdczZPwyQb
+DoDKjvbdWfZZtAOs
+EPDKjvbdznoqFClY
+DncKjvbdTlVoBVoJ
+EPCkKvbdIxUBhMRQ
+DoCkKvbdZQmEiNEq
+DoDKjvbdnVUykKRf
+DnbjjvbdUtMtFlWK
+EObjjvbdOTUVfeUp
+DoCjjvbdZMSEUOMN
+DoCjjvbdwjwDgzzG
+DoDKjvbdYqNEiNFR
+DoDLKvbdqiAKEmOe
+EPDLKvbdfNGXHNJk
+DnbjjvbdCEQBVjMf
+EObkKvbdqUUGrRjt
+DnbkKvbdjmCLyeHP
+DnbjjvbdcJMikFwY
+EPCjjvbdjuwNdBxX
+DoCkKvbdeqaWzkbo
+DncKjvbdTkvOaVoJ
+DoDKjvbdZoOIeEzK
+DoDLKvbdKDKDRKDY
+DncLKvbdqwQMDJYq
+EObkKvbdKeegbBRV
+EPDKjvbdegjuqnRH
+DoDKjvbdxwhjBpZk
+EObjjvbdziuQPdSt
+EPCjjvbdZyEKOCkr
+EPCjjvbdRWmdCkhD
+EOcLKvbdQcbaQRES
+DncLKvbdIrxaTNYM
+DnbjjvbdGFiqmiTq
+DoCjjvbdZeXfzghb
+DoCjjvbdSLZFuGkT
+EPDKjvbdIryBSmYM
+EOcLKvbdRyjHsCvA
+EPDKjvbdzoPqFCkx
+EPDLKvbdFeirOIsq
+EObkKvbdLiBkpxAS
+DoCjjvbdmuUyjirG
+EOcKjvbdpfDeTuaI
+DncLKvbdtSqsYyeD
+EOcLKvbdAMhYrwZx
+EOcKjvbdJSyAsNYM
+DncLKvbddneTLTsr
+EPDLKvbdANIYsWyx
+EObkKvbdRXODblHc
+DoCkKvbdYzcGRjWZ
+DoDLKvbdkHgLfFnL
+DoCkKvbdpyPIGqDx
+EObkKvbdwuNEpxkn
+DoDLKvbdJSxaTNYM
+DoDLKvbdRNXbZOUz
+DnbjjvbdNHDPlpUk
+EObjjvbdKQzFPFnF
+EOcKjvbdwkWdHzzG
+EObkKvbdiCPCdvpq
+EPCkKvbdwzHfFwdr
+DoDLKvbdwuMeQxkn
+DoDLKvbdmoyxujyC
+DncLKvbdyYJKBoyk
+EOcKjvbdhgJbxujV
+EOcKjvbdvAcySndh
+EPCjjvbdOYPVzcmt
+DncKjvbderBWzlCo
+DncLKvbdEuxoolie
+DoDLKvbdUsmTelVj
+DoCkKvbdcImKKfXY
+EPCkKvbdKDJcRJcY
+DoDLKvbdfILWSOQg
+DoDLKvbdtcDVWuno
+DoDKjvbdegjvSNpg
+DncKjvbdjvXOEBxX
+DncKjvbdvOszpjoU
+EOcLKvbdkIGkfFnL
+EPDKjvbdZxcinCkr
+EOcKjvbdNxPVzcnU
+DnbkKvbdNrsvHEtp
+DnbjjvbdwygefXeS
+EObkKvbdnHEwmOGy
+EObkKvbdZRNFIleR
+DoCjjvbdNHColotk
+EPDKjvbdTkuoBVni
+EObkKvbdkHgLfGNk
+DoCkKvbdVvhxWEEg
+EOcLKvbdtbcVWvOo
+DoDKjvbdULvOaWOi
+EObkKvbdNdcsiJLE
+DoDLKvbdOYPVzdNt
+DoCkKvbdNeDsiJLE
+EOcLKvbdXGYytAOs
+EOcKjvbdcIljLGWx
+DoDKjvbdIMBzmwQk
+EPDKjvbdbrcKscjB
+DoCjjvbdqdEhpOWB
+DnbjjvbdzoPqFClY
+DnbjjvbdKDKCqJcY
+EPDLKvbdZRNEhldq
+DncLKvbddZyQXyRC
+DncLKvbdRzKHrcWA
+EObkKvbdTAFIgbPE
+EObjjvbdwtmFRYkn
+DoDLKvbdCTAbtFwS
+EObjjvbdJzpFwdAN
+DoCjjvbdCTAbsevr
+EObjjvbdyzdmrIIh
+DnbkKvbdANIZTXZx
+EPCkKvbdVwJXvDeH
+DncKjvbdmfdwlnHZ
+DoCjjvbdZirhPfaf
+EPCkKvbdiHJcYvJu
+DnbjjvbdRMxCYmtz
+EPDLKvbdZHWdAPSi
+DnbjjvbdWSNxBdkc
+DoDKjvbdNxPVzdNt
+EObjjvbddePRawDK
+DncKjvbdaSGCgtGL
+DncKjvbddoFSjstS
+DnbjjvbdOFETiJLE
+DoDLKvbdeAUQmYJf
+EObjjvbdZshiZESn
+EPCjjvbdVwIwvEFH
+DnbkKvbdKDKDQjDY
+EPDLKvbdRbEFMJZL
+DoDKjvbdiZuGLpnG
+DoCjjvbdqGEEtWAh
+DnbjjvbdnBiwYPNu
+DnbjjvbdtlXwBTaX
+DoCjjvbdqYoHfqEY
+EPCkKvbdIsZArmXl
+DoDLKvbdmfeYNNgZ
+DoCkKvbdrafNLgKy
+DnbkKvbdYfwEAOsJ
+DoDLKvbdrEFIonWB
+EPCjjvbdRXODcMID
+EPCjjvbdZisIPfbG
+DncKjvbdoAKzshEO
+EOcLKvbdNQXqVmfs
+DnbkKvbddoEsKssr
+EPDKjvbdNeETiJLE
+EPCkKvbdVgwvXfxz
+EOcKjvbdIsZBTNXl
+EObkKvbdFeirOJUR
+EPCjjvbdVAbRSpqy
+DnbjjvbdeXyssqez
+EPDLKvbdZGwEAOri
+DoCkKvbdVAaqSqRy
+DoDLKvbdiVZeWrVC
+EPDKjvbdGYuUaDwb
+DncLKvbdLrXMyuQz
+EPDKjvbdGZUtaEXb
+EOcLKvbdzoQRFDLx
+EPCkKvbdTAFJICOd
+EPDKjvbdNPxRVmfs
+DoCjjvbdauBfxKsh
+DncLKvbdMIbLpxAS
+DoCkKvbdmgEwmNfy
+DoDLKvbdhanbdvqR
+DoCkKvbdSLYfUfjs
+DoCjjvbdTvMQJsaR
+DnbkKvbdlhcspuRa
+DnbjjvbdJSyBSlxM
+EPCjjvbdSLZFuHLT
+DoCkKvbdYTLaNUPY
+EObjjvbdFeiqnJUR
+EPDKjvbdYlRctNkm
+EOcKjvbdHDjvJaij
+DnbkKvbdnCJvwnnV
+DoCjjvbdNHDPlouL
+DncLKvbdWXIxWDdg
+DoCkKvbdJSyAsMwl
+EObkKvbdxmrhXriD
+DnbkKvbdJzpGYEAN
+EOcLKvbdddnqawDK
+EOcLKvbdhyuFkpnG
+DnbkKvbdtAHQhABS
+DoCjjvbdjhGlFemk
+DncLKvbdjJehJmXr
+EPDLKvbdHffyyXwg
+DoCkKvbdRbEFLiZL
+DoCjjvbddePSBwCj
+EPDKjvbdeOeTKtUS
+DnbjjvbdrDeIomvB
+DnbjjvbdVZIUZjoO
+EPDKjvbdxmsIYTIc
+EPCjjvbdDnbkLXDE
+DnbkKvbdYlSDtNlN
+EObkKvbdeFPSBvbj
+EPCkKvbdkDMKpgUg
+DoCkKvbdbKlGPODA
+EObjjvbdGdLVjCKK
+EPCkKvbdkCkjqGuH
+EOcLKvbdqYngfpcx
+EPDLKvbdeKJqvUzn
+DoCkKvbdkIHMGGOL
+DncKjvbdDoDKkXDE
+EPCkKvbdsCGNMHLZ
+EOcKjvbdyzeNqhJI
+DnbjjvbdqwQLbhxq
+EObjjvbdaaWEepPw
+EObjjvbdDxXktUTl
+DnbjjvbddwzTtRez
+DnbjjvbdKQyeOfNe
+EPDKjvbdbBVdepPw
+DncLKvbdfSAvzkbo
+DoDKjvbdqYoIHQcx
+DoCkKvbdeEnrBwCj
+DncKjvbdehLVqnRH
+EPDLKvbdhfjDYuiu
+EPCkKvbdvmWANEEm
+EPCkKvbdZRNEiNFR
+EOcLKvbdCSaCtGXS
+DoDKjvbdbhljKevx
+DoDKjvbdbBVdepQX
+DncLKvbdqTsfrSKt
+EPDKjvbdjEjgVPAO
+DoCjjvbdFeiqmiTq
+EObjjvbdcImJkGXY
+EObjjvbdJbjCqJcY
+DnbkKvbdjcLjpftg
+EPDLKvbdWXJYWEEg
+DoDKjvbdznpREbkx
+EObjjvbdfILVqmqH
+DnbkKvbdxwiKCQZk
+EPDLKvbdOEdUJIjd
+DnbkKvbdsCFmLgKy
+DncKjvbdijFhKMxS
+EPCjjvbdzitpQDrt
+EPCkKvbdZQleImEq
+DoDKjvbdZxdKNcLr
+DncKjvbdGdLVjCKK
+EOcKjvbdhzUfLpnG
+DncLKvbdwzHfGYEr
+EObjjvbdEObjjvcE
+EOcLKvbdfHkVqmpg
+DnbjjvbdXnRAXuVt
+EOcLKvbdeFOrBwDK
+EPCjjvbdzitoocsU
+EPDKjvbdZxdJmblS
+EObjjvbdFjeScHlu
+DoDKjvbdjhGkfFmk
+EOcLKvbduDDVXWPP
+EPDLKvbdJYUCHkpp
+EPCkKvbdkClKpgVH
+EObkKvbdJcKCqJbx
+DncKjvbdEXwlUTsl
+EObkKvbdxwiJbPzL
+DncLKvbdHDjujCKK
+DnbkKvbdEuyQQMie
+EPCkKvbdUaBpsRSZ
+EPCkKvbddoFTKstS
+EPCjjvbduaEYsOeI
+DoDLKvbdcTDKscjB
+DncLKvbdNdcshiKd
+DnbjjvbdWSOYCEkc
+EOcKjvbdZnmiEdzK
+EPDKjvbdUQpnttgm
+DoCjjvbdnGdwmOGy
+DoCkKvbdZyDjNblS
+EOcKjvbdShyjRAAl
+DncKjvbdTkvOaWPJ
+DoDKjvbdOEcsiJKd
+DncKjvbdbVBfxKtI
+EPCkKvbdrafNLfjy
+DoDKjvbduaEZTOeI
+DncLKvbdGGKSNhtR
+EPCjjvbdnBjWxOmu
+EObkKvbdKefICBRV
+DncKjvbdZoNheFZj
+DnbkKvbdEOcKkWbd
+EPDKjvbdNGcPmQUk
+EObkKvbdaMjbStlg
+DnbkKvbdJYTbIMRQ
+DncLKvbdJXsahLpp
+DncKjvbddeOrBvbj
+DoDLKvbdJSyAsMwl
+EPCkKvbdZdwfzhJC
+DoCjjvbduDDVWuno
+DnbjjvbdEztQdkbi
+EOcLKvbdUyHsykOn
+EObjjvbdDjHivYKA
+DoDLKvbdnUtzLKSG
+DncLKvbdSLZFuGkT
+DoDKjvbdlYrrTZGt
+EOcLKvbdqUUGqrKt
+EPDLKvbdEPCjjvcE
+EPDKjvbddxZtTrFz
+EObkKvbdlYrqrxgU
+DoCjjvbdauCGwjtI
+DnbjjvbdQZNAHTRj
+DoDKjvbdMoxRVmfs
+DncLKvbdOTTvGeUp
+DncKjvbdcJNKKewY
+DoDKjvbdmuVZjjSG
+EPDKjvbdUWLpKUAq
+EOcLKvbdSLZGVGjs
+EObjjvbdCIjakJGK
+EPDLKvbdZnmhddyj
+EOcKjvbdLBKgMaxR
+EOcLKvbdDjHjVwjA
+DnbkKvbdYlRcsnLm
+DoCjjvbdrRuKnKaN
+EPCkKvbdptUHSSLU
+DncLKvbdYpmEiNFR
+EObkKvbdMIalQxAS
+DnbjjvbdJuteceHJ
+DncLKvbdFWYpPlie
+EPCkKvbdmgFYMmgZ
+DoCjjvbdmbJvxOnV
+DncKjvbdIGfzZYXg
+EPDLKvbdqTtGqrLU
+EPCjjvbdWRmwbElD
+EPDLKvbdGLErcIMu
+EPDLKvbdwygefYEr
+EPDKjvbdrSUkOLBN
+DoCkKvbdNQYQumfs
+DoCkKvbdRjyGVGjs
+EPDKjvbdmajXXoOV
+DncKjvbdIGgZxwwg
+DnbkKvbdxwiJapZk
+DoDKjvbdYqMdhleR
+EOcLKvbdZtJIxdSn
+EPDLKvbdTIzKRABM
+EPDKjvbdCEPaWJlf
+EOcLKvbdjgflFfOL
+EPCjjvbdZjShQGbG
+DoDLKvbdHDjvJbKK
+EOcLKvbdBiKbLIfK
+DncLKvbdiHJbxujV
+EObkKvbdKeehBaQu
+EPDLKvbdYSlBMsnx
+EObkKvbdmJDsptrB
+DoDKjvbdTkuoAvPJ
+EPDKjvbdZyEJnDLr
+EPCkKvbdZoNhddyj
+EPDKjvbdVZHsykOn
+DnbkKvbdjJegjNYS
+DoDLKvbdtcCtwVno
+EOcKjvbdkIHLefOL
+EOcKjvbdYkqdTnLm
+DnbkKvbdiZuGMQmf
+DoCjjvbdZLrDsnLm
+DoCjjvbdDwwktTsl
+EObjjvbdRzKHrbvA
+DoDKjvbdQlwaxnUz
+EObkKvbdyTOImRag
+EPCjjvbdQmYByOUz
+EObjjvbdbrbkUDjB
+DoDLKvbdGYtuAcwb
+DncLKvbdePFSjssr
+DoDKjvbdRbDdlIxk
+DoDKjvbdwzIGGXeS
+EPCjjvbdOTUVgEuQ
+EPCkKvbdemGWfmJk
+EOcLKvbdZQmEhmEq
+DoCjjvbdZRMeJNFR
+DoCjjvbdvBEZSoEh
+DncLKvbdhlFDnVDZ
+DoCjjvbdJJdAKPfd
+EObjjvbdyYJKCQZk
+EObjjvbdRzKITCvA
+EPCjjvbdUMVnaWPJ
+DoCjjvbdNddThhjd
+EOcKjvbdNPwpvOHT
+DnbjjvbdZisHpHCG
+EObkKvbdGLFScINV
+EOcLKvbdbsDLTdJa
+EObjjvbdbhlijfWx
+DoDLKvbdVZHszLPO
+EObjjvbdZnnJFEyj
+DoDKjvbdeOeSkTtS
+DoDLKvbdkCkjpgUg
+EPCjjvbdFejRnJUR
+DoCjjvbdZsiIyDrn
+DoDLKvbdtunYJqTA
+DnbkKvbdoznELXoA
+DoCjjvbdZtIiYcsO
+EOcLKvbdGGKSOJUR
+DoCjjvbdUMWPAuni
+DnbkKvbdEPDKkWbd
+EPCkKvbdUxhTzLPO
+DoDKjvbdGdKvKBij
+DncKjvbdmSZUzSci
+EPCjjvbdZjShQGaf
+DncLKvbdWRmxCElD
+EPDLKvbdqvpMDIyR
+DncKjvbdCJKakIfK
+EPDKjvbdHELWJbKK
+DoDKjvbdjlbLzFGo
+EPCjjvbdTkvPBWOi
+DoCkKvbdJvVGEFGi
+EOcLKvbdUyHszLPO
+EObjjvbdVBBpsQqy
+DnbkKvbdZdxGzhIb
+DnbjjvbdsPvOicVf
+DoDKjvbdtcCtwWPP
+EOcLKvbdwtmFRYkn
+EPDKjvbdegjvSNqH
+DoDKjvbdIxUBglQp
+EOcLKvbdBcpAvKNG
+DnbjjvbdwXMAvAvV
+DnbkKvbddoEsLUUS
+DncKjvbdCIkCKiGK
+DoDKjvbdlZTSTYft
+EPCjjvbddoEsKtTr
+EObjjvbdFfJrOJTq
+EPDLKvbdliDsqVSB
+DncLKvbdbUagXjtI
+EObkKvbdIsYaSlxM
+EPCjjvbdHkaznXRL
+DnbkKvbdxUmFQyMO
+DoCjjvbdWWiXvDdg
+EPCjjvbdSQUHKFcw
+EPDLKvbdjKGIJlwr
+EOcKjvbdXFxytAOs
+DncKjvbdmbKWwoNu
+EObjjvbdiZuFkpmf
+DoCjjvbdFyVVBDwb
+DnbjjvbdeqaWzlDP
+EPCjjvbdRyjHsDWA
+DnbkKvbdqlzJyMHi
+DnbkKvbdZRNFImFR
+DoCkKvbdYfwEAPSi
+DoCjjvbdOAIrsjSA
+EPCkKvbdaNLCTVMg
+DnbjjvbdqceIomvB
+DnbjjvbdsCFlkgLZ
+DoDLKvbdmIdURUqa
+EOcKjvbdZshhxcrn
+DoDKjvbdZjTIPgCG
+DncKjvbdemGWfmJk
+DnbjjvbdACqxKZiQ
+EObkKvbdkVvnEBxX
+DncLKvbdUtNTfMWK
+EPDLKvbduaDxsPFI
+EObkKvbdgQBzvcxI
+EObkKvbdSZihTDWA
+EOcLKvbdqYnggREY
+EPDKjvbdqiAJdmPF
+EOcLKvbdiGjDZVjV
+EOcLKvbdGZVVAdXb
+DoDKjvbdhfjCxuiu
+DnbkKvbduMYXBTaX
+DoCkKvbdjSziTKiz
+DoDKjvbdqlzKZMIJ
+DnbjjvbdkVwOEBxX
+DoCjjvbddtAUASmW
+DoDLKvbdzjVQQESt
+EOcLKvbdkySrSyHU
+DncLKvbdNGbolotk
+DnbjjvbddeOrBwCj
+DoDLKvbdiLdcmuDZ
+DoDKjvbdSPsfjFdX
+DoCkKvbdbUafxKtI
+DnbkKvbdcJNJkFvx
+EObjjvbdFejSNiUR
+EPDKjvbdQmYCYmtz
+DncKjvbdfVzwpJzs
+EPDKjvbdWRmwbEkc
+DncLKvbdFkEsDIMu
+DoCjjvbdQccBPqES
+EObkKvbdKCibpjCx
+EOcKjvbdLBLHNBwq
+DoCkKvbdUMWOaVoJ
+DoCjjvbdrbFmMGjy
+EOcLKvbdJvVFdEgJ
+EPCkKvbdjhHMGFnL
+DncKjvbdNxOuzcmt
+EPDKjvbdEXxLstUM
+DoDKjvbdwygfGXeS
+EObkKvbdyTNiMrBg
+DncKjvbdlZSrSxgU
+EPDKjvbdJXtCHlQp
+EPCkKvbddndsLTsr
+EObjjvbdNdcshhkE
+DncLKvbdSCDeLhyL
+DncLKvbdNsTvHEuQ
+EOcKjvbdACqxKZiQ
+DoCjjvbdptTgRqjt
+EPDKjvbdOEdTiJLE
+DoDKjvbdrpVoKCvG
+DnbjjvbdFjeSbhNV
+EPCjjvbdNGbolouL
+EPDLKvbdrEFIonVa
+DnbkKvbdOFDsiIjd
+DoCkKvbdTqQoUuIN
+EPDKjvbdeOdsKtTr
+DncKjvbdyNrhXsIc
+EPDKjvbdnQZxujyC
+EPCkKvbdYqMdhmFR
+DncLKvbddeOrBvbj
+DoCjjvbdLGFgbApu
+DoCjjvbdemFwHMik
+DoCkKvbdRXOEClHc
+DoCkKvbdZQmEiNFR
+EPCjjvbdEASIlzXX
+DnbkKvbdrWokbiZR
+EObkKvbdHELWKBij
+DnbkKvbdbUagXkUI
+EOcKjvbdbsDLUDia
+EOcLKvbdUWLojUAq
+DnbjjvbdQvmccMID
+DoDKjvbdZxcjODMS
+EPDKjvbdTulPjUBR
+DncLKvbdjSzhsKiz
+EOcKjvbdTAFJICOd
+DnbkKvbdKNADzHVB
+DoCjjvbdliDtRVSB
+EObjjvbdWXIxVceH
+EPCjjvbdfHkWRnQg
+EObkKvbdjAQGaPgK
+EObkKvbdkClLRGuH
+DncLKvbdZnnIdeZj
+EObjjvbdlYsRsYgU
+DoDLKvbdpyPHgQcx
+DnbjjvbdnPyyWKyC
+EObjjvbdQwNcblID
+DnbjjvbdCJKajhfK
+EPDKjvbdiHKCyWKV
+EObjjvbdeEoRavbj
+EOcKjvbdmaivwnnV
+EOcKjvbdwNWANDeN
+EPDKjvbdTAFIhCPE
+DoCjjvbdZQleJMeR
+EPDKjvbdmtuZjiqf
+DnbkKvbdEPCkLXCd
+EObkKvbdqGEEsvBI
+EOcKjvbdmIdTqVSB
+EObjjvbdJTZBSlwl
+EPCjjvbdqlzKZMIJ
+EPDKjvbduCbtwWOo
+EPDLKvbdnPzYukYb
+EPDKjvbdeFPSBvbj
+EPDLKvbdHEKvKCJj
+EPDKjvbdVUNUGLuj
+EOcLKvbdJuuGEEgJ
+EOcKjvbdzQnmJKXA
+EOcLKvbdrbGMkfjy
+DnbjjvbdUsltFkuj
+DnbkKvbdDxYMUUUM
+DnbjjvbdUQpoUuHm
+EPDKjvbdRbDdlJZL
+DncLKvbdmgFXlmfy
+EPCjjvbdJbibqJcY
+DoCjjvbdEPDLLWcE
+DoDLKvbdMJCMRYAS
+DoCkKvbdQZNAGsSK
+EObjjvbdiCPDFXQq
+EOcLKvbdVwJXvEEg
+DoDLKvbdsrqsYzFD
+DncLKvbdjuvnDbXw
+EPDKjvbdhgKCyWKV
+DoDLKvbdNdctIiKd
+EObkKvbduaEYrneI
+DoCkKvbdNVSrKmAX
+DncKjvbdXnRAXtvU
+DoDKjvbdhkddNtcZ
+DoCkKvbdiBnbdwQq
+DnbkKvbdLBLGlawq
+DoDKjvbdygZMANEw
+DnbkKvbdZsiIxcsO
+EObjjvbdiBoDEwRR
+DoCjjvbdHbLzEzAD
+EPCkKvbdjbkkQgVH
+EOcLKvbdsBemLgLZ
+EOcLKvbdptUGrRkU
+EPCjjvbdznpQdbkx
+DoDKjvbdGYtuAdXb
+EOcKjvbdzjUpQETU
+EOcLKvbdypoNIjXA
+DnbkKvbdSQUHJfDw
+EPCkKvbdbsCjtEKB
+DoDLKvbdajlFoODA
+DoDKjvbdelevfmKL
+DnbkKvbdCTAbsfWr
+DoDKjvbdjhGlGGNk
+DoCkKvbddCTMrATm
+EPDLKvbdaMjbSuMg
+DoCkKvbdKaLHNCYR
+DncLKvbdGGKSNiTq
+DoCjjvbdLZRJrztf
+EPDLKvbdjlakyeGo
+EObkKvbdwuMdpyLn
+DnbkKvbdegjuqnQg
+EPDKjvbdtTSTYydc
+EObkKvbdZyDjOClS
+DnbkKvbdqGEEtWAh
+EOcLKvbdKQydoFnF
+EPDLKvbdqUTgSSKt
+DnbjjvbdMJCMQxAS
+EPCkKvbdiMFDnUby
+EOcKjvbdfpBzwEXh
+DoCkKvbdSBceMIxk
+EObjjvbdfMevgMik
+EPCjjvbdjAQHAofj
+EPCjjvbdZLrETnMN
+EObkKvbdDoDLLXCd
+DncLKvbdSZjHsDWA
+DnbjjvbdOStVgFVQ
+EObkKvbdbhlijfXY
+DnbkKvbdjEjftoAO
+DoCjjvbdeEnrCXDK
+EOcLKvbdZyEKNcMS
+EPDKjvbdWSNwadkc
+EPCjjvbdkDLjqHUg
+DoCkKvbdSCEFLiYk
+DncKjvbdtkwwBTaX
+EPDKjvbdCTAbsevr
+DncLKvbdmfdwlnGy
+DncLKvbdTukpJtBR
+DoCjjvbdlYrrTZGt
+EOcKjvbdnCKWwoOV
+DncKjvbdMgColpVL
+EPDLKvbddwytURez
+DoCkKvbdakLenmcA
+EPCkKvbdQvmdCkhD
+DncLKvbdEARhlzWw
+EOcLKvbdrXQMDJYq
+EObkKvbdmJETptrB
+EOcKjvbdAMgxsXZx
+EPDKjvbdULvPBVni
+DoDKjvbdqGEFTvAh
+DoDKjvbdGLFTChMu
+DoCjjvbdLBKgNCXq
+DoCjjvbdOEcsiJLE
+EObjjvbdSLZFuHKs
+DoCjjvbdtkxXAsaX
+DnbjjvbdNGbpNQVL
+EOcLKvbdiLeEOUby
+EObjjvbdDoCjjwDE
+EPCkKvbdxrnJMrCH
+EPDKjvbdJTZBTMwl
+DncKjvbdBcpBWJlf
+DncLKvbdGKdsDHmV
+DncLKvbdDwwlUUTl
+EPDLKvbdbQHHELzd
+EPDLKvbdYlSEUOLm
+EObjjvbdhtyeXSUb
+EPCjjvbdACqxKZiQ
+EObjjvbdrDdiPmua
+EPCkKvbdcyxpYYqC
+EPDKjvbdrXQLbiZR
+DncKjvbdjmBlZeHP
+DncKjvbdlYrrTYft
+EObkKvbdaaWFFpPw
+DncKjvbdwyhGFwdr
+EPCkKvbduLxXAtBX
+EObjjvbdhancEvpq
+DncLKvbdbiMjKevx
+DncKjvbdTIyjRABM
+DoCkKvbdcImKLFvx
+DnbkKvbdZjSgpHBf
+EPCkKvbdGdKvJbJj
+EOcLKvbdSCDeMIyL
+EOcKjvbdZxdJnClS
+EOcLKvbdHDkVibJj
+DoDKjvbdezuxeJTw
+EOcKjvbdqFceUVaI
+EPDKjvbdWIYWXfxz
+DoDKjvbdNQXqWOHT
+DnbkKvbdOStWHEtp
+EPDKjvbdLAkGmBxR
+EPDKjvbdDxXksssl
+EPCkKvbdTqRPVUgm
+DoDLKvbdrDdhomvB
+DncLKvbdptUGrSKt
+EOcKjvbdiBnbeWqR
+DoDKjvbdezvYeJUX
+DnbkKvbdOAJStJrA
+DnbjjvbdtcCuWvPP
+DnbjjvbdIjEAKPgE
+EObkKvbdWWiXvEEg
+DnbkKvbdSBdFMJYk
+EOcKjvbdQdCaQQcr
+EPDLKvbdLZRKSzuG
+DoCkKvbdpfEFTuaI
+DnbkKvbdVBBqSqRy
+DncLKvbdMoxRVnGs
+EOcLKvbduoTzqKnt
+DoCjjvbdxxJKCPyk
+DncLKvbdVvhwvEFH
+EPDLKvbdOYPVzcnU
+EOcLKvbdBdPaWJlf
+DnbkKvbdJSyAsMwl
+DoCkKvbdYTLaMsnx
+EOcKjvbdUWLpJsaR
+DoCjjvbdhbOcEwRR
+DncKjvbdKfGHbAqV
+DoCjjvbdlZTSSyGt
+DncLKvbdatbGxLTh
+EPDLKvbdiGicYvKV
+EOcLKvbdTIyjRAAl
+EPDKjvbdZsiIyDsO
+DnbjjvbdZLqcsmlN
+EOcLKvbdeOeTLTtS
+DncKjvbdQdCaPqDr
+EPCjjvbdUGznLvvF
+EObkKvbdrDdhpNvB
+EPDLKvbdRadFLhxk
+DnbjjvbdhytelQmf
+EPDKjvbdFkFSbhNV
+DoDKjvbdaSGDHsek
+EObkKvbdzHYlAMdw
+DnbjjvbdliDsptrB
+EPCkKvbdYlSDtNlN
+DoDKjvbdnPyxujxb
+EObjjvbdRkYfVGjs
+EPCjjvbdRaceMJZL
+EOcLKvbdnUuZkJrG
+DncKjvbdOYOuzdNt
+DoCkKvbdJbjDQicY
+DnbjjvbdRyjHsCvA
+EOcLKvbdUGzmlXVe
+EPCjjvbdMoxRWOGs
+DncKjvbdlrZUzTEJ
+DoCjjvbdJYUBgkpp
+EOcLKvbdACrXizJQ
+EPDKjvbdsCGMkfkZ
+DncKjvbdqYnhGqEY
+DncLKvbdjgflFemk
+DncKjvbdrzMQTAgn
+DoCjjvbdlZTSSxgU
+EPDLKvbdKCibqKCx
+EOcLKvbdmJDtQuSB
+DncLKvbdQcbaPqES
+DoCjjvbdOXoVzdNt
+EObkKvbdbsCjsdKB
+EPDKjvbdySmiMqbH
+DoCjjvbdrMzKZLhJ
+DncKjvbdtAGqIAAr
+EPCjjvbdEXxMTtUM
+EOcKjvbdVrOYBdkc
+DoDKjvbdzROlhiwA
+DncKjvbdqTtHRrLU
+DnbkKvbdiUzEwSUb
+DoCkKvbdZLqcsnMN
+DnbjjvbdUaBqTRRy
+DoDKjvbdRosgKGEX
+EObkKvbdShzKRABM
+DoDLKvbdqZOhHRDx
+EPDLKvbdiUzFWqtb
+DoCkKvbdZyEJmbkr
+DncKjvbdREDBPpdS
+EPCjjvbdMSWmZtpz
+EPDLKvbdTAEiHaoE
+DoDKjvbdNeETiIjd
+EOcLKvbdqdFJPmua
+DoCkKvbdRpTfjFcw
+DncLKvbdznoqEcMY
+DoCkKvbdFfJqmiUR
+EOcLKvbdSPsfifEX
+DnbjjvbdtunYJpsA
+EPDKjvbdqcdiQOVa
+DnbkKvbdeXyssrFz
+EPDLKvbdQYmAGrqj
+EObjjvbdegjuqmpg
+EOcLKvbdbLLenmcA
+EOcLKvbdpyPHgREY
+DoDKjvbdZRMdhmEq
+DncLKvbddZxoxZRC
+EOcKjvbdKxpjSztf
+EPDKjvbdKkBHvAJy
+EObkKvbdnBiwYOnV
+EObkKvbdrWolDJYq
+DoCkKvbdZyEJmbkr
+DoDKjvbdkDMLRHUg
+EPCjjvbdQwNccMID
+DncKjvbdSZihSbvA
+DncLKvbdnHFXmNgZ
+DncKjvbdGKeSbhMu
+DncLKvbdULvPAuoJ
+EOcLKvbdYqNFJMeR
+DoDLKvbdMfcPmQVL
+EPDKjvbdFpATWgGZ
+EObjjvbdeqaWzkbo
+EOcKjvbdZoNhddzK
+EObjjvbdFeiqmiTq
+DoDKjvbdauBfwjsh
+EOcLKvbdBraDUFvr
+DoDLKvbdyYIjCPzL
+DnbjjvbdmRxuZsEJ
+EObjjvbdMfcQMpUk
+EOcKjvbdyNsIXrhc
+EPDKjvbdREDBPpcr
+EPCjjvbdRkYeuGkT
+EPCkKvbdtAHRIAAr
+DnbkKvbdxUmFQxkn
+EObkKvbdtTSTZZdc
+EOcKjvbdmIdUQtqa
+EOcKjvbdXrkaNUPY
+DoDKjvbdCWzdIePv
+DoDKjvbdbBVdfQPw
+EPCjjvbdZyEJmblS
+DncKjvbdlZTRrxft
+EPDLKvbdIxUCIMQp
+DnbjjvbdKyRKSztf
+EOcKjvbdNeEUIhjd
+EOcLKvbdjKGIJmXr
+DoDLKvbdCEPaVimG
+EPCkKvbdOFDsiIkE
+EOcLKvbdehKvSORH
+DoDKjvbdwWkaWAuu
+EPDKjvbdpxoHfpcx
+EPDKjvbdJbjCqJbx
+DncKjvbdZtJJZETO
+EPDLKvbdsZkpTBHn
+EPCkKvbdTlWPAuoJ
+DoCjjvbdjggMFfOL
+DoDKjvbdfMewGlik
+EPDLKvbdnBivwoOV
+DoCjjvbdwuNEpxkn
+DnbkKvbdiifIKNYS
+EOcKjvbdKVuFdFGi
+EPCjjvbdZdxGzgiC
+EOcLKvbduaDxsPEh
+EPCkKvbdRotHJfEX
+DncLKvbdCIjajhej
+DoCkKvbdcImJjfWx
+EOcLKvbdKVtecdgJ
+DoCjjvbdeFOrBwCj
+EPDKjvbdqvpLcIxq
+EObjjvbdEARiMyvw
+DncKjvbdbUafxLTh
+DncLKvbdLAkGmCYR
+DoDKjvbdxVMdqYkn
+EPDKjvbdWWiYWDdg
+EObkKvbdKDJbpjCx
+DoCkKvbdnPyxvKyC
+DoCkKvbdZsiJYcsO
+EObkKvbdJpzFOeme
+EOcLKvbdOSsufeUp
+DoDLKvbdTfznMWvF
+EPDLKvbdfNFwGlik
+EPDLKvbdCDpAuilf
+EPDKjvbdbiMikGWx
+DoCkKvbdrbGMkfjy
+DoCjjvbdWIXuxHYz
+EPDKjvbdGFiqnIsq
+EPDLKvbdNGbpMpVL
+EOcLKvbdtSrTYyeD
+DoDKjvbdjJfHjNXr
+EPCkKvbdzitpPcrt
+DoDLKvbdxmrgxSiD
+EPDLKvbdcJNKLFvx
+EPDLKvbdsrrSxydc
+DnbkKvbdqceIonWB
+EPCkKvbdZnnIddzK
+DoCjjvbdLYpirztf
+EPCjjvbdLrWlzUpz
+DnbjjvbdRkZGVGjs
+EObjjvbdnBivxOmu
+DoCjjvbdmIdUQuSB
+EObkKvbdtcCtvuoP
+DnbjjvbdANIYrvzY
+DncKjvbdmaivwoNu
+EOcLKvbdrouoJcWG
+DoDLKvbdTppoVVIN
+DoDLKvbdVUMtFkuj
+DncLKvbdznpQdblY
+DncKjvbdEPCkLXDE
+EOcLKvbdfHkVqmqH
+EPDKjvbdapGgDkzd
+EPCjjvbdSPsfifDw
+DoDLKvbdGKeTDINV
+EObjjvbdyqPNIjXA
+EPCjjvbdatbGwkUI
+DoCjjvbdCTAcTewS
+DnbjjvbdxnTIXsJD
+EOcKjvbdbKlFnnDA
+DncKjvbdjJegjNXr
+EObjjvbdMuTRkNAX
+EObkKvbdUxgsykOn
+DoCkKvbdRaceMIxk
+EPDLKvbdJbibpibx
+DoDKjvbdEztQdlCi
+EPDKjvbdcyyPwyRC
+DncKjvbdjlbMZdfo
+EPCkKvbdRXNdClID
+DncLKvbdtbbuXVoP
+DoDKjvbdieLHVPAO
+DoDKjvbdFVxopMie
+EObjjvbdzoPpdblY
+EPCjjvbdmIdUQuSB
+EPCkKvbdYkrEUNkm
+DoCkKvbdVwIxVdEg
+DoCjjvbdOSsvGdtp
+EPCjjvbdmSYtysDi
+EObkKvbdWWiYVceH
+DoDKjvbdrNZixkgi
+EPDKjvbdbVCHYKsh
+DnbkKvbdjKFgimXr
+EPDKjvbdNsUWHFUp
+EObkKvbdeAUQlwjG
+EOcKjvbdTAEiICPE
+DoCkKvbdZLqdUNkm
+EOcKjvbdZisHogCG
+EPCkKvbdKVtfEEgJ
+EObjjvbdaSGDIUGL
+EPDKjvbdZRNFIleR
+DoDKjvbdyXiJaoyk
+EObkKvbdRkYfVHKs
+DnbkKvbdLAkHNCXq
+DncKjvbdJpyePFnF
+EPCkKvbdkHgMFenL
+DoDLKvbdOFDtIhkE
+DoCkKvbdtTSTZZdc
+EOcLKvbdkClKpfuH
+DoCjjvbdBcpBVjNG
+DnbkKvbdfMfXHNJk
+DoDKjvbdBsBCtFvr
+DoCjjvbdHgGzYwwg
+DncLKvbdSwjkmzkY
+DoCkKvbdDihJuwjA
+EPDKjvbdQccBPpdS
+EPDKjvbdehLVqnQg
+DoCjjvbdmozZVkZC
+DoDLKvbdaNKasVNH
+EObkKvbdrRtkOLBN
+DoDKjvbdehLWRnRH
+EObkKvbdSCEEkiYk
+DoCjjvbdRXOEDMID
+EOcKjvbdFejRmiUR
+EOcLKvbdFkEsChNV
+DncKjvbdWWhwuceH
+EPCkKvbdNwoVzdOU
+EOcKjvbdePFSkUTr
+DoDKjvbdMRwMzUpz
+EObjjvbdLrXMzUpz
+EPDKjvbdZxdJnDLr
+EOcLKvbdrRtkNjaN
+EPCkKvbdTvLoitBR
+DncKjvbdKeehCApu
+EPDLKvbdemFvfljL
+DncLKvbdeFOqawCj
+DoDKjvbdZyEJnCkr
+DoCjjvbdlZTRsZHU
+DnbkKvbdRbDdlJZL
+DnbjjvbdYqMdiNFR
+EObjjvbdSQTfjFdX
+DoCjjvbdgFlZnGgA
+DoDLKvbdwtldqYkn
+EObkKvbdjggLfFmk
+DncLKvbdMgCpNPtk
+DncKjvbdmpZyWKxb
+EPDKjvbdVqnYBeMD
+DoDKjvbdULuoBWOi
+DncLKvbdezvZEiTw
+EPCkKvbdjblLRHUg
+EPCjjvbdBiKakJGK
+DncKjvbdTukpJtAq
+DoCkKvbdkWWnEBxX
+EPCjjvbdnPzYvLZC
+EOcLKvbdWHxVxGxz
+DncLKvbdNsUWHEtp
+EObkKvbdHDkWKBij
+EObkKvbdVAbQsQrZ
+DnbkKvbdKCibqKDY
+EObjjvbdLYqKSztf
+DoCkKvbdZLrDtOMN
+EOcKjvbdemFvgNJk
+DncLKvbdiCOcEvpq
+DnbkKvbdEXxLtTtM
+EObkKvbdFjdrbglu
+EObkKvbdmttykJrG
+DoCjjvbdePFTLUTr
+DoCkKvbdWRmwadlD
+DoDLKvbdVqmxCElD
+EPCkKvbdnBiwXoOV
+DnbjjvbdEvZQPmKF
+EObkKvbdSKyGVGkT
+EPCjjvbdauBgXkTh
+EPCjjvbdVrNxBeLc
+EObjjvbdOEcshiLE
+DoDLKvbdbLMGPNcA
+DnbkKvbddZxpYYqC
+DoCkKvbdlZTSTZHU
+EObkKvbdtlXwBTaX
+EObkKvbdHffyxwxH
+EPDKjvbdrpWOicVf
+DncKjvbdkVvmdBww
+EPDKjvbduaDySoFI
+EObkKvbdsZkosBHn
+DoDLKvbdTAFJICOd
+DnbjjvbdpstHRrLU
+DncKjvbdUQqOtuIN
+EPDKjvbdVUMtFlWK
+DoDLKvbdrouoKDVf
+DoCjjvbdmRyUysDi
+EPDKjvbdgFkzNgHA
+DnbjjvbdZshiZDsO
+DnbjjvbdIMBzmwRL
+EObjjvbdZshhxdTO
+EOcLKvbdZGwEAOri
+EPCkKvbdkHflFfOL
+DoCkKvbdKDJcQibx
+EOcLKvbdFkEsCgmV
+EPCjjvbdJutfEEgJ
+DoCkKvbdOXnuzdNt
+EPDLKvbduLwwAtAw
+DoDKjvbdqvpLbiZR
+EPCjjvbdGYuVBEXb
+EOcLKvbdCJKajhfK
+DnbjjvbdkMbLyeGo
+EPCkKvbdijGIKMwr
+DoDLKvbdJzpGXdAN
+DoDKjvbdNwnuzdOU
+EOcLKvbdtSqsYyeD
+EOcLKvbdmRxuZrdJ
+EPDKjvbdhlEcmtcZ
+DoCkKvbdbiNJjevx
+DoDKjvbdGckVibJj
+DoDLKvbdGLFSbhMu
+EPDKjvbdEObjkWbd
+EObkKvbdBhkBjiGK
+EPDKjvbdtAGqIAAr
+DoCkKvbdWRmwadkc
+EObjjvbdQdDAoqDr
+EOcLKvbdwNWANDeN
+EPCjjvbdMowqVmgT
+EPDLKvbdegkWSNpg
+EPDLKvbdjAQHAogK
+DoDLKvbdvwLaVaWV
+EPCjjvbdLGFgbBQu
+DoCjjvbdxsOJMrCH
+EObkKvbdFkFTChMu
+EObjjvbdbLLenmcA
+EPDLKvbdiCObeXRR
+EPCjjvbdhbObdvpq
+EObkKvbdVZIUZkOn
+EPDLKvbdfVzxPizs
+EPDKjvbdnPyyVjyC
+DncLKvbdRzKITCvA
+EOcLKvbdUtMsfLuj
+DncKjvbdVBBpsRRy
+DnbkKvbdzeZnzdzQ
+EOcLKvbdUtNTfMVj
+EObjjvbdqcdiQOWB
+DoCkKvbdNddTiIjd
+DncLKvbdrykosBHn
+EPDKjvbdWRnYBeLc
+DncLKvbdrXQLcIxq
+EPCkKvbdUWLpKTaR
+DoCkKvbdZRNFJMeR
+EPDLKvbdunszpjoU
+DoDKjvbdzitpPdSt
+EObkKvbdvBDxrneI
+DoDLKvbdVviXvDeH
+EPCkKvbdDihJuxKA
+EPCkKvbdNPxQunGs
+DoCjjvbdmuUzKjRf
+DnbkKvbdbPffdLzd
+DoDLKvbdXrlBNTnx
+DoDKjvbdZQmEhmFR
+EObjjvbdmttzLKRf
+DoCkKvbddijRvUzn
+EPDLKvbdHffyyYXg
+EPCkKvbdcTDKtEJa
+EPCkKvbdpecdtWAh
+DncKjvbdRjxeuGkT
+EPCjjvbdqdEhpOVa
+EPCjjvbdelfXGmJk
+EObkKvbdWWhwudFH
+EPDKjvbdhbObeXQq
+DoCkKvbdffLynHHA
+DnbjjvbdpaJFAXIE
+DoDKjvbdqZPIGpcx
+DoDLKvbdmaivxPOV
+DncKjvbdqFdEsvAh
+EPCjjvbdrpWOibvG
+EPCkKvbdyfyMAMdw
+DoDLKvbdhuZdvqtb
+DncLKvbdWRnYBeMD
+DncLKvbdDncLKvbd
+EObkKvbdhzUfLpnG
+EOcLKvbddoFSkTtS
+EPDKjvbdbKlFoODA
+DoCkKvbdRWmccLhD
+EObjjvbdeAUQlxJf
+DncLKvbdKVuGEEfi
+EObkKvbdVvhwvEEg
+EPDLKvbdhaoDEvqR
+EPDKjvbdpfEFTvBI
+EPCkKvbdyzeNrIJI
+DoDLKvbdGckViaij
+EObjjvbdnHExNNfy
+EObkKvbdZLqdUOLm
+DoDLKvbdDxXktTsl
+EObkKvbdFVxpPmKF
+DoDKjvbdNdctJJLE
+DnbkKvbdTXkMNzjx
+DncKjvbdbrbkUEKB
+DoCkKvbdGKeSbhNV
+EPDKjvbdYSkaMtOx
+EPCjjvbdiGicYujV
+EObjjvbdnHFXmOGy
+DoDKjvbdZyDjNblS
+EOcLKvbdGYtuBEXb
+DnbjjvbdqGDeUWAh
+DnbkKvbdTppnuVHm
+EOcLKvbdPyNAGsRj
+EPCkKvbdIrxaSlxM
+DncKjvbdCfkfHAzc
+DnbkKvbdIHHZxxXg
+EPCjjvbdjKFhKMxS
+EOcKjvbdehKvRnRH
+EObjjvbdxVMdpyMO
+DnbjjvbdSLYetgKs
+EObkKvbdRjyGUfkT
+DoCjjvbdwyhFeweS
+DncLKvbdrJAKElne
+EPCjjvbdiGjCxvKV
+EPCjjvbdCIjajiFj
+DoDLKvbdunszqLPU
+DnbjjvbdySmhlrCH
+DnbkKvbdnBjWxPNu
+DoDKjvbdlhdTqUrB
+DoCjjvbdGdKvJajK
+EObjjvbdkySqryHU
+EPCjjvbdYkqdTmkm
+EObkKvbdDnbjkXDE
+EPDKjvbdKDKCqKDY
+EOcLKvbdeYZstSFz
+EPDKjvbdZyDjNbkr
+DncLKvbdPyNAGrrK
+DoCkKvbdTlVoAuni
+DncKjvbdEPCkKvbd
+EPCkKvbdcTCkTcjB
+DnbkKvbdcJNKLGXY
+DnbjjvbdRkYfVHKs
+DoDLKvbdaaWEfQQX
+EPDKjvbdmbJvwnmu
+EOcLKvbdZyDimcMS
+DoDLKvbdYkrEUNkm
+DoDKjvbdmaivwnmu
+DoDLKvbdqYoIHQcx
+EPDKjvbdLrWlyuQz
+DncLKvbdkCkkQgVH
+EObjjvbdrXPlChyR
+DoCjjvbdJTYaTMwl
+EPCkKvbdNsTvHFVQ
+DnbjjvbdeEnqavcK
+EPCjjvbdVvhwuceH
+EPCkKvbdbLMFoODA
+EPDLKvbdCIkCLIfK
+DoDLKvbdbLLennDA
+DncLKvbdyNrhYTIc
+EPDLKvbdNHCpNQUk
+DnbkKvbddndsLUTr
+DncKjvbdaogHDkzd
+EPDLKvbdZjSgpGbG
+DnbjjvbdaSGDIUGL
+EPCkKvbdjhGlFfNk
+EPDLKvbdbKkenmcA
+EOcKjvbdIHHZyXxH
+DoCjjvbdiUydwRtb
+EPDLKvbdauBgYKtI
+EPDLKvbdZMSDsmlN
+DoDKjvbddneSjtTr
+EPCjjvbdJbibqJbx
+DnbjjvbdGYtuAcwb
+DoDLKvbdsQVoJbvG
+DoCkKvbdxmrhXsIc
+DoCjjvbdyNsHwsJD
+DoCkKvbdKWVFceGi
+DoDLKvbdsBfNMGkZ
+DnbkKvbdJzoewdAN
+EPDKjvbdwzHefYFS
+DnbjjvbdBiKbKhej
+EOcKjvbdjuvmdCXw
+EOcKjvbdbhmKKevx
+DoCjjvbdehLWRmpg
+EPCjjvbdACrYJzJQ
+EOcKjvbdhuZeXSUb
+DoCkKvbdJcJbqJcY
+EPDKjvbdYqMeJNEq
+DncLKvbdmJDtRUqa
+EPDKjvbdnBjWxOnV
+DoDLKvbdOEctJIkE
+DoCjjvbdDxYLtTtM
+EOcLKvbdZnnJFFZj
+EOcKjvbdKRZeOfNe
+DoCjjvbdTukpJtAq
+DoDKjvbdhyuGLpnG
+DoDKjvbdhtzFWrUb
+DnbkKvbdQccBQRDr
+EPCjjvbdTukojUBR
+EPDKjvbdeKKRvUzn
+EOcLKvbdeXzTtSFz
+DncKjvbdyTOJNSCH
+EObkKvbdjmBkydfo
+EPCjjvbdelevflik
+DoDKjvbdZtJIxcrn
+DoDKjvbdqiAJeNOe
+DoCjjvbdddnqavbj
+DoCjjvbdZLrDtOMN
+EPDKjvbdZyEKNcLr
+EObkKvbdMgDPmQVL
+EPCjjvbdxrmiMrBg
+EObjjvbdZGvdAPSi
+EPCkKvbdvvkaWBWV
+DncKjvbdfMewHNJk
+DoCjjvbdlrYtyrdJ
+DncLKvbdiLeDnVCy
+DnbjjvbdvwLaWBWV
+EOcLKvbdVBCRSprZ
+DoDLKvbdYzbfSKVy
+DnbkKvbdXrlBNUPY
+EObjjvbdKfFhCAqV
+DoCkKvbdVTmTekvK
+EPDLKvbdaSGChTfL
+DncLKvbdauCGwjsh
+EObjjvbdBcpBWJlf
+DnbjjvbdZjTIQHCG
+DoCkKvbdDjHiuxKA
+EObkKvbdZxdKNblS
+DoDLKvbdptTfrRjt
+DoDLKvbdJbjCqKDY
+EOcKjvbdEJhKWYKA
+DnbkKvbdssSSyZeD
+EOcLKvbdZshhyESn
+EPDKjvbdRjxfUgKs
+DncKjvbdwygefYEr
+EPCkKvbdiLeEOVCy
+DnbkKvbdTvLojTaR
+DoCkKvbdzdzOzdyp
+EPDKjvbdVUNUGMWK
+EObjjvbdqdEhonVa
+EPDKjvbdKefHbAqV
+DncKjvbdtSqsYzFD
+DoDLKvbdZjTIPgBf
+EPCkKvbdRjyFuHLT
+EOcKjvbdUtMsfLvK
+DoCjjvbdnHEwlnGy
+DnbjjvbdURQnttgm
+DoCkKvbdFfJrOIsq
+DoDLKvbdjKGIKMwr
+EOcKjvbdTAEiIBnd
+EPDLKvbdFxttaEXb
+DoDKjvbdJTZAsNYM
+EPCkKvbdFejSNhtR
+EPDKjvbdwkXEHzyf
+DnbjjvbdbUafxLTh
+DoCkKvbdZQleJNEq
+EPCjjvbdmpZyVkZC
+DnbjjvbdmJEUQuRa
+EObkKvbdrEFIpNua
+EOcLKvbdJpzEnfNe
+DnbjjvbdyTNiMqag
+EObjjvbdNQYQvOHT
+EPDKjvbdGKdrbgmV
+EOcLKvbdCJKakIej
+DncLKvbdlhcsptrB
+DnbjjvbdZirhPfaf
+DncKjvbdZoNiFFZj
+EOcLKvbdjuwNcaww
+EOcKjvbdUyITzLPO
+DnbjjvbdxVMdpyLn
+EObjjvbdnCJwXnnV
+EPCjjvbdIMBznWqL
+EObkKvbdJpzFOenF
+EObjjvbdlhdTpuRa
+DncLKvbdSCDdkiZL
+EObjjvbdZxcimcMS
+EOcKjvbdxVMdqZLn
+DoCkKvbdrJAKFMne
+EObjjvbdXsMAmUPY
+EObjjvbdeFOqbWbj
+DncKjvbdCTBCsfWr
+DoCjjvbdRyjHsCvA
+EPDKjvbdziuQQDrt
+EOcLKvbdziuPocrt
+EPCkKvbdWWhwvEEg
+EPCkKvbdeEoRavcK
+EPCjjvbdSKyFuGkT
+EPCjjvbdrEFIonWB
+EObjjvbdrEFIpOVa
+DncKjvbdzGyMANEw
+EPDKjvbdrRtjmjaN
+DoCkKvbdJbjDRKDY
+EObkKvbdfNFvgNKL
+DnbkKvbdZHWdAPTJ
+EPCjjvbdCDoaWKMf
+DncLKvbdJKEAKPgE
+DnbjjvbdssSTYydc
+EOcKjvbdIsYaTNYM
+EPCkKvbdgPazvcxI
+DoCjjvbdmozYvLYb
+DnbkKvbdeATqNYKG
+EObjjvbdIwsbIMQp
+EPDLKvbdpssfrSKt
+EPCkKvbdhzUfLpmf
+EOcKjvbdNGcPlpUk
+DncLKvbdhkeEOVDZ
+EPDKjvbdLFfIBaRV
+EPCkKvbdJuuGEFGi
+EOcKjvbdRacdlJYk
+EPCjjvbdmbKWxOmu
+EPDLKvbdwtmFQxkn
+DnbjjvbdgvyAzzAJ
+EPDKjvbdNrsugFVQ
+DncKjvbdmttzLKRf
+DnbkKvbdZyEKNcLr
+EObkKvbdxrmiNRag
+DoDLKvbdiMFDnVCy
+EObjjvbdWSNxBdlD
+DnbkKvbdCTBDUFwS
+DoDKjvbdYTLaMtPY
+EOcLKvbdZtIiZDrn
+EObjjvbdYzcGSJvZ
+EObkKvbdCSaDUFvr
+DoCjjvbdTppnuUgm
+DoCkKvbdOTUVfduQ
+EOcLKvbdfpBzwDwh
+DncKjvbdGBPQyJzm
+EPCjjvbdVZITyjnn
+EObkKvbdVhXuxGxz
+EObjjvbdiifHimXr
+EPDKjvbdvwMAvAvV
+EOcKjvbdkWXODbYX
+DoDKjvbdmbKXXnnV
+DoDLKvbdZsiJZDrn
+DoCkKvbdlrZUzTDi
+DoDKjvbdSQTfjGEX
+EOcKjvbdqcdiPnWB
+EOcLKvbdpssgSSKt
+EPDLKvbdhkeENuCy
+EPDKjvbdZQmEhmEq
+DoDKjvbdZtJIxcrn
+DncLKvbdhgJbxujV
+DoCkKvbdDoDKkXCd
+EObkKvbdZGvdAOsJ
+EObkKvbdwjvdHzyf
+EPCjjvbdUQpoUuHm
+EPDKjvbdUGznMXVe
+DnbjjvbduaEYroFI
+DoDLKvbdehLWRnRH
+DoDLKvbdgQBzwEYI
+EObkKvbdbUagYKsh
+EObjjvbdyqPMhiwA
+EPDKjvbdvvkaWBWV
+DnbkKvbdJTYaTNYM
+DoDKjvbdZtIhxdSn
+EOcLKvbduaEZTOdh
+EObjjvbdkNCMZeGo
+EPCjjvbdZLqdTnLm
+DoCkKvbdUsltFkuj
+DncKjvbdnPyyVkZC
+DoDLKvbdwjvdHzzG
+EPCkKvbdGKdsCgmV
+DnbjjvbdiMFDmtby
+EObjjvbddneSjtUS
+DncLKvbdezvZFJUX
+EPCjjvbdhbOcFWqR
+DoCkKvbdaMjbTVMg
+DoDLKvbdHDjvKCJj
+EOcLKvbdpxoIHRDx
+DoDKjvbdZshhxcrn
+EOcLKvbdcJNKKewY
+EObjjvbdTppntuHm
+EPCjjvbdemGWfmJk
+DoCkKvbdjcLkQftg
+EObkKvbdQwODbkgc
+EPDLKvbdCTAcUFwS
+DnbjjvbdvOszpkPU
+EOcKjvbdkClLRHUg
+EOcLKvbdNHCpMpVL
+EObjjvbdZMRcsnMN
+DoCjjvbdpxnggQcx
+EOcKjvbdyTOJNRbH
+EPDKjvbdeKKRutzn
+DncKjvbdrzLosAgn
+EPDKjvbdYzcGRjWZ
+EPDKjvbdQcbaPpdS
+DnbkKvbdtkxXAsaX
+DncKjvbdCDpAvKMf
+EPDKjvbdHEKvKBjK
+EOcKjvbdfpBzvdYI
+DncLKvbdiifIJmYS
+EPDLKvbddeOqbWbj
+DnbkKvbdZyDinDMS
+DoDLKvbdkNCLydgP
+EOcLKvbddePSCWbj
+DnbkKvbdZxcjNcMS
+DoCjjvbdQwNccMID
+EPDLKvbdiiehKMwr
+EOcLKvbdCTBDUFwS
+EPDLKvbdbLMGOnDA
+EOcLKvbdUMWOaVni
+DnbjjvbdyqPMhjXA
+DncKjvbdCTAbsewS
+DncKjvbdMpYQvOHT
+EPDKjvbdTqRPVVIN
+DoCjjvbdZxdJnClS
+DoCjjvbdWSNwbElD
+DnbkKvbdrWokcIxq
+EObkKvbdWIYWXgYz
+EPDKjvbdzitopDsU
+EObjjvbdUVkojUBR
+EPDLKvbdEObkLXCd
+EOcKjvbdrbFmMHKy
+DnbjjvbdehKuqmpg
+EOcLKvbdZshiYcrn
+DoCjjvbdZnnIdeZj
+EOcLKvbdmttzLKRf
+EObjjvbdGZUuBDwb
+DoCjjvbdHDjvJaij
+DnbjjvbdKQzFPGNe
+DncKjvbdRbDeMJYk
+DoCjjvbdezuyEhsw
+DoDKjvbdwkWdHzzG
+DncKjvbdEASJMyvw
+DncLKvbdyfyMANEw
+EPCjjvbdCSaDTfXS
+EOcKjvbdCJKajiGK
+EObjjvbdrJAKFNOe
+DnbjjvbdFWZPoljF
+DnbjjvbdmpZyVjyC
+EPDKjvbdiifIKNYS
+DncKjvbdGAnqYizm
+EOcKjvbdiMFEOVDZ
+DnbjjvbdJXtBglRQ
+DoCkKvbdijGHilwr
+DoCjjvbdDwxMUUUM
+DoDLKvbdUMWPBVni
+EPCjjvbdDwwksssl
+DnbkKvbdNeDshhkE
+EObkKvbdbAudfQQX
+DnbkKvbdwuMdqZLn
+DnbjjvbdijGHjNXr
+EPCjjvbdOFETiIkE
+DoCjjvbdxsOImSCH
+DoCkKvbdLiBkqYAS
+DncKjvbdFkFTDHmV
+DoCjjvbddoErjstS
+EObjjvbdyOTIXsIc
+DncKjvbdeXzTtSFz
+DoCjjvbdqdFIonWB
+EPDLKvbdMpYRWNgT
+DoDLKvbdfNGXHNJk
+EPCjjvbdePErkTsr
+DoCjjvbdNHCpNQVL
+EObjjvbdsQVnjCuf
+DnbjjvbdtcDUwWPP
+DoCjjvbduaDySndh
+EPDKjvbdqZPIGqDx
+EObjjvbdijFgimYS
+DncKjvbdZyEJmblS
+DoDKjvbdirziSkJz
+DncLKvbdeOeTKtTr
+EOcKjvbdfpBzwEYI
+DnbkKvbdezvZFItX
+EPCjjvbdrRuLOKaN
+DncLKvbdbrbjscjB
+EObkKvbddBrlrAUN
+EPDKjvbdZoOIdeZj
+EOcKjvbdGYuUaEYC
+EPCkKvbdNxPVzdNt
+EOcLKvbdhlFDmuDZ
+DncKjvbdKVtecdgJ
+EPDLKvbdqlzJxkhJ
+EOcKjvbdySmhlqbH
+EPCkKvbdxsNiNRag
+EPDKjvbdTYKkmzjx
+EObkKvbdIryBTMxM
+EPDLKvbdxnShXsIc
+EPCjjvbdaSFbhUGL
+EObjjvbdRDbaQQdS
+EObkKvbdrbFmMGkZ
+EPCkKvbdWXJXudEg
+EOcLKvbdcJNKKfXY
+DncKjvbdEuxpPljF
+DncKjvbddCTNSATm
+EOcLKvbdFVyQPmKF
+EPCkKvbdpeceUWBI
+DoDLKvbdVTmUGMWK
+DoCjjvbdFyVVBEXb
+EOcLKvbdTukpKTaR
+DncLKvbdDHLegAzc
+EPCjjvbddxZtTrFz
+DncKjvbdssRsZZeD
+DoDKjvbdeOeSjstS
+DoDKjvbdQdDApQcr
+DncLKvbdURQoUuIN
+DnbkKvbdezuxdiUX
+EPCjjvbdbPgHDkzd
+EOcKjvbdFWZQQMjF
+DoDKjvbdMfcQMotk
+EPCjjvbdrWokbiYq
+DoDKjvbdnGdwmOGy
+EOcKjvbdnBjXYOmu
+EOcLKvbdDoCjjvbd
+DoDLKvbdsQVoJbuf
+EObkKvbdZirhQHBf
+EPCkKvbdIGgZxwwg
+DncLKvbdrMzKZMIJ
+DnbkKvbdkHflFemk
+EObkKvbdfHkWSORH
+DnbkKvbdwygfGYEr
+EOcKjvbdxmrgxTJD
+DnbjjvbdGdLViaij
+DoDKjvbdmSYtysEJ
+EObkKvbdfILVqmpg
+DncLKvbdADSXizIp
+DoCjjvbdznpQdbkx
+DncLKvbdmbKWxOnV
+EPCkKvbdJvUfEEfi
+EOcLKvbdcScLTdJa
+DnbjjvbdQcbaPpdS
+EPDKjvbdDoDKjvcE
+DncKjvbdhzUfMROG
+DncKjvbdbrcKtDia
+EOcLKvbdJpydoFme
+DnbjjvbdxLWdHzyf
+EPCjjvbdwuMeQyMO
+EOcLKvbdiifHimXr
+EOcLKvbdySmiNSCH
+EPCjjvbdznopeCkx
+EPDLKvbdZshhyESn
+DoDLKvbdrDeJQNvB
+DoDLKvbdILaznXQk
+DoCjjvbdnUtzKiqf
+DnbkKvbdjJehKMwr
+EOcLKvbdDxXlUUUM
+DoCkKvbdtSqsYyeD
+DoDKjvbdxVMeQxlO
+EPDLKvbdZjTHofaf
+EObkKvbdZisHogBf
+DnbkKvbdnBiwXoOV
+DoCkKvbdYSkaMtPY
+DncLKvbdHELVibKK
+EPCkKvbdhlEcnVCy
+EPCkKvbdZLqdTnMN
+DoDKjvbdbsCkUEKB
+EPCkKvbdMpYRVnHT
+EOcLKvbdFWZQPljF
+DoDLKvbdznoqEcLx
+DnbkKvbdcImJjewY
+EPCkKvbdvvlBVaWV
+DoCkKvbdmIdTqUrB
+DncKjvbdxZgeexFS
+EOcLKvbdrouoJbvG
+DoCkKvbdWRnYBdlD
+DoCkKvbdBhjbLJFj
+DnbjjvbdrouoKDWG
+DoDKjvbdUxgsyjnn
+DoDLKvbdakMFnnDA
+EOcLKvbdZtJJYcsO
+DncLKvbdrbFllHKy
+EPCjjvbdmajXXnmu
+DncLKvbdpyPHgQdY
+EObjjvbdyNrgwsJD
+EPCjjvbdaMjaruMg
+DncLKvbdYfwEAPTJ
+DoDKjvbdbiNKLFvx
+DoCjjvbdajkfOnDA
+EObjjvbdZoOJEeZj
+EOcKjvbdqZOhGqEY
+EOcKjvbdziuPodTU
+DoDKjvbduLxWaUBX
+EObkKvbdyXhjBoyk
+DoDKjvbdTkunaWPJ
+EObkKvbdBraCsfXS
+DoDLKvbdTAEiICPE
+DnbkKvbdDjHjVwjA
+EOcKjvbdqlzKZLhJ
+EObkKvbddneTLTsr
+EObkKvbdWRmwaeMD
+DoDLKvbdLBLHNBwq
+DoDLKvbdUxhUZkPO
+DncKjvbdYlSDsmkm
+DoCkKvbdxZhGFwdr
+EObjjvbdbsDKsdJa
+EPCkKvbdGYuVAdYC
+EObkKvbdRXNccLhD
+DnbjjvbdFVxpQMjF
+DoDLKvbdMgDQNPtk
+EObkKvbdQvmccMHc
+DncKjvbdMpXqVnHT
+DoCjjvbddZxoxYqC
+DncKjvbdnVUzKjRf
+DoCjjvbdEuyQPmKF
+DoDKjvbdLYqKSzuG
+EPDLKvbdTAFJICOd
+DoCjjvbdCJLCKiFj
+EOcLKvbdFyVVAcwb
+DoCjjvbdbQHHDkzd
+DoCkKvbdNrsvGduQ
+DnbjjvbdRWmcblID
+DnbkKvbdQvnEDLgc
+DnbjjvbdVZITzKnn
+EPDLKvbdxxJJaoyk
+EObkKvbddoEsLUTr
+DncLKvbdZQldhldq
+DoDLKvbddCSmSAUN
+DoDLKvbdYpldhldq
+DoDLKvbdDxXlUTsl
+EPCkKvbdnGdxMmfy
+DncKjvbdwWlBWAuu
+EOcLKvbdkDMKpgUg
+DoDLKvbdZshiYdSn
+EPDLKvbdhfjCyWKV
+EObjjvbdKRZeOeme
+DoCkKvbdznopdcLx
+EPCkKvbdZMSDsnMN
+DnbkKvbdkWWmcbXw
+EObjjvbdpxoHfqEY
+DnbkKvbdtlYXAsaX
+EPDLKvbdjvXNcaww
+EPDLKvbduDDVXVoP
+DoDKjvbdLGFgbBQu
+EObjjvbdmuUzLKRf
+EObjjvbdRaceMIyL
+EPDLKvbdiHKCyVjV
+DoCkKvbdxnTHwriD
+EOcLKvbdZjTIPgCG
+DncLKvbdBcpBVjNG
+EPDLKvbdVwIxVceH
+DoCkKvbdkIGkeemk
+DnbkKvbdozmdKxPA
+DoDKjvbdjuwNdCXw
+DoCkKvbdeEoSCXCj
+EPCkKvbdcScKtEJa
+EPDLKvbdySnIlrBg
+EPCjjvbdnQZyVkYb
+DoDLKvbdqYnggREY
+EObkKvbdBsBDUGXS
+DnbkKvbdUWLoitAq
+DoCkKvbdIGgZxxYH
+DoDLKvbdvwLaWBVu
+EObjjvbdmfeXlnHZ
+EPDLKvbdRXNdDMID
+EPCjjvbdZLrDsmkm
+EOcKjvbdUQpoUuHm
+DnbkKvbdEzsqFMDJ
+EOcLKvbdQlwayOUz
+EPDKjvbdyzdnRhJI
+DoDLKvbdwzHfGXeS
+EOcKjvbdTvMPitBR
+EOcKjvbdJbicRJcY
+DoDLKvbdFVxpQNJe
+DoDLKvbduLxXBTaX
+DoCjjvbdLYpirzuG
+DnbjjvbdvwMAvBWV
+EPCkKvbdBiKbKiFj
+DncLKvbdIryArmYM
+DncKjvbdySmiNRag
+DncKjvbdeEoRbWbj
+DoDLKvbdjuwOECXw
+EPDLKvbdFWZPomJe
+EObkKvbdjcMLRGtg
+DncLKvbdQwNccMHc
+EPDLKvbdzQoMiJwA
+DoDKjvbdmSYtzSdJ
+EOcLKvbdelfWgMjL
+EOcLKvbdiMFENuCy
+EPCkKvbdezvZEhsw
+EPDLKvbdUVlPisaR
+EPDKjvbdbKlGOmcA
+EObkKvbdzGyMANEw
+DoDKjvbdXFxzUAPT
+EPDLKvbdqrUkNkAm
+EOcKjvbdPxmAGsSK
+EOcLKvbdyfyMAMeX
+EObjjvbduDDUwVoP
+DncLKvbdyYJJbQZk
+DoDLKvbdxVNEqYkn
+EPCjjvbdNPxRWOHT
+EObkKvbdYqNEiNEq
+EPDKjvbdXrlAlsoY
+EPDLKvbdbrcKtEJa
+EObjjvbdGdKvJbJj
+DoCjjvbdrDeJPnVa
+DoDKjvbdZLrETnMN
+DoDKjvbdKVuGDeGi
+DoCkKvbdZtJIyETO
+EObjjvbdYSlAlsoY
+DoDLKvbdCSaDUGWr
+EObjjvbdmfeYNNgZ
+DoDKjvbdtumwiqTA
+DncKjvbdqFdEtWAh
+EPCkKvbdauCHXjtI
+DnbjjvbdvOszqKoU
+EOcKjvbdxrnImSBg
+DoCkKvbdjvWmdBww
+EPCjjvbdmuUzKiqf
+EObjjvbdNdcsiIjd
+EOcLKvbdNPxRVnGs
+EObkKvbdSPsgKFdX
+EPDLKvbdVAbQsQqy
+EPDKjvbdVZHsyjoO
+DncKjvbdJzofXdAN
+EObkKvbdFjeTChNV
+DnbjjvbdjJegjNXr
+DnbkKvbdZLrDsnLm
+DnbjjvbdbAueGQQX
+DncLKvbdQcbaQQdS
+DnbjjvbdFjdrbglu
+DncLKvbdAMgxsWyx
+DnbjjvbdRpUHKGDw
+DncLKvbdMfcPlpVL
+EObjjvbdIwtBhMRQ
+EPCkKvbdelfXGmKL
+DoDLKvbdFkErbhMu
+EPCjjvbdHffyyYXg
+DoDKjvbdOEctJIkE
+DoCkKvbdKkAgvAKZ
+EObjjvbdzitopDsU
+EPCjjvbdRpUHJfEX
+DoCkKvbdZLrDtNkm
+EPCkKvbdijGIKNXr
+DoCjjvbdxUmEpxlO
+DnbjjvbdIxTbIMRQ
+EPCkKvbdMfbpMotk
+DncLKvbdjlbLzFGo
+EObkKvbdrRtkNjaN
+DnbkKvbdRosgKFcw
+EPDLKvbdpfDeUWAh
+DnbkKvbdkxsRryHU
+EPCkKvbdkVvmcbXw
+EOcKjvbdhficZWJu
+EPDKjvbdCEQBWKMf
+DoCjjvbdUyITzKoO
+DnbjjvbdaNKbStmH
+EPDLKvbdFWYpQMie
+EObjjvbdhytekqNf
+EObjjvbdeXyssqez
+DnbkKvbdLAjgNCYR
+DncKjvbdSBdFLiZL
+EPDKjvbdBhkBjiGK
+DoDKjvbdmajWxOmu
+DoCjjvbdrMzJyMHi
+DoDKjvbdZLqctOMN
+EOcKjvbdnPzYujxb
+DncKjvbddoFTKstS
+DncLKvbdjcMLRGuH
+DoCkKvbdbUagYKtI
+DncLKvbdVAaqTRSZ
+EPCjjvbdOEdTiJLE
+EPCjjvbdJvUfEFHJ
+DnbjjvbdIryBTNYM
+EPDKjvbdYpleJNEq
+DncKjvbdZGwEAOri
+DncLKvbdBdQAvJmG
+DoCkKvbdmIdTqUqa
+EPCkKvbdtcCuWuno
+EPCjjvbdmuUyjjSG
+DncLKvbdjAQHApHK
+EPCjjvbdGdKujBjK
+EPDKjvbdYkrETmlN
+DncKjvbdYORAYUut
+DnbkKvbdiHKCxvJu
+EPCjjvbdkHgLfGOL
+DoCjjvbdpssfqqkU
+EPDKjvbdZnmheEzK
+EPDLKvbdySmhlrCH
+EPCkKvbdjJegilxS
+DoCkKvbdqcdhpNua
+EPDKjvbdIHHZyXxH
+DnbjjvbdjmBkydgP
+DoCjjvbdYkqcsnLm
+EPCkKvbdZnmhdeZj
+EPDLKvbdDjIJuwjA
+EOcLKvbdnQZxvKyC
+EPCkKvbdBhkCKiGK
+DnbjjvbdYkrDsnMN
+DncLKvbdyzeNqghh
+DncLKvbdrRuKmjaN
+EPCjjvbdssRsYzEc
+DoDLKvbdZQleJNFR
+EObjjvbdZQleJMeR
+EPDKjvbdtvNxJqTA
+EObjjvbdbBWFGPpX
+EPDLKvbdajkeoODA
+EPDLKvbdSZihTCvA
+EObkKvbdZMRdTnMN
+EPCkKvbdsCFmLgKy
+EObjjvbdVvhxVceH
+EPCkKvbdaaVeFpQX
+DoCjjvbdZQmEhleR
+EOcKjvbdhzUfLpmf
+EPCkKvbdREDBQRDr
+DncLKvbdemFwHNJk
+EOcKjvbdGAnqYizm
+DncLKvbdtTRsZZdc
+DoDLKvbdGGKRmhtR
+DoDLKvbdIidAJogE
+DoCkKvbdxZhGFxEr
+DncLKvbdpxoHgREY
+DnbjjvbdQcbaQRES
+EPDKjvbdjAPfaPgK
+EPCkKvbdvwMAuaWV
+EOcKjvbdZLrDsnMN
+DncKjvbdyqOlhiwA
+EObkKvbdRacdkiYk
+DoDKjvbdUWMQJsaR
+EPDKjvbdUGzmkvvF
+DoCjjvbdhbPDFXRR
+EObjjvbdXGZZtAPT
+EPCjjvbdMoxRWNgT
+EOcKjvbdGFiqmhtR
+DoCkKvbdNPxRWNgT
+EObkKvbdyNrgxTJD
+EPDKjvbdrXPkcJYq
+EOcLKvbdFjeTChMu
+DncKjvbdjvXNcaww
+DncKjvbdkMbMZdgP
+EOcKjvbdDnbkLXDE
+EObjjvbdbBWFGPow
+DoCjjvbdAMhZSwZx
+EPDLKvbdZRNEiMeR
+DoDKjvbdqdEiQNvB
+DoCkKvbddePRavbj
+EPDKjvbdaMjbStlg
+EObkKvbdHgGyxxYH
+EOcKjvbdtkxXBUAw
+DnbjjvbdmSZUysEJ
+EObkKvbdrXQLbhxq
+EObkKvbdVTlsfMWK
+DoDKjvbdSLZGUfjs
+DoCkKvbdFVyPpMjF
+DoCjjvbdhgKCyViu
+EPCkKvbdZMSDtOLm
+EPCjjvbdySmhlqag
+EPDKjvbdWRmwadlD
+EPCjjvbdqZPHfpdY
+DoDLKvbdXsMBMsoY
+DncLKvbdelewHMjL
+EObjjvbdYpleImEq
+DoDKjvbdZirgogBf
+EOcLKvbdrXPlChxq
+EPCkKvbdFVxpQMie
+DoCkKvbdrNZjZMHi
+EOcKjvbdDjIJuxKA
+DncLKvbdeOeSkTsr
+DoCjjvbdZoNhddyj
+DoDKjvbdkWXNcaxX
+DoDLKvbdTpqOtthN
+DnbjjvbdehKuqnQg
+EPCjjvbdmgFXlmfy
+DncLKvbdShyiqAAl
+EOcKjvbdKaKgNBwq
+EPDKjvbdEztREkbi
+EOcKjvbdVviXvEFH
+EPDKjvbdcIlikGWx
+EPCkKvbdUWLojUAq
+EPDLKvbdOStWHEtp
+DoCjjvbdHlBzmwRL
+DnbjjvbdWIYVxHYz
+EPDLKvbdADSXjZhp
+EPDKjvbdRzJgrcWA
+EObkKvbdxrnIlqag
+EObjjvbdRosgKFcw
+DoDKjvbdkySrTYgU
+DncKjvbdsrqrxydc
+EPDLKvbdZyEKODLr
+EPCjjvbdEXxMUUTl
+EOcKjvbdtcCtwWOo
+DncLKvbddndrkTtS
+EPDKjvbdrafMkfjy
+EPCjjvbdJcJbpibx
+EObkKvbdFfJqnIsq
+EPCkKvbdyNsHwriD
+DoCjjvbdaRebgsfL
+DnbjjvbduoTzpjnt
+EPCjjvbdZGvdAOsJ
+DoDKjvbdmozYujyC
+EPDKjvbdZGvdAPSi
+DnbjjvbdmSYtzTDi
+DoCjjvbdRotGjFdX
+EObkKvbdSBceLhxk
+DoCjjvbddijRvUzn
+EObkKvbdMgDQNPtk
+DoCkKvbdFVxoomKF
+DncKjvbdGcjujBjK
+EPDKjvbdBcpAvJlf
+DncLKvbdLBLHNCYR
+EObkKvbdmIctQtrB
+DoDLKvbdFpATXGey
+EPCkKvbdbrbkUDjB
+DncLKvbdcTCjtEJa
+DncLKvbdBsAbsfXS
+EPDKjvbdFpATXGfZ
+DoDKjvbdwuMeQxlO
+EObkKvbdqUUGqrKt
+DncKjvbdZyEKODLr
+EPDKjvbdjhHLefNk
+EPCkKvbdrbFmMGjy
+DoCkKvbdsQWOjCvG
+DoCjjvbdLBLHMbXq
+EObjjvbdrpVnicVf
+EPCjjvbdVqmwaeMD
+DncLKvbdRNYCYnUz
+EObjjvbdRXNdCkhD
+DncKjvbdIHHZyYXg
+DnbjjvbdyTOJMrCH
+DoDLKvbdUsmUFkuj
+DncKjvbdQcbaPqES
+DnbkKvbdmgFYNNgZ
+EOcKjvbdkySrTYgU
+DoCjjvbdHlBzmwQk
+DnbjjvbdaSFcITek
+EObjjvbdQdCaPqDr
+DncKjvbdxVMdpyLn
+EOcKjvbdiMEdOVCy
+DoCjjvbdRosgJecw
+DncLKvbdkDMLQftg
+EPCkKvbdKDKCqKDY
+DoCjjvbdjvWnDaww
+EOcLKvbduVnYJpsA
+DoDLKvbdWRnYBdlD
+DoDKjvbdssSSxzFD
+EPDLKvbdJYTaglRQ
+EOcLKvbdhzUfLpmf
+DoDLKvbdJutfDdgJ
+EOcKjvbdxmrgwrhc
+EObkKvbdwWkaVaVu
+EOcKjvbdxrmiMrBg
+DoDKjvbdRDcApRES
+DoCjjvbddjJrVtzn
+EOcKjvbdxVNEqYlO
+DoCjjvbdJJdAJofd
+DoDLKvbdemGWfmJk
+EOcKjvbdnPyyWKyC
+DoCjjvbdbrcLTcia
+DoDKjvbdjuvmdCXw
+DncLKvbdtkwvaUAw
+EOcKjvbdHDkViaij
+EObkKvbdRDbaPpcr
+EOcLKvbdtSqryZeD
+EOcKjvbdrRuLOKaN
+EOcKjvbdczYowyRC
+DnbkKvbdjcMLQfuH
+DncKjvbdmbJwYOnV
+EPDLKvbdZnmiFEzK
+EPDKjvbdjbkkQgVH
+EObkKvbdJTZArmYM
+DncKjvbdSPsgJfEX
+DncLKvbduMYXBUBX
+EObkKvbdkIHMFfOL
+EOcKjvbdYORAYVWU
+DoCjjvbdyzdmqghh
+DncLKvbdtumwiqTA
+EPDKjvbdQmYCZOUz
+DoCjjvbdtcCtvvPP
+EObjjvbdVTmUGMVj
+EObkKvbdBsAcUGXS
+DoCjjvbdqYngfqDx
+EPCkKvbdtkxXBTaX
+DoDLKvbdACqwiyhp
+DncKjvbdraelkgKy
+EPDKjvbduLwvaUBX
+DncKjvbdpssgSSLU
+EPCjjvbdIxTbHlRQ
+EPDKjvbdPyNAGrqj
+DoDLKvbdnCJvxOnV
+EObkKvbdZRNFJNEq
+DoCjjvbdFxuVBEYC
+EOcKjvbdVAbRSpqy
+DnbjjvbdJbibqKDY
+DoDLKvbdKCicQjCx
+EPCjjvbdNrtVgFUp
+EOcLKvbdZQleJNEq
+DoDLKvbdaRebgsfL
+DoCkKvbdCIjakIej
+EOcLKvbdBraDUGWr
+EPDLKvbdADRxKZiQ
+DoCjjvbdHkazmvpk
+EPDKjvbdUsltGLvK
+EOcKjvbdTkvOaVoJ
+DncLKvbdZnmiEdyj
+DoDKjvbdZtJJYdSn
+DoDLKvbdbiNJjfWx
+DnbjjvbdIsZBTNYM
+EPCkKvbdhbPDEvpq
+DncKjvbdqlyjYlIJ
+DoCkKvbdbsDLTcia
+DoDKjvbdKCjCqKCx
+DoDLKvbdnBiwYOmu
+DnbkKvbdjKGIKMwr
+EPCjjvbdHgGyxxYH
+EOcLKvbdcyxpXxqC
+DncLKvbdlZSrSyGt
+EPCjjvbdTAFIhCPE
+EObkKvbdZdwfzgiC
+DoDLKvbdSLYfUgLT
+DoCjjvbdRMwayNtz
+DnbjjvbdCflGHAzc
+DoCjjvbdrJAKFNOe
+EPCjjvbdjblKpgUg
+EPDLKvbdQccAoqDr
+DnbjjvbdCJKbKhfK
+EPDLKvbdiGibyWJu
+EOcLKvbdyNsHxShc
+EPDLKvbdmIcspuSB
+DnbjjvbdnGdxNOHZ
+DoCkKvbdhzVGMRNf
+DoDLKvbdeFPRawDK
+EObjjvbdsQWOjCvG
+EObkKvbdhzUelQmf
+EObkKvbdeJirWUzn
+DncLKvbdxxIibPzL
+EObkKvbdSBceMIxk
+DoCkKvbdehKvRmqH
+EObjjvbdRbDeLiZL
+EObjjvbdGYtuAdYC
+DnbjjvbdHDkVibKK
+DoCjjvbdKQyeOfNe
+DoCkKvbdmbJvxOmu
+DoCkKvbdULvOaWPJ
+DncLKvbdrWpMCiZR
+EObjjvbdhytfLqNf
+DoCjjvbdgPazvdXh
+DoCjjvbdiHKDYuiu
+EPDKjvbdRWnDbkhD
+DncLKvbdrMzKZLhJ
+EObkKvbdyXhiaoyk
+EPCkKvbdjmCLydfo
+DnbkKvbdDxYMUTsl
+EPDKjvbdxmrgxSiD
+DnbkKvbdmSYtyrci
+EPCjjvbdqvokcIxq
+DoDLKvbdXsMAmUPY
+DncKjvbdDoDKkWcE
+EPCkKvbdMgDPmQUk
+DoDLKvbdKyQirztf
+EPCjjvbdmajWwnmu
+EOcLKvbddCSlrATm
+EPDLKvbdrJAKElne
+DoCkKvbdIsZBTMxM
+DnbkKvbdffMZnGgA
+EOcKjvbdJcKDQjDY
+EObjjvbdxsOJMrCH
+EObkKvbdEKHiuwjA
+DncKjvbdunszpjnt
+DoDLKvbdZjTIQHCG
+DnbjjvbdsQVnibvG
+DnbkKvbdGQATXHGZ
+DnbkKvbdBsBDTfXS
+DoCkKvbdBsAbsevr
+DoCkKvbdRXNdDLhD
+EPCjjvbdRadElJZL
+DnbkKvbdxwhibPzL
+EOcKjvbdCJLBjiFj
+DncLKvbdZMSDsmkm
+DoDKjvbduaEZSoFI
+EPCjjvbdhgJbxujV
+EOcLKvbdCJLBjhfK
+DoCkKvbdZisHpHBf
+DoCkKvbdqFdFUWBI
+EPCkKvbdDGlFgAzc
+DncKjvbdZxcjNblS
+EPDLKvbdLqvmZuQz
+DoDKjvbdxZhGFxFS
+EObkKvbdZdxGzhIb
+DoDLKvbdqwQMChyR
+DoCkKvbdjlalZeGo
+DncKjvbdZRNEhldq
+EPCkKvbdZHXEAPSi
+DoDKjvbdDoDLKwCd
+DnbkKvbdmbJwYPNu
+DncKjvbdMfcPlouL
+DoCkKvbdQwODblHc
+DoCjjvbdNQYQunGs
+DnbjjvbdlqxtzSci
+EOcLKvbdrDdhpNua
+DncLKvbdKefICApu
+EPDKjvbdatagXkUI
+DoCjjvbdaofgDkzd
+EObkKvbdIrxaTMwl
+DncLKvbdSLYfVGkT
+EPCkKvbdelevfmKL
+DncKjvbdFfKSOIsq
+EObjjvbdfILVqnQg
+DncLKvbdZjShPgCG
+DoCjjvbdrNZixlHi
+DnbkKvbddoFTKstS
+EOcKjvbdWSNwbFMD
+EPDLKvbdpxngfqDx
+EOcKjvbdIHGyxxYH
+EOcLKvbdvwMAuaVu
+EOcKjvbdkxrqryGt
+DncLKvbdZjShQHBf
+DnbjjvbdiUzEvquC
+EObkKvbdpxoHfpcx
+DoCkKvbdGAoRZJzm
+EOcKjvbdehLVrOQg
+EPDKjvbdkDMLRGuH
+DnbkKvbdKCjDRKDY
+EPCjjvbdLGFhBaRV
+EPDLKvbdaMjbSuNH
+DncKjvbdWfYzUAOs
+DoCjjvbdsBelkfjy
+DncLKvbdZnmheFZj
+EOcLKvbdatagYLUI
+EObkKvbdWXJXvEEg
+DoDKjvbdZMRdTmlN
+EPCjjvbdWXIwvEEg
+DoCjjvbdkCkjqHUg
+EPCjjvbdijFhJlxS
+EPDKjvbdmSZUysEJ
+DoDKjvbdMgDQMouL
+EPCkKvbdrDdhomvB
+EPCjjvbdRNXbYmtz
+EPCkKvbdUtMtFlWK
+DnbjjvbdGcjvJajK
+EPDKjvbduaDyTOeI
+DncLKvbdziuPocrt
+DoCjjvbdcScKscjB
+DncKjvbdmgExMmfy
+EObjjvbdJcJcQibx
+EPDKjvbdMpXpvNfs
+EObkKvbdyqPNIjXA
+EPCjjvbdCSaDUGWr
+EOcKjvbdZnnJFEyj
+EObkKvbdyOSgwriD
+EPCjjvbdtkwwAtBX
+DnbkKvbdDncLLXDE
+EOcKjvbdZshhxcsO
+DoCjjvbdxVMdpxlO
+DncKjvbdLGGHaaQu
+DoCkKvbdxUmFQyMO
+EPDKjvbdpfEEsvAh
+DoCkKvbdZRMdhldq
+EPDLKvbdYzberJuy
+EObjjvbdfHkWSOQg
+EPDLKvbdRMxByNtz
+DncLKvbdmoyyWLZC
+EObkKvbdhtydvrVC
+DoCkKvbdVhYWYGxz
+EPDKjvbdbVCHXjsh
+EPCkKvbdTlWPBVni
+DncLKvbdFkEsCgmV
+DnbkKvbdIsYaSlxM
+DncKjvbdzaAOffbM
+DncLKvbdaSFcHtGL
+DoDLKvbdiGjDYuiu
+EObjjvbdDigjVwjA
+DncKjvbdqmZixlIJ
+DnbkKvbdRjxfUgLT
+EObkKvbdeAURNYKG
+EPCjjvbdjvWnECXw
+EPCjjvbdNQXqVmgT
+DoDLKvbdxmsHxShc
+EPCkKvbdqwPlChxq
+DnbjjvbduLwwAsaX
+DncKjvbduCbuWuno
+DnbkKvbdJpydnenF
+EPDLKvbdRXOEClID
+DncKjvbdSKyFuGkT
+DncKjvbdczZQYZRC
+EPCkKvbdGZUtaDxC
+EPCjjvbdOAJTUKSA
+DnbkKvbdsZlQSaHn
+DncKjvbduWNwiqTA
+DoDLKvbdRNYCZOUz
+DoCkKvbdVTmTfMVj
+EOcLKvbdeATpmYJf
+DncKjvbdbUbGxKsh
+DnbkKvbdLZRKSztf
+DncKjvbdcJMjLFwY
+DnbkKvbdRadEkhyL
+EPCkKvbdauBgXkTh
+EObkKvbdrJAKFNOe
+EOcKjvbdDnbjkXDE
+DoDKjvbdrafMlGjy
+EOcLKvbdliDtRVRa
+EObjjvbdZjShQHCG
+DnbjjvbdZnmiFEyj
+EPDKjvbdbAueFpQX
+EPCjjvbdVwJYVcdg
+EObkKvbdijGIJmYS
+DoCjjvbdJpyeOenF
+DoDKjvbdYlSDsnMN
+DncLKvbdehLVqmqH
+DnbjjvbdTppnuVHm
+EOcKjvbdSLYetgLT
+EPCkKvbdZyEKOClS
+DoDKjvbdHDjujBij
+EPCkKvbdHkazmvpk
+EObkKvbdkxrrTYft
+EPCjjvbdOTUVfeVQ
+DoCjjvbdYzbfSKWZ
+DncKjvbdkxrrSxgU
+EObjjvbdEOcKkXCd
+EPDKjvbdcTCkTcia
+DoDKjvbdatagXkTh
+DoDLKvbdNHCpMpUk
+DoDKjvbdhtzEvquC
+EPCjjvbddePSBvbj
+DoDLKvbddneTLUUS
+DncLKvbdijFhKMwr
+EPDLKvbdpxoIHRDx
+DncLKvbdqquLOKaN
+EPCkKvbdSCEEkiZL
+DoDLKvbdvAdYroEh
+DncLKvbdDwwksstM
+EOcKjvbdKWVFcdgJ
+EPDKjvbdZnmhdeZj
+DoCjjvbdJSyBTMxM
+DoDLKvbdtcDVXVoP
+EOcLKvbdbAudfPow
+EPCjjvbdpfDdtWAh
+DncKjvbduCcUwWOo
+DnbjjvbdGFirOItR
+DnbjjvbdLBKgNBxR
+DnbjjvbduVnYJpsA
+DnbjjvbdjuvnDbXw
+DoDKjvbdFkFTDINV
+EOcKjvbdEvZQQMie
+DoCkKvbdMfbolpUk
+EPCjjvbdhbPCdwQq
+DoDKjvbdZyEKNblS
+EPCjjvbduCbtwWPP
+DnbjjvbdgLGzbfAE
+EObjjvbdqGDdsvAh
+EPDLKvbdNGbolotk
+DoCkKvbdSPsfifEX
+DncLKvbdbVCGwjsh
+EObkKvbdijGHjMwr
+DnbjjvbdRosfifDw
+DoCjjvbdQccApRDr
+DoDKjvbdqTtHSSKt
+EOcLKvbdsQWPJcVf
+EObkKvbdeOdsLTsr
+DncLKvbdcTDLUDjB
+DoDKjvbdVgwvXfxz
+EOcKjvbduoTzqKnt
+EPCjjvbdYNqAYVWU
+EObjjvbdemGXGmJk
+DoCkKvbdVgxWXfxz
+DoCjjvbdqlzKZLgi
+EPDLKvbdLFfHaaQu
+DnbkKvbdcSbkTcjB
+EObjjvbdgGLzNgHA
+EObjjvbdZjSgpGbG
+DnbjjvbdGckVjBij
+EOcLKvbdUMVnaWOi
+EObkKvbdrylQSaHn
+EPDLKvbdZHWdAOri
+DoDKjvbdyfxlAMdw
+DnbjjvbdZMSDsnLm
+DoDKjvbdOTUVgEtp
+DnbkKvbdJSxaSlwl
+DncKjvbdkNCLzFGo
+DoDKjvbdfMevgMik
+DnbjjvbdMgDPlpVL
+DncKjvbdqquLOLAm
+DoCkKvbdfNFwGlik
+DncLKvbdpxnhHRDx
+DoDLKvbdZMRdTmlN
+EPCkKvbdURRPVVHm
+EPCkKvbdmgEwmOHZ
+EOcLKvbdVAapsRSZ
+DoCjjvbdczZPwxpb
+EPDLKvbdWXIxWDdg
+EPCkKvbdUVlQJtBR
+EOcKjvbdelfWgNJk
+EPDKjvbdUtMtFkuj
+DnbjjvbdRkZFtfjs
+EObkKvbdCJLCLJGK
+DoDLKvbdKVuGEEgJ
+DncKjvbdIxTbHkqQ
+DncLKvbdMSWlzUpz
+EPCkKvbdKefICAqV
+EOcKjvbdtunXjRTA
+DoDLKvbdZMSETmlN
+EObkKvbdapHHELzd
+EObkKvbdmRxtyrdJ
+DoCjjvbdtTSSxzEc
+EObjjvbddeOrBvbj
+DncLKvbdJYUBgkpp
+EPCjjvbduLxXBUAw
+DnbjjvbdSLYetfjs
+DncKjvbdzQnmIiwA
+EPCjjvbdRpUGjFdX
+EOcLKvbdddnqbWcK
+EOcKjvbdWWhwucdg
+EOcLKvbdCWzdJEov
+EPDKjvbdTkuoAuni
+DncLKvbdqUTgSSLU
+DoDLKvbdNHDQMotk
+DncLKvbdWXJXvEEg
+EPCjjvbdaNKaruNH
+EPDLKvbdraelkfjy
+DncLKvbdLqvmZtpz
+DnbjjvbdNddThhkE
+DoDKjvbdzoQQdcLx
+EPDKjvbdYpldiNFR
+EObjjvbdZtJIyDsO
+DoCkKvbdWWiYWDeH
+DoCkKvbdeEoSBwDK
+DoCjjvbdBsAcTevr
+EObjjvbdqvpMChyR
+EPCjjvbdsCGMlHKy
+DnbkKvbduLwwAtAw
+EObkKvbdMRwMyuQz
+DncLKvbdwWlAuaWV
+DncLKvbdHgHZxwxH
+DncKjvbdBsAcTewS
+DoDLKvbdJpyePFme
+DncKjvbdVUNUFlWK
+DncKjvbdEYXktTtM
+DncLKvbdwMvANDeN
+DnbkKvbdtSrTZZeD
+EOcLKvbdJYUBhMRQ
+DncKjvbdlYrrTZGt
+DoDLKvbdliDsqUrB
+EObjjvbdegjuqnQg
+EObjjvbdlZSrTZHU
+DncLKvbdfNGWfljL
+DoDLKvbdLFegbBQu
+DncLKvbdemGXGmKL
+EPDKjvbdDwwksssl
+DnbjjvbdxmsIYTJD
+DoDLKvbdBsBCtGWr
+DoCjjvbdIsYaTNYM
+DncKjvbdJuuGEEgJ
+EObkKvbdkySqsYgU
+DnbkKvbdNPwqWNfs
+EPDLKvbdmIdTptrB
+DoDLKvbdyqOmIjXA
+EPCjjvbdhkeEOUcZ
+DoDKjvbdJqZePFme
+EPDLKvbdfSAvzlCo
+EObjjvbdbhljLFvx
+EOcLKvbdaMkBsUmH
+DoCjjvbdKyRKSzuG
+EObjjvbdcSbjtEJa
+EOcLKvbdkHflGFmk
+DoDLKvbdemFwHMjL
+EObjjvbdSLZGVHLT
+DoCjjvbdJXtCILpp
+EOcLKvbdaaVdfPow
+EOcLKvbdFpATWgGZ
+DoCjjvbdxZgeewdr
+EObkKvbdeEnqawCj
+EObjjvbdhytfMQmf
+DnbjjvbdoznEKxPA
+DnbjjvbdoAKzsgdO
+DoCkKvbdYzbfRivZ
+DoDLKvbdqqtkOKaN
+DncLKvbdqvokcJYq
+EPDKjvbdOStVfeUp
+DoDKjvbdZxcinDLr
+DoCkKvbdcyyQYYqC
+EObkKvbdcIlikGWx
+EOcLKvbdffLzNgHA
+EPCjjvbdMtsRkNAX
+EOcKjvbdpeceTvBI
+EOcKjvbdZsiIxcsO
+DncLKvbdJvVGDdgJ
+DnbkKvbdZMRdTmlN
+EPDLKvbdnCJwXnnV
+EObkKvbdxUldqZLn
+EPCjjvbdNddUJIkE
+DoCjjvbdyYJJapZk
+DnbjjvbdpxoHgQcx
+EObjjvbdHDjvKBij
+DncKjvbdUtNUFlWK
+EPCkKvbdkVvmdBww
+DnbjjvbdgGMZmgHA
+DoDLKvbdmIdTqVSB
+EOcLKvbdzitpPdTU
+DncLKvbdkxrqrxgU
+DoCjjvbdVBBpsRSZ
+EOcLKvbdGFiqmiTq
+EOcKjvbdxsOJMqag
+DoCkKvbdHDkVjCJj
+EPDKjvbdjSziTKiz
+EOcKjvbdCTAbsewS
+EPCkKvbdkWWnDbYX
+DoDLKvbdJSxaTMxM
+DoDLKvbdMoxRWNgT
+DoDLKvbdmuVZkJrG
+EPDKjvbdbUbHXjtI
+DnbjjvbdkWWnEBxX
+EOcLKvbdnPyxukZC
+DnbjjvbdXrlBMtOx
+DoDLKvbdJuuGEFGi
+EPDKjvbdUaBprprZ
+EObjjvbdsrqrxydc
+EObjjvbduCbtwWOo
+DoCkKvbdSLYeuHLT
+DoDKjvbdKQyePFme
+EOcKjvbdeYZssrFz
+DoDKjvbdpxoHfpdY
+EPCkKvbdcIljKfXY
+EPDKjvbdDwwksstM
+DnbkKvbdsQWOicVf
+EPDLKvbdIidAKQHE
+DoDLKvbdrDeJPnWB
+EOcLKvbdZoNiEeZj
+EObjjvbdptTgRrLU
+EPDKjvbdmRyUzTEJ
+DoDLKvbdFxtuBEYC
+DnbkKvbdehLVqmqH
+EPCjjvbdUtNUGLuj
+DoDLKvbdxVNEqZLn
+DncKjvbdySnImRbH
+DoCjjvbdbLMGPNcA
+EPCkKvbdzQoMiKXA
+DnbkKvbdbiMijevx
+EOcKjvbdSQTfiedX
+DnbjjvbdZisIQHBf
+EObkKvbdYpleIldq
+DncLKvbdjmBlZeHP
+DncKjvbdSCDdkhxk
+DnbkKvbdrykpTAgn
+EObkKvbdZQldiMeR
+DnbjjvbdeYZssqez
+EPDLKvbdlYrrSyHU
+EOcLKvbdTpqOttgm
+EOcKjvbdCJLCLIej
+EPDKjvbdUQqOttgm
+EObkKvbdGBOqZJzm
+DncKjvbdqwQMDIyR
+EPDKjvbdbBWFFoow
+EOcLKvbdZMRctOLm
+EPCkKvbdHEKuibKK
+DnbjjvbdNddThiKd
+DncKjvbdJuuFdEgJ
+DncLKvbdRzJgsDWA
+DncLKvbdRWmdCkhD
+EPCjjvbdZRNFImEq
+EOcLKvbdUaBqTRSZ
+EObkKvbdWIXvYGxz
+DoDKjvbdrRuKnKaN
+DoCjjvbdYgXEAPTJ
+DoCkKvbdwuMeQyMO
+EPDLKvbdkHfkfFmk
+DoDKjvbdTqQnuUhN
+DoCkKvbdbKlFoODA
+EObkKvbdrzLoraIO
+DncLKvbdFxuVAdYC
+DoCjjvbdZQldiMeR
+EOcKjvbdJTZBTNXl
+EPDKjvbdsQWPKCvG
+EOcLKvbdeEoRawDK
+EPDLKvbdtTSSxzEc
+DncLKvbdliDsqUqa
+DnbjjvbdZQleImEq
+EPCjjvbdaSGDITek
+DoDLKvbdRWnDbkhD
+EPDLKvbdpedEsvAh
+EPCkKvbdYpldhldq
+DoCjjvbdZoOJEdyj
+EOcLKvbdmoyxvKyC
+EObjjvbdmSZVZsEJ
+DoDLKvbdqUUGrSLU
+EPDLKvbdmpZxujyC
+EPCjjvbdCDpBVilf
+EPCjjvbdFfJrNhsq
+DoDKjvbdsZkosBIO
+DnbjjvbdiBnbdvpq
+DncKjvbdkDMKpftg
+EPCkKvbdatbGxLTh
+DoCjjvbdJTYaTNXl
+DnbjjvbdhkdcnVCy
+DncLKvbdyNrgxTIc
+EPDLKvbdyNsHwriD
+EPDLKvbdBdQBVilf
+DoDLKvbdIsYaTNXl
+DnbkKvbdkxsSTZHU
+EPCjjvbdBsBDUGWr
+EOcLKvbdgQBzwDxI
+DnbjjvbdjblLQfuH
+DnbkKvbdbVBgYKsh
+DncLKvbdMgComPuL
+EPDLKvbdqceIpOVa
+DnbjjvbdqFceTvAh
+EPCjjvbdFWYpQNJe
+DoDLKvbdHDjujBjK
+DncLKvbdIHGyyXxH
+DnbjjvbdeFOqawCj
+DoDKjvbdGQASwGfZ
+DncLKvbdrWokbhyR
+DncKjvbdSKyFtfkT
+DoCkKvbdemFvfmKL
+EPDKjvbdxsNhmRbH
+EOcKjvbdsPunicVf
+EObjjvbdrbGNMGjy
+EPDLKvbdOXoVzcnU
+EOcLKvbddZxpYYpb
+DoDKjvbdVBBpsRRy
+EPDKjvbdHDkWKCKK
+DoCkKvbdSiZjRAAl
+EPDKjvbdURQoVVHm
+DoCkKvbdpyPHgQdY
+EOcKjvbdGAoQxizm
+DnbjjvbdMpXpvNfs
+DncKjvbddndrjtUS
+DnbkKvbdlhcsptqa
+DoCkKvbdfNFvfmKL
+EPCkKvbdHffyxxXg
+DoCkKvbdYpleImFR
+DoCkKvbdbBVdfPpX
+DncLKvbdWSNxBdlD
+EPDKjvbdSQTfjFcw
+EPCjjvbdkxrqsYgU
+EPDKjvbdrovOjCvG
+DoCjjvbdaSGCgsek
+DncLKvbdZGwEAOri
+DoDLKvbdJmADzHUa
+DoCjjvbdNdcshiKd
+DoCkKvbddneTLTtS
+EObkKvbdMoxQumfs
+DncKjvbdVgxVwfxz
+DoDKjvbdGcjuibKK
+EObkKvbdTqQnuUhN
+DncKjvbdURRPUuIN
+EObkKvbdbrbjtEJa
+DnbkKvbdKQyeOenF
+EObjjvbdbKkfOnDA
+EPDLKvbdlhdTptrB
+EObjjvbdxnTHxTJD
+EObjjvbdKCjCpjDY
+DoDLKvbdMSWmZtpz
+DoCkKvbdBsBCsfXS
+DnbkKvbdfRaWzkcP
+EPDKjvbdbAvFGQQX
+DoCjjvbddoFSjtUS
+DnbjjvbdypoNJJwA
+EPDKjvbdzdzOzdyp
+EObjjvbdJpzEoFme
+DoCkKvbduCbuXWPP
+EPCkKvbdFfJrOItR
+DoDLKvbdkIGlFfOL
+DnbjjvbdbAudfPpX
+DoDLKvbdtAHRIABS
+EOcLKvbduDCuWuno
+DoDKjvbdkHgLfGNk
+EOcLKvbdxZhFeweS
+EObkKvbdUxgszKoO
+EOcKjvbdiBoCeXRR
+DnbkKvbdZeXfzhJC
+EObkKvbdtcDUvvPP
+EOcKjvbdMtrrLNAX
+DnbkKvbdWXJYVceH
+DnbkKvbdJbjCpibx
+EPCkKvbdajlFnnDA
+DnbjjvbduaEZTPEh
+EOcKjvbdGcjuibJj
+DncLKvbdKefHbAqV
+DoDKjvbdUxgtZjnn
+EPCjjvbdVZITzKnn
+EPDKjvbdHkaznXRL
+DnbkKvbdOEdTiIkE
+DnbjjvbdiGjDYvJu
+DoDKjvbdnUtykJrG
+EPCkKvbdBdQBWKNG
+EPDKjvbdsBemLfkZ
+EPCjjvbdtumwiqTA
+EOcKjvbdnCKXYPOV
+DncLKvbdVwIxVdFH
+DnbjjvbdWIYWYGxz
+EObkKvbdFpATXHFy
+DoCjjvbdauBgXjtI
+DnbkKvbdTqROuVHm
+DnbjjvbdlhcsqUqa
+EPDLKvbdxZhGGXeS
+DoDLKvbdZjTHogCG
+EOcKjvbdbKlGOnDA
+EObjjvbdLiBlRYAS
+DncKjvbdxrnJMrCH
+EOcLKvbdMJBlRYAS
+EOcKjvbdUsmTekuj
+DnbjjvbdEYYMTssl
+EObkKvbdZMSEUNkm
+DncLKvbdGGKSNhsq
+DoDKjvbdGZVVAdXb
+EPDKjvbdKRZdoFnF
+EOcLKvbdEXwlUTtM
+DoDKjvbdEztQeLcJ
+DoCkKvbdJYUBglQp
+DoCkKvbdJTZAsNXl
+EObjjvbdvmWAMdEm
+EPCjjvbdxZgefYFS
+DncKjvbdtTRrxzEc
+EOcLKvbdiGjDZWJu
+DoCkKvbdYlRctOLm
+DncKjvbdDxXlTtUM
+EPCjjvbdcyxpYYqC
+EOcLKvbdqGDeUWBI
+DnbjjvbdnPyxvLZC
+DoDLKvbdKefHbApu
+DoCkKvbdjblKqHVH
+EObkKvbdTfzmkvue
+EOcKjvbdZnmiEdzK
+EOcKjvbdDxXkstTl
+EPDLKvbdBdQAujMf
+DoDKjvbdGZVVBDwb
+DoDLKvbdEvZPpMie
+EPCjjvbdVwJXuceH
+DoDLKvbdRjyFtgLT
+DoCkKvbdXsLaNTnx
+DnbjjvbdDHLfHAzc
+DoCkKvbdVBCQrprZ
+DoCkKvbdyNsIYShc
+EPDKjvbdyXiJbPzL
+DoCjjvbdUsltFlWK
+EPCkKvbdcyyQYZRC
+DnbkKvbdddnqbWbj
+EPCkKvbdmuUyjjSG
+EObkKvbdZyDinDLr
+DnbjjvbdZtIiZESn
+EPCjjvbdVBCRTRRy
+EOcLKvbdCWzciFPv
+EObkKvbdrEFJPnWB
+DnbkKvbdqUUHSRkU
+EPDLKvbdlqyUyrci
+DoCjjvbdIMBznXQk
+DoCjjvbdUxgsykOn
+EPCjjvbdXsMBMsnx
+DncKjvbdjuvmdBxX
+EOcLKvbdkIGkeemk
+DoCjjvbdjKGIKNYS
+EPDLKvbdSLZGVGjs
+EOcKjvbdMfcPmQUk
+DoCjjvbdrNZjYlIJ
+EOcLKvbdkyTSTZHU
+EObjjvbdjAQGaQHK
+EPDKjvbdMoxRVnHT
+EObkKvbdeATpmXif
+EObkKvbdFjdsDHmV
+DncLKvbdbLLfOmcA
+EPCkKvbdunszqLOt
+DnbkKvbdnQZxvLZC
+DncLKvbdZyDjNblS
+DnbkKvbdptTfrSKt
+DoDLKvbdzaAOgHCM
+EPCjjvbdhbPCeXRR
+DnbkKvbdmuVZkKSG
+DoCkKvbdziuQQESt
+DnbkKvbdhgKDZWKV
+DnbjjvbdULuoBWPJ
+DncLKvbdWXJXucdg
+DoCjjvbdRacdlJYk
+DoDLKvbdegjvSNqH
+EOcLKvbdnUtzLKRf
+EOcKjvbdFxtuBEXb
+DoCkKvbdmIcsqUrB
+EObjjvbdULvPAvPJ
+EOcLKvbdSwkLmzkY
+EPCkKvbdSZjITCvA
+EPCkKvbdeOdrjtUS
+EPCjjvbdIxUBhLpp
+EObkKvbdqiAJeMoF
+DnbkKvbdhlEcmtcZ
+EOcLKvbdFejRnJTq
+EOcKjvbdwXMAvBWV
+DoDKjvbdmpZyWLZC
+DoCjjvbdGLErbhNV
+DoDLKvbdmaivwnmu
+EOcLKvbdOXoVzcnU
+DncLKvbdBhjbLJGK
+EPDKjvbdZjTIQGaf
+DoCkKvbdgPazwEYI
+DncLKvbdGGKRmiUR
+EObjjvbdfHkWRmpg
+DnbkKvbdXrkaNUPY
+EPCkKvbdzQoMhiwA
+EOcKjvbdrpWOjDVf
+DncKjvbdZtJJZDrn
+EPDKjvbdqZOggRDx
+DnbjjvbdhgJbyWKV
+DoDKjvbdiVZdwRuC
+DoDKjvbdIwtCHkpp
+DoDKjvbdVAapsRRy
+EPDLKvbdwjvcgzzG
+DoDLKvbdRyihScWA
+DoDLKvbdrRuKmkAm
+DnbkKvbdqGDdsuaI
+EPCkKvbdAMhYrwZx
+DncKjvbdSPsfjGEX
+DncKjvbdczYpXxpb
+DoDLKvbdkIHMGFmk
+EPCjjvbdkClKqHUg
+EObkKvbdxVMdqZMO
+DoDKjvbdBdQBVjMf
+EObkKvbdZjTHpGbG
+EPDKjvbdTfzmkvue
+EPCkKvbdLAjfmCXq
+DoCjjvbdLGGHbApu
+EPDKjvbdEzsqEkcJ
+DoDKjvbdwygfGYFS
+DoDLKvbdhgJbyWKV
+EPDLKvbdZshiZETO
+EPDLKvbdKWUfDdfi
+DnbkKvbdqYoHgQcx
+DncKjvbdnGeYMmgZ
+EPDKjvbdKCjDRKDY
+DoCkKvbdJcKDQibx
+EObkKvbdZoNiFFZj
+EPCkKvbdUyHsykPO
+EOcKjvbdtvNxKQsA
+EObjjvbdatafwjtI
+DoDLKvbdhzVFkpmf
+EObkKvbdMgComQVL
+EPCkKvbdSCEEkhxk
+DoDLKvbdgFlZnGgA
+EObjjvbdZMSETnLm
+EObkKvbdtumxKQsA
+EObjjvbdZoOIddyj
+EOcLKvbdqZOggQcx
+EOcLKvbdKfFhBaQu
+DncLKvbdzGxlANEw
+EObjjvbdehLWRnQg
+EObkKvbdEPCjkWbd
+EObkKvbdqYnhHRDx
+EObkKvbdjvXODaww
+DnbjjvbdqTsgSRkU
+EOcKjvbdTqQoVVHm
+DnbjjvbdQmYBxnUz
+DnbjjvbdpyOhGqEY
+EOcLKvbdLGGHbAqV
+EObkKvbdZirgpHCG
+EObkKvbdqYnhGpcx
+DncLKvbdrbGNLgKy
+EObkKvbdkySrSxgU
+EOcLKvbdeAUQlwjG
+DncKjvbdkVwNdCYX
+DoCjjvbdJvVGDeHJ
+EPCkKvbdEuyPpNKF
+EOcKjvbdDjHivXjA
+DnbjjvbdkNCLydfo
+EPCjjvbdZjTHogBf
+DoDKjvbdGKeTDINV
+DnbkKvbdJXtBglQp
+DnbjjvbdFejSOIsq
+EOcKjvbdhytelRNf
+DnbjjvbdbBVdeopX
+DoCkKvbdFjdsDINV
+DoDLKvbdjvXNcbXw
+DnbkKvbdZdxGzhJC
+EPDLKvbdjAPgBQGj
+EObjjvbdJXsbHkqQ
+EPDKjvbdiVZdwRtb
+EObjjvbdGFjSNiTq
+EPDKjvbdznpQdbkx
+EPCjjvbdemFvgNKL
+EPDKjvbdWXIxWEEg
+DncLKvbdEObkKvcE
+DnbjjvbdLAjfmCYR
+EPDLKvbdEXwkstTl
+EObjjvbdFfKSNhsq
+DncKjvbdygZMANFX
+EPCkKvbdYqNFIleR
+DoCkKvbdSKyGUgLT
+DncKjvbdBdQBVjNG
+DnbkKvbdbUagYLTh
+EOcKjvbdsPunjDWG
+DncLKvbdrEFIonVa
+DncKjvbdaSGChTfL
+DoCkKvbdcJNKKfXY
+EObkKvbdULuoBWOi
+DncLKvbdKWVGEEgJ
+EPCkKvbdqFdEsuaI
+EPDKjvbdAMgySvyx
+DncLKvbdiUzEwRuC
+EObjjvbdZoNheEzK
+DnbkKvbdZLrETnMN
+EObjjvbdKWVFcdfi
+DoDLKvbdcScLUEJa
+EPCkKvbdIwsbIMRQ
+EOcKjvbdsBemMHKy
+EOcLKvbdzitoodSt
+EPDKjvbdrMyjZLhJ
+DnbjjvbdaRfCgsfL
+DoCkKvbdKQzEnenF
+EOcLKvbdUGznLvue
+DncLKvbdZxcinCkr
+DnbjjvbdEuyPpNKF
+DncKjvbdGFirOIsq
+EOcLKvbdVqmxBeMD
+EOcLKvbdwuMeRZLn
+DnbkKvbdBhkBkIej
+EOcKjvbdNQXpumfs
+EObkKvbdVBCRTRSZ
+DoDLKvbdZeYGzhJC
+DncLKvbdREDBPqES
+DnbjjvbdvBEZSoFI
+EPCjjvbdakLeoNcA
+EPDLKvbdeFOqbWbj
+EPDLKvbdiGicZWJu
+EPCkKvbdEKHiuwjA
+EPCjjvbdwkWcgzyf
+DoDKjvbdmpZyVkZC
+EPCkKvbdSZihSbvA
+EPDKjvbdelevfmKL
+DnbjjvbdeATplwif
+DoCjjvbdGAnpxizm
+EPDKjvbdTlWPBWOi
+EOcKjvbdmSYtzTEJ
+DncLKvbdnGeXmNfy
+DoDKjvbdTIzJqAAl
+EOcKjvbdqdEiPnVa
+EOcKjvbdcTCkUEKB
+DoCjjvbdEvYopMjF
+DoDLKvbdwuMdpyMO
+EPDKjvbdEuyQPlie
+EOcLKvbdVUMsfMVj
+EObjjvbdijFgilxS
+DoDKjvbdnPyxujyC
+EOcKjvbdTAFIgbPE
+DnbkKvbdZxdJnDLr
+DncLKvbdqdEiPmua
+EOcKjvbdhgJcZVjV
+DnbkKvbdRbEFLhxk
+DoDKjvbdmaivwoNu
+DoCkKvbdZQmFJMdq
+DncLKvbdeYZtTqez
+EObkKvbdqYoIGpdY
+DnbjjvbdEASJMyvw
+DoDKjvbdwzHfGYFS
+DncKjvbdjvXOECYX
+DncLKvbdbBVdepQX
+DoDLKvbdrEFIomua
+DnbjjvbdYgWdAOsJ
+EOcKjvbdkMakydfo
+EPCjjvbdegkWSNqH
+EPDLKvbdYlSEUNkm
+EPDLKvbdzRPMhjXA
+DnbjjvbdmSZUyrci
+EPDKjvbdiiehKNXr
+EPDLKvbdwzIGGXdr
+DncKjvbdSLYetfkT
+EOcLKvbdURROtuHm
+EPDLKvbdEYYLtUUM
+EOcLKvbdaSGDIUFk
+DnbkKvbdhfibyViu
+DncKjvbdeFOqavcK
+EPDLKvbdZtIhyETO
+EOcKjvbdsPuoKDVf
+DoDLKvbdBhkBjiGK
+EPDLKvbdnQZyVkYb
+DncLKvbdNsTugEtp
+EPCjjvbdCDpBWJmG
+DoCkKvbdmIdTqVRa
+EOcKjvbdptUHRqjt
+DnbjjvbdRpTfifDw
+DncKjvbdaRebgtFk
+EPDLKvbdEARiMyvw
+EOcKjvbdyNsHxShc
+DoCkKvbdxKwDgzyf
+DncKjvbdwuNFQyLn
+DncLKvbdegjvSORH
+DncLKvbdOStWGdtp
+EOcLKvbdcTCkTdKB
+DncKjvbdRECaQRES
+DoDLKvbdkIHMFemk
+EPCkKvbdfjfzcGAE
+DncKjvbdZLqdTnLm
+EOcKjvbdIMBzmwRL
+EOcKjvbdwzHeexFS
+EPCjjvbdKVuFdFHJ
+EPCjjvbdRXODcLgc
+DoDLKvbdlrZVZrdJ
+EPDKjvbdjKGIJmYS
+EObkKvbdHEKujCJj
+DncKjvbdNddTiIjd
+DoDKjvbdZjSgpGaf
+DoCjjvbdmfeXlnHZ
+EPCjjvbdRosfifDw
+DoCjjvbdZxcinDLr
+DoCjjvbdNeDsiIjd
+EPDKjvbdVgxVwgYz
+DnbkKvbdqTtGrRjt
+DnbkKvbdTqQntuIN
+DncKjvbdBvzdJEpW
+EPCjjvbdqUUHRrLU
+DnbjjvbdqcdhonWB
+DncKjvbdHDkWKBjK
+DnbkKvbdxVMeQxlO
+EObjjvbdkClKpgVH
+EOcLKvbdCSaDUGXS
+DncLKvbdUQqOttgm
+DoCkKvbdZxcjOClS
+EPDKjvbdVqmxCFMD
+DnbjjvbdqmZixlHi
+DnbjjvbdiUydvquC
+DoCkKvbdOTTugFVQ
+EOcKjvbdUQpoVVIN
+DoCkKvbdNHDPlpVL
+EOcLKvbdDncLKwCd
+EOcLKvbddeOrCXCj
+EObjjvbdqvolChyR
+EOcLKvbdaofgELzd
+DoDLKvbdrpVoKDWG
+DncKjvbdaMjasUmH
+EObjjvbdliETqUrB
+DncLKvbdXsLaMtOx
+EObkKvbdrykpTAhO
+EPDKjvbdehKvRmpg
+EObjjvbdUxhTzKnn
+DncLKvbdTfznMXVe
+EPDLKvbdqUTfqqkU
+DoCjjvbdHELWKCKK
+DoDLKvbdwuNFQyMO
+DoCjjvbdffLynGgA
+EOcLKvbdSLYetfkT
+EPDKjvbdtTRryZeD
+EPDKjvbdddoRbXDK
+DoDKjvbdFVxooljF
+DoDLKvbdxsNiNSCH
+DoDLKvbdsCGNMGkZ
+EOcLKvbdkHfkfFnL
+EPCkKvbdqrUjnLAm
+DnbkKvbdHELViajK
+EOcKjvbdNHDQMouL
+EPCkKvbdWWhxVdFH
+DnbkKvbdUWMPitBR
+DncLKvbdZoOJFFZj
+DncKjvbdcIljKewY
+DoDLKvbdVUNUGLvK
+EObkKvbdNsTufdtp
+DnbjjvbdGKdsCgmV
+EObkKvbduDCtwWPP
+EObjjvbdkMbMZeGo
+EPCkKvbdJSyAsNXl
+DnbjjvbdmbJwXnmu
+EPCkKvbdRjxeuGkT
+EObkKvbdaSFcITek
+EPDLKvbdGYtuAdYC
+DoDKjvbdFeirNiUR
+EPCjjvbdhyuGMQmf
+EObjjvbdDxYLstUM
+EObkKvbdFfKRmhtR
+DnbkKvbdyTNhmSCH
+EPCjjvbdJSyAsNYM
+EPCkKvbdEuxpQMie
+DoDLKvbdkClLQgUg
+DnbkKvbdssRrxzEc
+EPDLKvbdRMwbZNtz
+EPCkKvbdssSTYyeD
+DoCkKvbdYqMeImEq
+EOcLKvbdjuwOECXw
+EOcKjvbdOTUWHFUp
+EPCjjvbdliDtQtrB
+EPDKjvbdZxdJmblS
+DoDKjvbdbVCHXkTh
+DoDKjvbdpstHSRjt
+EOcLKvbdNPwpunGs
+DoCkKvbdLAjgNCXq
+DoCjjvbdDoDKjvbd
+DoCkKvbdZirgpHBf
+EPDLKvbdezuxdiTw
+DoCkKvbdLrXMyuQz
+DncLKvbdqlyjYkgi
+DnbkKvbdLrWlzUpz
+DoCjjvbdhytfLpnG
+EObjjvbdxrmiNSBg
+EPDLKvbdqquLNjaN
+EObjjvbdiHKCyVjV
+DncKjvbdjSziTKiz
+EPCjjvbdCflGHAzc
+EPCjjvbdZtJJZDrn
+EPCjjvbdJKEAKQHE
+EPDKjvbdIxTbHlRQ
+EOcKjvbdZRMdhmEq
+EOcLKvbdmttykJqf
+DncLKvbdEzsqFMDJ
+EPDKjvbdJuteceGi
+EOcKjvbdemFvfmJk
+DoCkKvbdkySqsZGt
+EOcLKvbdlrZVZsDi
+EOcLKvbdEXxLstTl
+DnbkKvbdkNBlZeHP
+DncLKvbdauCHYKsh
+EPCkKvbdhuZeXSVC
+EPCjjvbdOTTufdtp
+DoDKjvbdDoCkKwCd
+DoDLKvbdOAIrsirA
+EPCjjvbdlAmPNALA
+EOcLKvbdiBoCdwQq
+DoCkKvbdnCJwYOnV
+EOcLKvbdqwQLbhxq
+DncLKvbdGYuVBEYC
+EPCjjvbdcyyQXxqC
+EPDKjvbdrEEiPmvB
+DnbkKvbdJbibqJbx
+DncLKvbdiGjCxuiu
+EObjjvbdjKGIJmXr
+EPCjjvbdFkEsDIMu
+EPDKjvbdCWzchePv
+EObjjvbdEObjjwDE
+EPCkKvbdQdDApRDr
+DoDLKvbdbAvEfQPw
+DoDLKvbddtAUATNW
+DnbjjvbdUxhUZkOn
+DnbjjvbdwNWANEEm
+EPCjjvbduDCuWuoP
+DnbjjvbdjAQHApHK
+DncLKvbdJzpFxEAN
+DncKjvbdwtldpxlO
+EObjjvbdBraCtGWr
+EPDKjvbdJmADzGuB
+DoDLKvbdRadEkiZL
+DoCkKvbdAMhZTXZx
+DoCjjvbdqGDeUVaI
+DoCjjvbdVvhxWDdg
+EOcKjvbdSBceMIyL
+DnbkKvbdRkYfUfjs
+EOcLKvbdFWYpQMjF
+DoDLKvbdhlFENuCy
+EObkKvbdiCObeWpq
+DnbkKvbdHELWJaij
+EObkKvbdCTAcTfWr
+EPDKjvbdbrcLTdJa
+DoDLKvbdDncKkXDE
+DoCkKvbdmSYtzSdJ
+EOcLKvbdVZHszLPO
+DnbjjvbdhkdcmuCy
+DnbkKvbdLrXNZuQz
+EPDKjvbdZnmiFEzK
+EPCkKvbdlrZVZsEJ
+DnbjjvbdqmZixkhJ
+DoDLKvbdcTCjsdKB
+DoCkKvbdcyyPxYqC
+DoDKjvbdssRrxydc
+DoDKjvbdvPTzpjnt
+EObjjvbdZLqctOMN
+DoDLKvbdRNXbYnUz
+DncKjvbdJYUBglRQ
+EObkKvbdkIGlGFnL
+DoDLKvbdiUzEwSUb
+EPDKjvbdeEnrCWbj
+DoDLKvbdRbDdkhxk
+EObjjvbdYzcFqjWZ
+EOcLKvbdjggLfFnL
+DncLKvbdgQBzwEXh
+DoCjjvbdQlxByNtz
+DnbkKvbdoznDjwoA
+DnbkKvbdVgwuxHYz
+DoDLKvbdaaVdepQX
+DoDKjvbdLZRKSztf
+EPDKjvbdbUbHXkUI
+EOcLKvbdjhGkfFmk
+EObkKvbdeEoSBvcK
+DncKjvbdUtMtGMVj
+EPDLKvbdJTZAsMxM
+DnbkKvbdOEdUJJKd
+DoDKjvbdZHXEAPSi
+EObkKvbduaDyTPFI
+DnbjjvbdqAiFAWhE
+EObjjvbdelevgNKL
+DnbjjvbdTAEhgbPE
+DoDKjvbdnPzZVkZC
+DoDKjvbdQwNdDLhD
+DnbjjvbdnBjWwoNu
+EObkKvbdfMewGljL
+DncKjvbdrpVnjCuf
+EPDLKvbdLGFgbBRV
+EObkKvbdkCkkRHUg
+EObkKvbdTlVoAuoJ
+EPDLKvbdrMyjZMHi
+EOcLKvbdWHwuxHYz
+EOcKjvbdLrXNZtpz
+EObjjvbdbQHHDkzd
+EOcLKvbdfILWRnRH
+EPCjjvbdyfyMAMeX
+DncLKvbdNHCpNQVL
+EPCjjvbdFkEsDHlu
+DncKjvbdGGJqmhtR
+DnbkKvbdvAcxrndh
+DoCjjvbdqGDeTvBI
+DoCjjvbdJvUfDdgJ
+DoCjjvbdUVlPisaR
+DoCkKvbdqTsgSRkU
+EObjjvbdjblKpftg
+EObkKvbdtcDVXWPP
+DnbkKvbdfHkVqnRH
+DncLKvbdmoyxvLZC
+EObjjvbdkHfkfFnL
+EPDKjvbdwNWAMcdm
+EPCjjvbdJpzFOfNe
+DncKjvbdmbJvxOnV
+DncKjvbdTqQnuUgm
+EOcLKvbdTpqOuVHm
+DoCjjvbdYlSETmkm
+DoDKjvbdjEkGuPAO
+DoCkKvbdwygefXdr
+EObkKvbdrXPkcJYq
+DoCjjvbdxUleQyMO
+EOcLKvbdBsAcTfXS
+EPDLKvbdLBLGlbXq
+EObjjvbdmbJvwnnV
+DnbjjvbdbVCGwjsh
+DnbkKvbdxUmEpyMO
+EPCkKvbdYSlBNTnx
+DoDKjvbdeOeSkUTr
+DncLKvbdqmZixlHi
+EPCkKvbdNHCpNQVL
+DoCkKvbdDigjWXjA
+EObjjvbdrDeJQNvB
+EOcLKvbdJuuGDeHJ
+DoCkKvbdddnrCXCj
+DoDKjvbdqTtGqrKt
+DoDKjvbdeOeTKstS
+EObjjvbdySmiNRbH
+DnbjjvbdZshiYdTO
+EObjjvbdnCKXXnmu
+EPDKjvbdqiAKFMne
+DoDKjvbdNeEUIiKd
+DnbjjvbdzitpPdTU
+EPCkKvbdzaAOffal
+EOcKjvbdZtIiZDrn
+DoCjjvbdtSrTYyeD
+DoDLKvbdFVxopNJe
+DoDLKvbdJJdAJpHE
+DoDLKvbdHDjuiaij
+EObkKvbdUWMQKUAq
+EPDKjvbdTpqOuVIN
+EOcLKvbdqvpMChyR
+DoCkKvbdVviXudEg
+DoCkKvbdGLErbgmV
+EPCkKvbdZirhPfbG
+DoCkKvbdWXJYVceH
+DnbjjvbdhkeEOUcZ
+DncKjvbdSPtHJedX
+DncKjvbdFfKRnIsq
+DncKjvbdWWhxVdEg
+DoCkKvbdOStWHEuQ
+DoDLKvbdEuyQPmKF
+DncKjvbdrpVoKDWG
+DoCjjvbdKVtfEEfi
+DoCjjvbdWXIwudEg
+EPDKjvbdSCDeMIyL
+EPDKjvbdDoDKkXCd
+DoCkKvbdJpzEnenF
+EPDKjvbdaaWEfPow
+DoCjjvbdVwJXucdg
+EPCjjvbdauCHYKtI
+EOcLKvbdNeDshhkE
+DncLKvbdNGcQMpVL
+EOcLKvbdIryBSmXl
+DnbkKvbdTAFJICPE
+EOcLKvbdrMzKYlHi
+EOcKjvbdznopeDMY
+EOcLKvbdMRvmZuQz
+DncKjvbdeFOqbXCj
+DncLKvbdbhlijfWx
+EOcKjvbdqdEhpOWB
+DoDLKvbdUWMQJsaR
+DoDLKvbdptUGqrLU
+EObjjvbdaSGChUFk
+EPCjjvbdYTMAltOx
+DncKjvbdEPCkLWbd
+EOcKjvbdKCjDRKCx
+EPDKjvbdZyDjNcMS
+DncLKvbdFfKRnJUR
+EPDKjvbdrNZiyLhJ
+EOcKjvbdZeXfzgiC
+EOcKjvbdbUbGwkTh
+EPDLKvbdHfgZxwxH
+DncLKvbdrovOjCuf
+DnbjjvbdfNGWflik
+DnbkKvbdZoNiFEyj
+EPCjjvbddneTKtUS
+EObjjvbdRbDdlIxk
+EOcKjvbdKfFgbBRV
+EPDKjvbdFyUuBDxC
+EPCkKvbdiUzFXRtb
+EPCjjvbdrJAJeNPF
+DncLKvbdVAbRSqSZ
+EObjjvbdaNKbTVMg
+DoCkKvbdlhctQtqa
+DoDKjvbdZshiZDrn
+EPDLKvbdFkFSbglu
+EPCjjvbdHffyxwxH
+DncKjvbdTvLojTaR
+DnbkKvbdauCHXkUI
+DoDKjvbdGdKuiajK
+EOcKjvbdkClKqHVH
+EPDLKvbdnUtykKSG
+DnbkKvbdBiKbKhej
+DoDLKvbdHffzZXwg
+EPCjjvbdbrbkTcjB
+DoCkKvbdVwJYWDdg
+DncLKvbdJJdAJogE
+EPCkKvbdJvUfDdfi
+DoDKjvbdZeYGzgiC
+EObjjvbdZyEJnDMS
+EOcLKvbdmSZVZsEJ
+EPCkKvbdDnbjjvbd
+EPCkKvbdJvVGDeGi
+DoCjjvbdTXkLmzkY
+DnbkKvbdLqwNZuQz
+DncKjvbdZtIiYcsO
+DoDKjvbdLYqKSztf
+DnbkKvbdULuoBVni
+EObkKvbdiBnbeWqR
+EObjjvbdfILWRmqH
+DncKjvbdezvYdhsw
+DnbjjvbdJvUfEEfi
+EPCkKvbdRpUHKGDw
+EObkKvbdZGwEAPTJ
+EOcLKvbdcTCkUEKB
+EObjjvbdGAoQxizm
+DnbjjvbdNwoVzcmt
+DncLKvbdJbicRKDY
+DnbkKvbdGZVVAcxC
+EPCkKvbdRadFMJYk
+DnbjjvbdxsNiNRag
+DnbjjvbdiBncFXRR
+EPCjjvbdySmiNRbH
+DoDKjvbdeATqMxKG
+DnbjjvbdtSrSyZdc
+EOcKjvbdwtldpyLn
+EPDKjvbdqwPkbiYq
+EPDLKvbdzitpPcsU
+DoDKjvbdDjHiuwjA
+EPCkKvbdfMewGmKL
+DncKjvbdlrYtyrci
+EPCjjvbdZQldiMdq
+EPDKjvbdJbjDQjCx
+DncKjvbdqTsgRrKt
+EPCkKvbdEvZQPljF
+DoCkKvbdUsltGMWK
+EOcLKvbdEJgivXjA
+DnbkKvbdePFTLTtS
+EPDKjvbdEYYLstTl
+EPDKjvbdMfcPmPuL
+DoDKjvbdBsAcTevr
+EPDLKvbdwtleRZMO
+EObjjvbdRotHJfDw
+EOcKjvbdJuuFdFHJ
+DnbjjvbdZoOIeFZj
+DoDLKvbdsZlQSaHn
+EPCjjvbddoFTLTtS
+DncKjvbdbVBgXjsh
+EPCkKvbdaMkBrtlg
+EPDKjvbddiiqutzn
+EObkKvbdiZuFkpnG
+EPCkKvbdIxTaglRQ
+EOcKjvbduaEYrndh
+DnbjjvbdzQoMiJwA
+DoCkKvbdsCGNMHKy
+EObjjvbdMoxQunHT
+DnbkKvbdxwiJbPzL
+EOcLKvbdJbibpjCx
+DncKjvbdIxTbHkpp
+DoCkKvbdwuMeQxlO
+EOcKjvbdKeehCBRV
+EPCkKvbdZxdKNblS
+EPCjjvbdLFegbBQu
+DoCkKvbduLwwBUBX
+DoDKjvbdjlbMZeHP
+DoDLKvbdjAPfaPfj
+EObjjvbdqGEFTvBI
+EObjjvbdeAURNXif
+EObjjvbdxmrgxTJD
+EPCkKvbdqGDeUWAh
+DncKjvbdqTsfqrKt
+EObjjvbdjEjftoAO
+EOcKjvbdNrtWHFUp
+EObkKvbduCcUvvOo
+EPCkKvbdvwMAvBWV
+DncLKvbdtkwwBUBX
+DoCjjvbdVZHsyjnn
+EPDKjvbdQccBQQdS
+DnbkKvbdjgfkeemk
+EPDLKvbdFyVVBDxC
+DncLKvbdrNZiyMIJ
+EObjjvbdHfgZxwwg
+DoDKjvbdqceIomvB
+EPCkKvbdNGcPlouL
+DoCkKvbdCIkBkIej
+DoCjjvbdjKFhJmYS
+EObkKvbdBsBDUGWr
+EObkKvbdnQZxvKyC
+DnbjjvbdhzVFkqOG
+EPCjjvbdGLFScHlu
+DoCjjvbdtlXwAtBX
+DoDLKvbdUtMtFkvK
+DoCkKvbdBvzchdov
+DncLKvbdlZSrTZHU
+EOcKjvbdZnnJEdyj
+DncKjvbdYpleJMdq
+EPDKjvbdiMEcmtcZ
+EPCjjvbdfelZmgHA
+DnbkKvbdLhalRYAS
+DncKjvbdehLWRnRH
+DnbjjvbdeKJqvUzn
+EPCjjvbdqqtkOLBN
+EOcLKvbdfRaWzlDP
+DncLKvbdhtzFWquC
+EObkKvbdJvVFdFGi
+EObkKvbdMfcPlotk
+DoCjjvbdtcCuWvPP
+DnbjjvbdwtmFRZMO
+DoDKjvbdsPvPKCvG
+EPCjjvbdmfdwmOHZ
+EPDLKvbdMgDPlouL
+DoDKjvbdnGdwlnHZ
+DoCkKvbdVwJXudFH
+EObjjvbdQdCaQQcr
+DnbkKvbdYSkaNUPY
+DoCjjvbdULvPAuni
+EPCjjvbdSZihScWA
+DoCkKvbdBiLCKhej
+DnbkKvbdhXZAzzAJ
+EOcLKvbdQYmAGsRj
+EOcLKvbdZtJIyDrn
+DnbkKvbdNsTufduQ
+EOcKjvbdEXxMUTsl
+DoDLKvbdKyRJrzuG
+DoDKjvbdrWpLbhxq
+DnbjjvbdrDeIonWB
+EPDKjvbdHELViaij
+DoDLKvbdBdQBWJmG
+DncLKvbdRjyGUfkT
+EPDLKvbdYNqAYUut
+EPDKjvbdRXNdClID
+EPCkKvbdNwnuzdOU
+EOcLKvbdjmBkydfo
+DoCjjvbdrpWPKDVf
+EPCkKvbdZyEKNbkr
+EOcKjvbdQZNAHTRj
+EOcKjvbdwtmEpxkn
+DncLKvbdLhbMRYAS
+DoCjjvbdsrrTZZdc
+DncKjvbdxmrgxShc
+EPCkKvbdmozZVkZC
+EPCjjvbdbsDLTcia
+DoDKjvbdGKeScIMu
+EPCjjvbdrEFIpOWB
+EOcKjvbdmpZxukZC
+DoCkKvbdTkunaVni
+DoCjjvbddneSkUUS
+EPCjjvbdTlVoBWPJ
+DoDKjvbdxsNhmSCH
+EPCkKvbdVviXvDdg
+DnbjjvbdwzHfFwdr
+EPDKjvbdfMewHMjL
+DoCjjvbdbsDKtDjB
+EPDLKvbdUQpoVVIN
+EObkKvbdrEFJPmua
+EObkKvbdhlEcnUcZ
+DoDKjvbdZRMeIleR
+DnbjjvbdmajXYOnV
+DoDKjvbdaRfDHtGL
+DoCjjvbdbhljKewY
+DoDLKvbdDwwksssl
+DncLKvbdUMWOaVoJ
+DncKjvbdWWiYWDdg
+DoCjjvbdyXiJbQZk
+DnbkKvbdHDkVibKK
+EPCjjvbdtSrSxzEc
+EOcLKvbdaSGChUFk
+DnbkKvbdYSlBNUOx
+EPDLKvbdJTZBSmYM
+DoCjjvbdTkvOaWOi
+DncKjvbdMowpvNfs
+EPDKjvbdeEnqavcK
+EOcLKvbdiifIJlxS
+DnbkKvbdqceIpNua
+EPDKjvbdrNZixkhJ
+DncKjvbdiHKDZViu
+DnbkKvbdrDdiPnWB
+DncLKvbdLGFhCAqV
+DoCjjvbdwuMdqYlO
+EPCjjvbdePFTKssr
+EObjjvbdVBCQrpqy
+EObjjvbdbrcKsdKB
+DnbkKvbdBvzciEpW
+DoCjjvbdIHGyyXxH
+EObjjvbdrzLpTAhO
+EOcKjvbdemGWgNJk
+EObkKvbdVZHtZjnn
+EOcKjvbdiCObeXRR
+EPCkKvbduoTzpkPU
+DoCkKvbdrNZjYkgi
+DnbkKvbdTAEhgand
+EOcKjvbdhuZdwRuC
+DoDLKvbdWWiXuceH
+EPDKjvbdZoOIddzK
+DncLKvbdVAbRSprZ
+DnbjjvbdhgKDZWJu
+DoCkKvbdVZITykOn
+DoCkKvbdiGibyWKV
+EPDLKvbdwyhGGYFS
+DoDKjvbdiHKCxvJu
+EPDLKvbdhyuGLpnG
+EPDKjvbdOAJStKSA
+EOcKjvbdzitpPdSt
+DoCkKvbdzROlhjXA
+DoDLKvbdtTSSxzEc
+DoDKjvbdzoQRFCkx
+DnbkKvbdxnSgxShc
+DnbjjvbdiBoDFWqR
+DoCjjvbdnBjWwoNu
+DncLKvbdVYhTzKnn
+DncLKvbdkIGkefNk
+DnbkKvbdlqxuZsEJ
+EOcLKvbdACrYJzIp
+EPDKjvbdmaiwYOnV
+EOcKjvbdYkrEUNlN
+DoCjjvbdVUNTfLuj
+DoDLKvbdfHkWSOQg
+DnbkKvbdBraCsfXS
+EOcKjvbdMJBkpxAS
+DoDKjvbdcyyQXyQb
+EObkKvbdeEnrCXDK
+EObkKvbdFejSNiTq
+DoCjjvbdEYXkstTl
+EPDKjvbdyYIjBpZk
+DncKjvbdiHJcZWKV
+DncKjvbdQdDAoqDr
+EObkKvbduDDUvvOo
+EPCkKvbdzGyMANEw
+DoDKjvbdQvnECkgc
+DncKjvbdVviXudEg
+DoDLKvbdQZNAHTSK
+EPDKjvbdkCkjqHUg
+EObjjvbdwyhFeweS
+DoCjjvbdxwiJbQZk
+EOcLKvbdEPDLLXDE
+DncLKvbdVrNwbFLc
+DoCkKvbdjAPgBPgK
+EOcKjvbdpstGqqjt
+EPDLKvbdHDkVjCKK
+DncKjvbdirzhrjiz
+DnbjjvbdxrnJNSBg
+EPCkKvbdraelkgLZ
+DncLKvbdptTgRqjt
+DoCkKvbdIsYaTMxM
+DoCjjvbdMpXqVnGs
+DoDLKvbdUVkoitBR
+DoCkKvbdjmCLyeHP
+DoCjjvbdiVZeWquC
+DoCjjvbdVUMtFlWK
+EPDLKvbdxKvdHzzG
+DoDKjvbdiMEdNuCy
+EPDKjvbdwzIFfYEr
+EObjjvbdJXsagkpp
+EPCkKvbdxrmhmSBg
+DoDKjvbdlqxuZsDi
+EPDKjvbdsQVoJcVf
+DnbjjvbdEYYLstUM
+DncLKvbdkHgLfGNk
+EPCjjvbdbsDKtDjB
+DnbjjvbdJcKDQibx
+DoCjjvbdyzdnSIIh
+DnbkKvbdrpWOjCuf
+EObjjvbdbAudeopX
+DnbkKvbdYkqctNlN
+EPDLKvbdfHkWRnRH
+EPDLKvbdXmqAYUut
+DncKjvbdFyVVBEXb
+DnbkKvbdrDdhpNua
+DncKjvbdeAURNXjG
+DoCkKvbdOTUVgEuQ
+EPCjjvbddwyssrFz
+DoCjjvbdMpYRWNfs
+DoCkKvbdjuvnDaww
+DnbkKvbdVhXvXgYz
+EObjjvbdTulQKTaR
+EObjjvbdOAJTUJrA
+EPDLKvbdsZkosBIO
+DoCkKvbdhgJbxvKV
+EPCjjvbdnBivxOnV
+DncKjvbdxrnIlrCH
+DncLKvbdzaAPHGbM
+EPCkKvbduMXvaUBX
+DnbkKvbdSBceMJZL
+EObjjvbdJpzEoGOF
+DnbkKvbdWexytAPT
+DnbkKvbdkVwNcaxX
+EOcLKvbdEYYLsstM
+DoCkKvbdRosfiedX
+EOcKjvbdwuMdpyMO
+EObjjvbdUsmUFlWK
+EObjjvbdjuwOECXw
+DncKjvbdqlzJxkgi
+DoCkKvbdiHJbxujV
+EPDLKvbdakMFoNcA
+EOcLKvbdmIcsqUqa
+EPCkKvbdeKKSVtzn
+EPCkKvbdvBEZTOeI
+DncKjvbdpstHSRjt
+EOcKjvbdKVuGEEfi
+DoDLKvbdZQldiNFR
+EPCjjvbdxnTIYShc
+EOcKjvbdtunXjQsA
+EPDKjvbdjcLkRHVH
+DncKjvbdDoDLLXCd
+DnbjjvbdZyEJnDMS
+DoDLKvbdFkFTCgmV
+EOcKjvbdhkddOUby
+EPDLKvbdNeEUJIkE
+DnbkKvbdyzeNqghh
+EPDKjvbdFVxopMjF
+EOcKjvbdGdLVibKK
+DncKjvbdBdQAvJlf
+DoDKjvbdbiNKLFwY
+EPCkKvbdnGeYNNgZ
+EPDLKvbdEYXlUTsl
+DncLKvbdOEcsiIjd
+DncKjvbdKaLHMbYR
+DncKjvbdyTOIlrCH
+EPCkKvbdMpXpumgT
+EPCjjvbdtbbtwVno
+DoDKjvbdrRtkOLAm
+EObjjvbdbLLfPNcA
+DncKjvbdjmCLydgP
+DnbkKvbdTkuoBVoJ
+DnbkKvbdSCDdlJYk
+EObkKvbdCEPaVjNG
+DoDLKvbdFaOpxizm
+EPCjjvbdfMevgMjL
+DoCkKvbdYzcGRjVy
+DnbjjvbdKRZdoGNe
+EPDLKvbdZisIQHCG
+EOcLKvbdZMSEUOMN
+DoCjjvbdiGibxuiu
+EPDLKvbdZQmFJMeR
+DoCkKvbdsBemLfjy
+DncLKvbdzoPqEcMY
+DncLKvbdMoxRWOGs
+EOcLKvbdFeirOJUR
+DoDLKvbdpyOgfpdY
+DncLKvbdyzeOSIJI
+DoDLKvbdRkZFuHKs
+DnbkKvbdxVNEqZLn
+DoCjjvbdMgDPmPuL
+EPDKjvbdZQmEhmFR
+DncKjvbdBraDUFwS
+DoCkKvbdqqtjmkAm
+EPDLKvbdLZQirzuG
+DoDLKvbdlYsRryGt
+EOcKjvbdKaLHNBxR
+EOcKjvbdTqQoUthN
+EObkKvbdhbObeXRR
+EPDKjvbdJutfDeGi
+DoDLKvbdRkZFuGkT
+EOcKjvbdrbGNLgKy
+DnbjjvbdmpZyWKyC
+EPDKjvbdHELVjBij
+EPCjjvbduDDUvuoP
+EOcKjvbdrDeIonWB
+DoCjjvbdnPyyWLZC
+EPDKjvbddndrjtUS
+EObjjvbdjuvnDbYX
+EPDLKvbdCIkBjhfK
+EObkKvbdZjTHogCG
+EOcKjvbdjJehKNYS
+DnbkKvbdSxLMNzkY
+DoDLKvbdKDKDRJcY
+EPCkKvbdmpZxvKxb
+DnbjjvbdssSTYyeD
+EObjjvbdHDkVibJj
+DnbkKvbdSLZFtgLT
+DoCjjvbdxnTIXriD
+DnbkKvbdcSbjsdJa
+DoCkKvbduoTzpjoU
+DoCjjvbdXsLaNUOx
+DoDLKvbdcScKtEJa
+DnbkKvbdfpBzwDwh
+EPDKjvbdjlakyeGo
+DnbjjvbdYzcFqivZ
+DncLKvbdCIkBjiGK
+EPDLKvbdxZhFfYFS
+EObjjvbdrEFJQNvB
+DoDLKvbdjAPgBQHK
+EOcLKvbdkDLjqHUg
+DoCkKvbdiUzFWqtb
+DoCkKvbdKVtfDdfi
+DoDLKvbdwkXEHzyf
+EObjjvbdqcdhpOWB
+EPCkKvbdeEnrBvbj
+DoCkKvbdCTAbsewS
+DnbjjvbdNHCpMouL
+DoDKjvbdSQUGiecw
+DoDLKvbdelevfmKL
+DoCkKvbdySnImSCH
+DncKjvbdANIZSvzY
+DncKjvbdrJAJeNPF
+EPCjjvbdqTtGqqjt
+EObjjvbdaRfDHsfL
+EPCkKvbdrJAJeMne
+EPDKjvbdiGjDYvJu
+DoDKjvbdMgCpMpVL
+DncKjvbdZjTIQHCG
+EOcLKvbdJYTbILqQ
+DoCkKvbdzoPqEbkx
+EPDLKvbdvlvANDeN
+DncLKvbdatafwjsh
+DncLKvbdJuuFcdgJ
+DncLKvbdwXMAvBWV
+DoDLKvbdaMjbStmH
+DoCkKvbdeOdsLTtS
+DoDKjvbdbLLeoNcA
+EPDKjvbdJKEAJpGd
+DnbjjvbdZnnIeEyj
+EOcLKvbdunszpjnt
+EObkKvbdmoyyWKxb
+EObkKvbdILazmvpk
+EPDKjvbdQlwbYmtz
+EPCjjvbderAvzkcP
+EObkKvbdegjvSORH
+EOcKjvbdsrqsYydc
+EOcKjvbdfIKvSORH
+DnbkKvbdFjdsDIMu
+EPDKjvbdpstHRqjt
+EOcLKvbdWRmxCElD
+EOcLKvbdkHflGFnL
+DoCjjvbdZjTHofbG
+EObjjvbdeEoSBwCj
+EPCkKvbdJSyBTNXl
+DnbkKvbdUaCRTQqy
+EPDKjvbdSLZFtfkT
+DncKjvbdyNrgwsJD
+DoDKjvbdezuxdiUX
+DoDLKvbdACrXiyhp
+DoDLKvbdxwiJaoyk
+EOcKjvbdUxhTzLOn
+DnbjjvbdnHFYNNfy
+EOcLKvbdhanbeWqR
+DoDKjvbdzHYlAMdw
+DoCjjvbdKyRJrzuG
+DncLKvbdliETpuRa
+EObkKvbdczYpXyRC
+DoDKjvbdFfKRnIsq
+EPDKjvbdVAbQsRSZ
+DncKjvbdezvZEiUX
+DoCkKvbdZisHofbG
+EPDKjvbdjKFgilxS
+EOcLKvbduVmxKQsA
+DnbjjvbdhuZeWrUb
+EObkKvbdGYuUaDxC
+DoDLKvbdaaWFGPpX
+DnbkKvbdUQpoVUhN
+EPCjjvbdZxdJmcMS
+DncKjvbdhbPCdwRR
+EObkKvbdZRMeJNFR
+DnbjjvbdTlVoBWOi
+DoCkKvbdatbHYKtI
+EObkKvbdiHJbxvJu
+DncKjvbdsQWOjCvG
+DncLKvbdRosfjGEX
+EObkKvbdREDBQRDr
+EOcLKvbdeEnqawCj
+EPDLKvbdGZVUaEXb
+EPDLKvbdIryArmXl
+EObjjvbdiiehJlwr
+DoCkKvbdMJCMRYAS
+DnbkKvbdlrYtzTDi
+DoDLKvbdnGeXlmfy
+DoCkKvbdSCDeMJZL
+EObkKvbdLFegaaRV
+DoDKjvbdGGKRmhsq
+EObkKvbdiLdcnVDZ
+DnbjjvbdGBOqZJzm
+DnbjjvbdhfjCxvKV
+EPCjjvbdlBNPNALA
+EOcKjvbdtbbuXWPP
+DncLKvbdEPCjjwDE
+DoDLKvbdLqwNZtpz
+EPDLKvbdbVCGwkUI
+DncLKvbdZyDimcLr
+DncLKvbdfILWSNpg
+DoDKjvbdFVyPpNJe
+DncKjvbdqiAJeMoF
+EOcKjvbdqrVLOLAm
+DoCjjvbdehKuqnQg
+DoDLKvbdGLFTCglu
+DoCjjvbdXrlBMtPY
+DncKjvbdlYrrTYgU
+EPCkKvbdWSNxCFMD
+DncKjvbdUVkoitAq
+DncLKvbdfHjvSORH
+DoCkKvbdCEPaWKMf
+EObkKvbdmbJvxPOV
+EPDKjvbdwzHefXeS
+EOcKjvbdvvlAvAuu
+DncLKvbdpxngfqDx
+DnbjjvbdIwtCIMQp
+DncKjvbdHDjvKBjK
+EOcKjvbdjmCLzFGo
+DnbkKvbdZMRdTnMN
+EObjjvbdEOcLLWbd
+DoDLKvbdkNBlZdfo
+EPCjjvbdemGXHNKL
+EOcLKvbdkxrqryGt
+EOcKjvbdsPvPKDWG
+EOcKjvbdXsMAlsoY
+DnbkKvbdmIcspuSB
+DoCjjvbdUaBpsRRy
+EOcLKvbdSPsfiedX
+EOcKjvbdSCEEkiYk
+DncKjvbdWXJXudEg
+DncLKvbdRyigrbvA
+DoDLKvbdUMVoAvOi
+DnbjjvbdZtIhxcsO
+EOcLKvbdJXsbHkpp
+DnbkKvbdZtIhyETO
+DncLKvbdHlBzmvpk
+EObkKvbdzHZMAMeX
+EPDKjvbdKCjCpjDY
+EOcKjvbdjblKqHUg
+DoDKjvbdGGJrNiUR
+DoDLKvbdrEFIomvB
+EPCkKvbdrovPKDVf
+DoDKjvbdpxnhGpdY
+EPDKjvbdemGWgNKL
+EPDLKvbdTlWPAuoJ
+EOcLKvbdhuZeWqtb
+DnbkKvbdhyuGLpnG
+EObjjvbdSBcdlJZL
+DnbkKvbdeEnqbWcK
+DnbjjvbdJKEAJofd
+EObjjvbdbQGfckzd
+EPCjjvbdRkYeuHLT
+DoDLKvbdXrlBMtOx
+EObkKvbdznoqFCkx
+EPDLKvbdjggLfFnL
+EPDKjvbdhuZdwSVC
+EPCkKvbdeEoRbXDK
+EPCkKvbdKaKgNCYR
+DoDLKvbdWWhxWDdg
+EPCjjvbdqUTfqqjt
+EOcKjvbdcSbkTdJa
+DncKjvbdauCHXjtI
+DoCkKvbdQlwbZNtz
+DnbjjvbdqvolCiYq
+EOcLKvbdePFSjstS
+EOcKjvbdhgKDZWKV
+EObkKvbdCgLfHAzc
+DncKjvbdnUuZkKSG
+DnbjjvbdlhctRUrB
+DoDKjvbdpyPHgREY
+DoCkKvbdjJegimXr
+EPDKjvbdfHkVrORH
+EPDKjvbdyTOIlqbH
+EPDKjvbdjKFhKNYS
+EPDKjvbdFWZPpMie
+EPCjjvbdIwsahLpp
+EObkKvbdKfGIBaQu
+DncKjvbdGFirOJTq
+DnbjjvbdpedFUWBI
+EPCkKvbdNeDshiKd
+EObjjvbdBiLBjhej
+EObjjvbdCJKbLJFj
+DncKjvbdvwMAuaWV
+DnbjjvbdZRMdhleR
+DncKjvbdhgKCyViu
+DoCkKvbdhficZWKV
+DnbjjvbdwkWdHzyf
+DncLKvbdVBBqSprZ
+EOcLKvbdUsmTelVj
+EOcLKvbdFxuVBEYC
+DoDKjvbdKaLHMbYR
+EPCkKvbdGdKuiaij
+EPDKjvbdfIKvRnQg
+DncKjvbdfekzNfgA
+DoCkKvbdJbicRJbx
+EOcKjvbdIwsagkpp
+DncKjvbdOEctIiKd
+DncKjvbdOTUVfduQ
+EPCkKvbdFWZPomKF
+EObjjvbdezvZFJUX
+DoCjjvbdtSrTYzFD
+DoCkKvbdbVCHYLTh
+EPDLKvbdZMRdUOLm
+DoDLKvbdNwoVzdNt
+EPDLKvbdFaPRZJzm
+DoCjjvbdxZhGFweS
+EPCjjvbdZQmFImFR
+DnbjjvbdsQWOibvG
+DoCjjvbdSBdFMIxk
+EPCkKvbdEObkKvcE
+DoDKjvbdqFcdsvAh
+EOcKjvbdezuyEhsw
+DnbkKvbdVqnXaeMD
+EObjjvbdnGeXlmgZ
+DncLKvbdCIkBkIfK
+EPDLKvbdpecdtWAh
+EPDKjvbdsQVnjCvG
+DoDKjvbdkDMLQfuH
+EObjjvbdAMhZTWzY
+EPCjjvbdiCObdvqR
+DoDKjvbdUWLoisaR
+DncLKvbdSPtHKGDw
+EObjjvbdaNLBrtmH
+EPDKjvbdUyHszKoO
+DoDKjvbdQwNccLhD
+EPDLKvbdnVUzKjRf
+DoCkKvbdRyigrcWA
+EOcLKvbdbiNKLGXY
+DncKjvbdlhctRVSB
+DoCkKvbdNPxRWNfs
+EObjjvbdANHxsXZx
+DnbjjvbdNrsvHEuQ
+EPCjjvbdmbJvxPNu
+EOcKjvbdJvVGEFGi
+EPDKjvbdUWLoitAq
+DoCkKvbdkDMKpfuH
+EOcLKvbdfjfzbfAE
+EOcLKvbdczZQYZRC
+DoDLKvbdQwNcblHc
+EObkKvbdOTTugEtp
+DncKjvbdbUagYLTh
+EPCjjvbdfNGWfmKL
+EObjjvbdiVZdvrUb
+DncLKvbdZyDinDMS
+EPCkKvbdmaiwYOmu
+EOcLKvbdqUUHSRkU
+DncLKvbdDncKjvbd
+DoCkKvbdVqmxCElD
+EPCkKvbdaRfDIUFk
+EOcKjvbdjKGIJlxS
+DncLKvbdkxrrTZHU
+DncKjvbdypnmIjXA
+DoDLKvbdJpyeOfOF
+DoDLKvbdwXMBVaVu
+DoDKjvbdKfFhCAqV
+DoCjjvbdIxTahLqQ
+EOcLKvbdADSYKZiQ
+DoCkKvbdMowpunHT
+EOcKjvbdgKfzbfAE
+EPDKjvbdhkddOVDZ
+EPDLKvbdemFwHMik
+EPCjjvbdUVlQKTaR
+DncLKvbdRWnECkhD
+DnbjjvbdkWXODbYX
+DoCjjvbdZeYGzghb
+DoCkKvbdSKyFtfkT
+DoDLKvbdBhkCLJFj
+DncKjvbdlhdTqVRa
+EPDKjvbdqqtjmjaN
+DoDLKvbdZjTHofbG
+EPDLKvbdJmADzHVB
+DoDLKvbdSBceLhyL
+EObjjvbdqwPlCiYq
+DncLKvbdYORAXtvU
+EPDLKvbdZnnJEdyj
+DoCjjvbduWNxKQsA
+EPDKjvbdWSNxCElD
+DoCkKvbdRjyFtgLT
+DoCkKvbdeOeSkUUS
+EOcKjvbdDihKVxKA
+EObjjvbdffLymgHA
+DoDLKvbdcScKsdKB
+EPDLKvbdlYsSSyGt
+DnbjjvbdGKeTDINV
+DoDLKvbdCTBCtGXS
+EObjjvbdEASIlyvw
+EPDLKvbdfMfWfmKL
+DoCkKvbdpstGqrLU
+DncLKvbdtlXwAsaX
+DoDKjvbdNrsvHEuQ
+EObjjvbdCTBDTfXS
+DoDKjvbdkMalZeHP
+DoDLKvbdQccBPqDr
+DnbkKvbdYqNEiNEq
+DnbkKvbdvBDyTOeI
+DnbjjvbdLAkGmBxR
+EObkKvbdLiBlRYAS
+EPCjjvbdTukpKUBR
+EObkKvbdhuZeWqtb
+DoDLKvbdZyEJmbkr
+DnbjjvbdxrmiNSCH
+EPCjjvbdKWVFdFHJ
+EPCjjvbdRWmcblID
+EPCkKvbdsQVoJcVf
+EPCkKvbdGcjuibJj
+DoCjjvbdJuteceHJ
+DnbjjvbdLLAhWAJy
+DncKjvbdULunaWOi
+EOcLKvbdHlBznXQk
+DoDKjvbdvBDxroEh
+DoDKjvbdzaAPHGbM
+DoDLKvbdUyITyjoO
+DnbkKvbduaDxroFI
+EObkKvbdAMhZSvzY
+EObjjvbdDoDKkWbd
+EObkKvbdGKdrbhNV
+EPCkKvbdmgFXlnGy
+EOcKjvbdzdzOzdzQ
+EPCkKvbdKkBHvAJy
+EOcKjvbdqAiFAWhE
+DoCjjvbdQvmdClID
+DncKjvbdMtsSKmAX
+EObjjvbdziuPpETU
+DoDKjvbddZyQYZQb
+EPDLKvbdauBgXkTh
+DnbkKvbdnCJvwnmu
+DoCjjvbdxUmFQyMO
+DncKjvbdXGYzUAPT
+EPDLKvbdOAJTUKSA
+DncKjvbddZyPwxqC
+EOcKjvbdqlzKYlIJ
+DnbjjvbdkVvnDaww
+DnbjjvbdZdxGzhIb
+DnbkKvbdDwxLtTsl
+EObkKvbdGKdrcHmV
+DncKjvbdTAFJHbOd
+DoDKjvbdEObkKvcE
+DnbkKvbdaNLCSuNH
+DoDLKvbdDxYLtTtM
+EObjjvbdVZIUZjnn
+DoCkKvbdNsUVfduQ
+EOcLKvbdGGKRmhtR
+EPDKjvbdbKlFnmcA
+DncKjvbdvvlAvBWV
+DoCjjvbdliEUQtrB
+DnbjjvbdjgfkfGNk
+EPDKjvbdlYsSTYft
+DoDLKvbdbKlGOnDA
+EPDKjvbdjAPfaPfj
+DnbkKvbdzGyMAMeX
+DoCjjvbdZnmhddzK
+EPCkKvbdIMBzmwQk
+EObkKvbdjEkHVPAO
+EPCkKvbdQccBPpdS
+EPCjjvbdhgKCxvJu
+DncLKvbdVgxVxHYz
+EOcKjvbdxVNFQxkn
+DoDKjvbdbLMGPNcA
+DncLKvbdGckWJajK
+DnbkKvbdrMyiyLgi
+EOcLKvbdKefICApu
+DoCjjvbdqFdEtWBI
+EPCkKvbdYSlBNUPY
+DoCjjvbdIwsbILpp
+EPCjjvbdmgFYMnHZ
+EObjjvbdQvmccMID
+DncLKvbdURQntthN
+EOcLKvbddxZtUSFz
+EPCkKvbdhtzFWqtb
+EOcKjvbdVBCRSpqy
+DncKjvbdtbbtvvOo
+EPCkKvbdczZQYZQb
+DnbjjvbdQwODcLgc
+EPDLKvbdtunXipsA
+DncLKvbdBhjajhej
+DoDKjvbdNrtVfduQ
+EOcLKvbdKWUfDdfi
+EObjjvbdpstHRrLU
+DnbjjvbdznpRFClY
+EPCjjvbdfNFvgMik
+DoCjjvbdUsltGLvK
+DnbjjvbdlqyVZsDi
+DoCkKvbdNPwqWOHT
+EOcLKvbdakLeoNcA
+DoDKjvbdsCGNMGkZ
+EPDKjvbdaRfDHsfL
+DoDKjvbdZtIhyDrn
+EPDLKvbdOStVgFUp
+EPCkKvbdeATplxKG
+DncLKvbdySmhlrBg
+DoDKjvbdnCKWwoOV
+DnbjjvbdDncKjvcE
+EOcLKvbdwzIGGXdr
+EObjjvbdmIdTqVSB
+DnbjjvbdUGznLwVe
+DncLKvbdTkvOaWPJ
+DncKjvbdyOSgwsIc
+DncKjvbdjmCLzFGo
+DoDLKvbdpssfqqkU
+EPDKjvbdmtuZjirG
+EOcKjvbdOFEThhkE
+DoDKjvbdIMBznWqL
+EPCkKvbdJvVFcdfi
+EPDKjvbdnBivxOmu
+EObkKvbdTvLojTaR
+DoCkKvbdMRwNZtpz
+EObjjvbdEARhlzXX
+DnbjjvbdcScLTcjB
+DncKjvbdxmrhXrhc
+DoDKjvbdEvZQQNKF
+DncLKvbdGLErcHmV
+DoDLKvbdFkFTChMu
+DoCkKvbdOFETiIkE
+EPDKjvbdnVUzLKRf
+EPDKjvbdmuUzKjSG
+EPCjjvbdwuNFQxkn
+DncLKvbdeATpmXjG
+EObjjvbdxUmEpxkn
+EPDKjvbdcSbkTcjB
+EPCjjvbdmbKXXoNu
+EPDKjvbdSQUHKFdX
+DoDKjvbdCTAbsewS
+EOcLKvbdVwJYVdFH
+DoDKjvbdZtIiYcsO
+EPDKjvbdhkeENtcZ
+EObkKvbdGBOpyJzm
+EPCkKvbdRMxCYmtz
+DoCjjvbdzjVPocsU
+DoDLKvbdrDdiPnWB
+EPCjjvbdFjdsDIMu
+DoDLKvbdSLZGUgLT
+EPDLKvbdKefHaaQu
+DoDKjvbdKCibpicY
+EOcLKvbdijGIJmYS
+EObjjvbdelfWgNKL
+DnbkKvbdbhmKKfWx
+DoDKjvbdSQUHKGEX
+EPCkKvbdnGdxMmgZ
+DncLKvbdJJdAKPgE
+EPDLKvbdmRyUyrdJ
+EOcLKvbdhzUfLqOG
+DoDKjvbdLAjgMaxR
+DoDKjvbdRosfjGEX
+EObkKvbdpssfqqjt
+DnbkKvbdjAQHAofj
+DncLKvbdidkHUoAO
+DoCkKvbdCIjbLIej
+DncLKvbdelfWfmKL
+DoDLKvbdxUleQxkn
+EPDLKvbdEvZQPljF
+DncLKvbdJbjDQjCx
+DncLKvbdyOTIXriD
+DoDKjvbdTulPjUAq
+DnbjjvbdJSyAsNYM
+EOcLKvbdbBVeGQQX
+EPCjjvbdbKkenmcA
+EPCjjvbdiGjDZWJu
+DncLKvbdcSbjsdJa
+EObkKvbdZtJIyDsO
+DoDLKvbdrafMkgLZ
+DoCjjvbdiMFDmuDZ
+DnbkKvbdnUtyjirG
+EPDKjvbdfNFvflik
+DoDLKvbdrWokcJZR
+DncKjvbdWWhxWDdg
+EPDLKvbdNeDtJJKd
+EOcLKvbdqlzKYkhJ
+DncKjvbdSQUHKGDw
+DoCkKvbdkHflFfOL
+EPCkKvbdRXNdDMID
+DncLKvbdSLZFtfkT
+EOcLKvbdZQldiMeR
+DnbjjvbdSBdElJYk
+DncLKvbdwWlBVaWV
+DoCjjvbdhzUfLqOG
+DoDLKvbdmJEUQuSB
+DnbjjvbdULvPBVoJ
+EPDLKvbdYkrDtOMN
+EPDKjvbdHEKujBij
+EObjjvbdJuuGDdfi
+EObjjvbdzaAOgGbM
+DncLKvbdkClLRHUg
+EObkKvbdYTMAmToY
+EObjjvbdxVMeQyLn
+DoDKjvbdrEFJQNua
+DncKjvbdYSlBNTnx
+DnbjjvbdrSUkOLAm
+EOcLKvbdrylQTBIO
+DnbjjvbdrouoKDVf
+DoDLKvbdwWkaVaVu
+DoCkKvbdZQmFIleR
+EPCjjvbdiLeENtby
+DoCjjvbdrDeJQNua
+EObjjvbdIGfzYxXg
+DoCkKvbdySmiMqag
+EOcKjvbdbVBgYLTh
+DoDKjvbdLFehCApu
+EPCkKvbdCDpAvJmG
+EObkKvbdZLrDtOLm
+EPCkKvbdZnnJEdyj
+EPCjjvbdZjSgpGbG
+EOcKjvbdWSOYBdkc
+EPDKjvbdwtleQyLn
+DnbkKvbdmJDtQuSB
+EObkKvbdkWXODbXw
+DncKjvbdezuyEiTw
+EObjjvbdnBjWwnmu
+EPDKjvbdZxdJmcMS
+EPDKjvbdrbGNMHLZ
+EObkKvbdEYXlTssl
+DnbjjvbdyTOJNRag
+DnbkKvbdGZVVAdYC
+EPCjjvbdTYLMNzkY
+DncLKvbdJcJcRKDY
+EOcLKvbdYpmEhldq
+DoCkKvbdjKFgjNYS
+EPDLKvbdJbibqKCx
+EPCjjvbdyTNiNSCH
+DoDLKvbdGGKRmhsq
+EPDLKvbdLAkGmCYR
+EPDLKvbdCEPaWKMf
+DoCkKvbdZsiIyDsO
+EPCjjvbdjbkkRGuH
+DnbkKvbdqYoHgREY
+DoDLKvbdZMRctNkm
+EObjjvbdDjIJvYKA
+DncKjvbdVqnXbEkc
+EPCkKvbdiHKCyViu
+EOcKjvbdkHflGFmk
+DoDKjvbdOFDsiIjd
+EOcLKvbdVrOYCEkc
+EPCjjvbdhtydvrUb
+DoDLKvbdrNZjYlHi
+EPDKjvbdVwIxWDeH
+EObkKvbdhyuFlRNf
+EPDLKvbdSKyFuHKs
+DoCkKvbdBhjajiFj
+DoDKjvbdhanbeWpq
+DncKjvbdGGJqnJTq
+EPDKjvbdZtJIyETO
+EOcLKvbdANIZSvzY
+DnbkKvbdptUHSSLU
+DoDLKvbdRDcBPpdS
+DoDKjvbdBcpAujNG
+DnbjjvbdaaVdeopX
+DnbjjvbdhtydvrUb
+DoCkKvbdkWXNcaxX
+DncLKvbdrNZjYkgi
+EPCjjvbdBiKajiGK
+EObkKvbdwkWcgzzG
+EPCkKvbdRDcApQcr
+DncLKvbdfekzNgHA
+DoDKjvbdiBoCdwRR
+EOcLKvbdIBlZdzAD
+DnbkKvbdZLqcsnMN
+DoDKjvbdatbGwkUI
+EObjjvbdmgFXlmfy
+EPDLKvbdxUmEqYkn
+EPDLKvbdauBfxKsh
+EObjjvbdsPvOjDVf
+DnbkKvbdkVwNdBww
+EPCkKvbdzaAPGfbM
+EOcLKvbdRotGjGDw
+EPCkKvbdqceJPmua
+EPDLKvbdZyDinCkr
+EObkKvbdCDoaWKMf
+EOcKjvbdjmCLzEgP
+EPDKjvbdHlBznXRL
+DncKjvbdeOeTLTtS
+EPCjjvbdGZUuBEXb
+DnbkKvbdqTtHRqjt
+EOcLKvbdFyUuAdXb
+EPDLKvbdEARiMzWw
+EOcKjvbdFeirNiUR
+DoCkKvbdzjUoocsU
+EOcLKvbdEztQdlCi
+DncLKvbdKCjCpibx
+EPCjjvbdxZhGFxFS
+EObjjvbdwWkaWAvV
+DnbkKvbdaaWFFoow
+EOcKjvbdBsBDUGXS
+EPDLKvbdmIdUQuRa
+DncKjvbdVAbRTRRy
+DoCkKvbdHffyxxYH
+EObjjvbdDGkfHAzc
+DoCkKvbdiCPDFXRR
+EPCkKvbdVrNwbEkc
+EPCkKvbdiGjDYvKV
+DnbkKvbdIMBzmvpk
+EPCkKvbdKxqJrztf
+DncLKvbdmIctQuSB
+EOcKjvbdaSFbhUGL
+DoCjjvbdmbKWwnmu
+DoCkKvbdiUyeWrVC
+DncKjvbdGGKRmhsq
+DoCjjvbdehLVqnQg
+DncLKvbdTkunaVoJ
+DnbjjvbdGZUtaDxC
+EPCjjvbdtSrSyZeD
+DoDLKvbdjbkkQfuH
+EOcLKvbdOFDtJJLE
+DnbjjvbdBdQAvJlf
+DoCkKvbduDDVWvPP
+EOcKjvbdZtJIyDsO
+DncLKvbdQccBPpdS
+DncLKvbdiUzEvquC
+EPCjjvbdvvkaWAuu
+DoDLKvbdZoOIeEzK
+DnbkKvbdkCkkRGuH
+EOcKjvbdRkZGVHLT
+EObkKvbdtcCuXVno
+EPCjjvbdMpYRVnGs
+DoDKjvbdFfJrNiTq
+DnbkKvbdZnmiFFZj
+EPDLKvbdbhmKKfWx
+DoDLKvbdDjHivXjA
+DoDLKvbdiLeDnVDZ
+EOcLKvbdUQqOtthN
+EPDKjvbdZHXEAOri
+EObkKvbdvAdYrndh
+EObkKvbdQlwaxnUz
+DoCjjvbdQwOEDLhD
+EPDLKvbdqrVKnLBN
+EObjjvbdwtmFQxkn
+EPDLKvbdTfznMWvF
+DnbkKvbdaMjasVNH
+EPCjjvbdcyyQXxpb
+DncKjvbdMfcQMpUk
+DnbjjvbdZnmheEzK
+DncLKvbdbrbkUDia
+DncLKvbdiCOcFXRR
+DoCjjvbdZxcimblS
+EPDLKvbdRkYfVHKs
+DncKjvbdDoDKjvbd
+EOcKjvbdGAnpxizm
+EOcKjvbdYpldhldq
+DnbkKvbdQwOEDMID
+DnbjjvbdcyxoxYpb
+DoCjjvbdakMGOnDA
+EPCjjvbdLAkGlawq
+DncKjvbdJJdAKPfd
+EOcLKvbdxrnImSBg
+DoDLKvbdNddUJIjd
+DncLKvbdfIKvRmpg
+DoCjjvbdiZuGLqOG
+EOcLKvbdeAURMwif
+DncLKvbdiCPCeWpq
+DoCjjvbdGcjvKBij
+EPDKjvbdRDcBQQdS
+EPCjjvbdUtMtGLvK
+EPDKjvbdyXhjBoyk
+DoDKjvbdqZOgfpcx
+EObjjvbdYTMAmUPY
+DoDLKvbdiCObeXQq
+DncKjvbdmJDtRUqa
+EObkKvbdSCEElIyL
+EObkKvbdNGbpMouL
+DoCkKvbdEzsqElCi
+EObjjvbdOStWHFVQ
+EPCjjvbdjmBlZdfo
+EPDKjvbdiUyeWqtb
+DnbjjvbdYSkaNUPY
+DoCkKvbdTAEhhCPE
+DoCjjvbdmttyjjSG
+EOcKjvbdrMyjZMIJ
+EPDKjvbdUsmTelVj
+EPCkKvbdNsTugFUp
+DnbkKvbdWRnYBeMD
+DncLKvbdHgGzZXxH
+EPDLKvbdZLrDsmlN
+DncLKvbdcSbkUDjB
+EObkKvbdziuPpDrt
+DoCjjvbdZyEJmblS
+EObkKvbdjggMFenL
+DnbkKvbdmfeXmNfy
+EObkKvbdiBncFXRR
+EPDKjvbdADSXiyiQ
+EObjjvbdLFfHbApu
+EOcLKvbdRMwbZOUz
+EPCkKvbdFVxoomJe
+EOcLKvbdZnmiEdyj
+DncLKvbdULunaVoJ
+DncLKvbddndsKtTr
+EPDKjvbdEztQeMDJ
+EObkKvbdcScKscjB
+EOcKjvbdFkErbglu
+DoCkKvbdsBfMlGkZ
+EPDLKvbdCSaCsfWr
+EPCjjvbdVAapsRSZ
+EOcLKvbdgFkzNfgA
+EPDLKvbdjhHLefNk
+EObjjvbdyNsIXsIc
+DoCjjvbdqcdiPmvB
+EOcKjvbdeXyssrFz
+DnbjjvbdEOcKjwCd
+DoDLKvbdGKdrbgmV
+DncLKvbdKQzEoFnF
+DoCkKvbdqvpMDJZR
+EObkKvbdZyEKODMS
+DncKjvbdBhjbKiFj
+DncKjvbdfHkVrNqH
+DncLKvbdeXyssrFz
+EObjjvbdxmsHwriD
+EPDKjvbdRyigsCvA
+DoCkKvbdZoNiEeZj
+EPCkKvbdhzUfLpnG
+DncKjvbdVUNUFkuj
+EPDKjvbdRXNdDMID
+EObkKvbdlBMnmALA
+EPDKjvbdffMZnHHA
+EPCjjvbdEARhlyvw
+EOcKjvbdVTltGLvK
+EOcKjvbdJqZdoFme
+EObkKvbdyOTHwsIc
+DoDLKvbdCfkegAzc
+DnbkKvbdZMRdTmkm
+DnbkKvbdhkeEOUcZ
+DoDKjvbdZnnIeEyj
+DnbjjvbdrafNMGkZ
+DoDLKvbdZtJIyESn
+EOcLKvbdaRecITek
+EPCjjvbdZoOJEdyj
+DoDLKvbdxsNhlrBg
+EPCjjvbdZxdKNcMS
+DoCjjvbdCWzdJEov
+EObkKvbdTppnttgm
+DnbkKvbdjmCLydfo
+EObkKvbdBsAbsewS
+EObjjvbdjgflFemk
+DnbjjvbdpstGrSKt
+EOcLKvbdOTTvHFUp
+DoCkKvbdczYowyRC
+EObkKvbdTvMPjUAq
+EOcKjvbdezvYeJUX
+EPCkKvbdzHYlANEw
+EPCkKvbdqcdiQOVa
+DoCkKvbdsrrSxyeD
+EObkKvbdOTUWGeUp
+DoDKjvbdbUbHYLTh
+DoCkKvbdHakydzAD
+DoDKjvbddjJrWUzn
+EPDKjvbdmaiwYPOV
+DoCjjvbdtbcUwVno
+EPDLKvbdrMyjYkgi
+DoCjjvbdUQpoUtgm
+DncKjvbdddoSBwDK
+EPCkKvbdatbGwkTh
+DncKjvbdmbJvxPNu
+DnbjjvbdwzHeewdr
+DncLKvbdzitpPcrt
+EOcLKvbdrMyjYkgi
+EOcLKvbdrEFIomvB
+DoDLKvbdiifIJlxS
+EOcLKvbdtvOYKQsA
+DoCkKvbdxsNhlqag
+DnbjjvbdyTOIlqag
+DncLKvbdIGgZyYXg
+EOcKjvbdUsmUGMWK
+EObkKvbdhzUfMQnG
+EPDLKvbdZxdJnCkr
+DncKjvbdKWUeceGi
+EOcLKvbdmbJvwnnV
+DoDLKvbdDncKjvbd
+EPCkKvbdZoNheEyj
+DncLKvbdVqnXadlD
+DncLKvbdtunXipsA
+DncLKvbdjAPgBPfj
+DoCkKvbdyqPNJKXA
+DncKjvbdrpWPJbuf
+EOcKjvbdqvpMDJYq
+DnbjjvbdcTDLUDia
+DnbkKvbdiGjCxvKV
+EPDKjvbdauBfxKtI
+DoCkKvbdLFfHbApu
+DoDLKvbdHffyyXwg
+EOcKjvbdIxUCHkqQ
+DoDKjvbdzQoMiJwA
+DoDKjvbdyYIjBoyk
+EObkKvbdxnSgwriD
+EObkKvbdIMBznWpk
+EPDKjvbdYlSDtOMN
+DoDKjvbdijGHjMxS
+EOcKjvbdYkqcsnMN
+DoCjjvbdmaiwYOmu
+EPDKjvbdHELWKBjK
+DoCjjvbdwtmFRYlO
+EOcLKvbdFeiqnJTq
+EPDKjvbdiBncEvqR
+DoCkKvbdJXsbILpp
+EObjjvbdULunaVni
+DncKjvbdDwxLstUM
+DoDKjvbdrWpMChyR
+EObkKvbdYzcFqivZ
+DncKjvbdEzspdlDJ
+EPDKjvbdfMfXGmKL
+DoCkKvbdCTAbtGWr
+DoDLKvbdRkZGUgKs
+EPCkKvbdFWZQQMie
+DnbjjvbdxVNEqYkn
+DoCjjvbdeFPRbWbj
+EPCkKvbdZshhyESn
+EObjjvbdqrVKnLAm
+EPCjjvbdptUGqqjt
+EOcLKvbdrEEhpOVa
+DncKjvbdzQoNIjXA
+DncLKvbdmgFXlnGy
+DoDKjvbdZjShQHBf
+DnbjjvbdjKGHjNXr
+DoDLKvbdqFcdsvAh
+EPCkKvbdOEdUIiLE
+EPDLKvbdNeEUJJKd
+EPCjjvbdzHZMANEw
+DnbkKvbdqlzJyMIJ
+DnbjjvbdelfXHMjL
+EPCkKvbdANHyTWzY
+DnbjjvbdREDBPpcr
+DncLKvbdQmYCZOUz
+EOcKjvbduoTzpjoU
+DoCjjvbdqrUjmkBN
+DnbjjvbdyfxlANFX
+EOcLKvbdJmADygUa
+EPDLKvbdyNrhYTIc
+DoCjjvbdCTAbtFwS
+DncLKvbdSwkLmzkY
+DnbjjvbdjhHMFfNk
+DoCkKvbdZeXfzhIb
+DnbjjvbdbrbjtEJa
+DoCkKvbdxrmhmRbH
+DoDLKvbdrXQLbhxq
+EObjjvbdTulQKUBR
+EPCkKvbdMpYQumgT
+DncKjvbderBWzlDP
+DoCjjvbdiGjCxvJu
+DoCjjvbdlZSqsZGt
+EOcLKvbdZisIPfaf
+DnbkKvbdHEKvKBij
+DncLKvbdjSziSjiz
+EPDKjvbdCEQBWJmG
+EObkKvbdGGKRmiUR
+EPDKjvbdMuTRkNAX
+DnbjjvbdrXQLbiYq
+EPCjjvbdOTUWGduQ
+EPCjjvbdnBjXXoNu
+DoDLKvbdcarmSAUN
+DoCjjvbdNPwqWOGs
+EObkKvbdUslsekvK
+DnbjjvbdzaAPGfbM
+DoCkKvbdGdLVjCJj
+DoDLKvbdRjyFtfkT
+DoDLKvbdGLFTDHlu
+DnbkKvbdGFirOJUR
+EPDLKvbddoFTLUUS
+EObkKvbdkxrrTZGt
+DncKjvbdxrnJMqag
+EOcLKvbdCDpBWJmG
+DoCjjvbdlqyUysDi
+EPDKjvbdTfzmlXVe
+DncKjvbdEuxpQMie
+EOcKjvbdbLLfPNcA
+DncKjvbdVgxWXgYz
+DoDKjvbdrbFmLgKy
+DoCjjvbdzaAPGfbM
+DncLKvbdYSlAlsoY
+DoDLKvbdZyEJnClS
+EPDLKvbdEvYopMjF
+DncKjvbdmtuZjiqf
+DoCjjvbdCJKbLIfK
+EOcLKvbdcIljLFvx
+EObkKvbdrJAKFNPF
+DoDKjvbdBiKbKhfK
+EPDKjvbdWIYWYGxz
+DoCkKvbdjAQGaQHK
+DnbjjvbdjblLQftg
+DncLKvbdbhlikGXY
+EPDKjvbdZLrDsmkm
+DoDLKvbdVTlsfMWK
+DoCjjvbdliDsptqa
+DnbkKvbdjuvmcbXw
+DoCjjvbdbVCHXjtI
+DoCkKvbdQvmdClID
+DnbjjvbdLAkHNCXq
+EPDKjvbdZtIhyETO
+DnbkKvbdYkqdTmlN
+DoDKjvbdMtrrKmAX
+DncLKvbdJXtCIMQp
+EPCkKvbdlhdTqUqa
+EObjjvbdnHFYNNfy
+EPDKjvbdxrmhlrBg
+DncLKvbdiLeDmtcZ
+DncKjvbdNrsufdtp
+EObkKvbdlhcsptqa
+EObjjvbdNeETiIkE
+DnbkKvbdxsNhmRbH
+DnbkKvbdADRxKZhp
+DnbjjvbdTqROuUgm
+EOcKjvbdpxoIGqDx
+EOcLKvbdqBIeAWhE
+DnbjjvbdCIkBjiFj
+DncLKvbdTlWPBWPJ
+DoCjjvbdEKHjVxKA
+DnbkKvbdZRNFImEq
+EObkKvbdJbicQjCx
+DoDKjvbdNsTufeVQ
+EObjjvbdDxYMUTsl
+DoDLKvbdaSFcITfL
+EPDKjvbdcTDLTcia
+DoCkKvbdlhdTpuRa
+EObjjvbdCJKbKiFj
+DncKjvbdqAiFAWhE
+EPDKjvbdUslsfLuj
+EObjjvbdWWiXuceH
+EPCjjvbdOEcshiLE
+EPDLKvbdEJhJuxKA
+DoCkKvbdKyRKSzuG
+DncKjvbdHffzZXxH
+EOcLKvbdSLZGUfkT
+EObkKvbdHgHZxwxH
+DnbkKvbdcSbjtEJa
+EPDKjvbdZGwEAPTJ
+DoDLKvbdeAURNXif
+EPDLKvbdMpYQunGs
+EObkKvbdNeDshiKd
+DoDLKvbdzoQQdbkx
+EPDKjvbdWHxWXfxz
+EPCjjvbdCEPaVjNG
+DoCjjvbdbhlikFvx
+EOcLKvbdBvzdIdpW
+DoCkKvbdNPwqWNfs
+EPCjjvbdbhlijfWx
+DncKjvbdqwQLbiZR
+EObjjvbdkClLRGuH
+DncKjvbdNHDQNQVL
+DncKjvbdhkdcmuDZ
+EOcKjvbdKWVFdFHJ
+EPDLKvbdYTMBMtOx
+EObkKvbdSKxfVGjs
+DncKjvbdZoOJEdzK
+EObjjvbdMpXqVmgT
+EPDKjvbdhaoDFXRR
+EPCjjvbdrpWPJcVf
+EOcKjvbdczYpYZRC
+DoDLKvbdLLAhWAJy
+DoDKjvbdEObkLXDE
+EPDKjvbdnVUykKRf
+DnbkKvbdBvzdIdov
+EOcKjvbdGFirOJUR
+DoCjjvbdGGJrNiTq
+EPDKjvbdqAheAWgd
+DncKjvbdxmsIXriD
+EObkKvbdVAbQsRRy
+EPDKjvbdRXODbkhD
+EObjjvbdVZHtZjoO
+EOcKjvbdffMZmfgA
+EOcLKvbdbiMjLGXY
+DoDKjvbdUQpoVUhN
+EPCkKvbdhfjCxuiu
+DoCkKvbdziuPocsU
+EObjjvbdBhkBkJFj
+DnbjjvbdeAURNXif
+DncKjvbdQlxByOUz
+EPDLKvbdRbEEkhxk
+EPCjjvbdrbFlkgKy
+DoCjjvbdaSFbhUGL
+EOcKjvbdsCGMkfkZ
+DoCkKvbdJbicRJcY
+DnbkKvbdqlzKYlHi
+DoCjjvbdZyDimblS
+EOcLKvbdsrqsZZdc
+DoDKjvbdjggMGGNk
+DnbkKvbdADSXiyiQ
+DoCkKvbdehKurORH
+EOcLKvbdrylPsAgn
+EPCjjvbdRWmdClID
+EPCjjvbdbsCjsdKB
+EObjjvbdUQpoVVHm
+DnbkKvbdiCObeXQq
+DncLKvbdUQpoVUhN
+DoCkKvbdKCicRKDY
+DncKjvbdjlakzFGo
+DnbkKvbdMgDQMpVL
+DoDLKvbdWSNxBeMD
+DnbkKvbdvBEZTOdh
+EPCjjvbdsQWPKCuf
+EObjjvbdZeYGzghb
+DnbkKvbdxsNhmSCH
+EPDLKvbdkySrTZGt
+EObkKvbdrDdiQNvB
+DncLKvbdHDjuiajK
+DoCjjvbdURROtuIN
+DncKjvbdKyRJrztf
+EObjjvbdIGfyyYXg
+DncLKvbdXsMBMtPY
+EPCkKvbdaaVdfPpX
+DncKjvbdiHJbyWJu
+EOcKjvbdSKxfVGjs
+DoDKjvbdxZgfFwdr
+DnbkKvbdRNYCZNtz
+EPCkKvbdCDoaWKNG
+DoDKjvbdDjHjWYKA
+EPDKjvbdyNsHwsIc
+DoDKjvbdUtNTfLuj
+DoDLKvbdGGKRnJTq
+EPCkKvbdsBemMGjy
+EPDKjvbdSQUHKFcw
+DnbjjvbdkClKpfuH
+EObjjvbdRyjHrcWA
+EOcLKvbdSPsfjGEX
+DoCjjvbdGckWKBij
+EPCkKvbdGdKujBij
+DnbjjvbdcJMijewY
+EPDKjvbdkIGkefOL
+EPCkKvbdrSVLNkBN
+DnbkKvbdrpWPJbvG
+DoDLKvbdZirgpHBf
+EPCkKvbdHDjujBij
+EPCkKvbdvBDySoEh
+DoDLKvbdePEsKssr
+DoDLKvbdZRMdhldq
+EObjjvbdUQqPUtgm
+DoDLKvbdMSXNZtpz
+EObjjvbdVYhTzKnn
+EOcKjvbdrNZixlIJ
+DoDLKvbdTpqPVVIN
+DnbkKvbdkCkjqHVH
+DnbkKvbdkWWmcaxX
+EOcLKvbdJSyBSlwl
+EObkKvbdmRxtzTEJ
+DncKjvbdptTgRqjt
+EOcLKvbdqYoHfqEY
+DoDKjvbdGZUtaDxC
+EOcKjvbdKQydoGNe
+EPDLKvbdssSTZZeD
+EObjjvbdhkddOUcZ
+DoDKjvbdGdKvJbKK
+EOcKjvbdULvPAuoJ
+DoCkKvbdrEFJPnWB
+DnbjjvbdfNGWfmJk
+EPCkKvbdkWXODaww
+EOcKjvbdMtrrKmAX
+DnbjjvbdEuyPpMie
+EObjjvbdrSVKmkAm
+EPDLKvbdhanbdvqR
+DoCkKvbdkWWmdBww
+DnbjjvbdxUleQyLn
+EOcLKvbdpyPHfpdY
+DncKjvbdpfDeTvBI
+DoCkKvbdnVVZjirG
+DnbkKvbdzjVPocsU
+EPDLKvbdmfdwlmfy
+DnbkKvbdSKyFuGjs
+EObkKvbdVAaprpqy
+EPCjjvbdUaBqTRRy
+EObkKvbdZoNhddzK
+DncKjvbdrNZiyLhJ
+DncKjvbdaMkBruNH
+DoDKjvbdZyDjNcMS
+EPCjjvbdZjTIQHCG
+EObkKvbdjJegilwr
+EPDKjvbdHffzYxYH
+EPDKjvbdaSGChTfL
+DoDLKvbdcJMjLGWx
+EOcLKvbdtlXvaTaX
+DoCjjvbdGYuVAcxC
+EOcLKvbdUsltGLvK
+EPDLKvbdRNXayOUz
+DoDLKvbdRadFLiYk
+EOcKjvbdCTAbsfXS
+EPCjjvbdGZVVAdYC
+EPDLKvbdypnliJwA
+EPCjjvbdSBdFLhxk
+EOcLKvbdGLFSbhNV
+DncKjvbdTppnuUhN
+EObkKvbdezvYdiTw
+DoCkKvbdIsZBSlxM
+DncLKvbdRNYBxmtz
+EPCkKvbdeFOqawCj
+DnbjjvbdtSrTYzEc
+DncKjvbdkDLkQgUg
+DnbjjvbdEARhlzXX
+EOcKjvbdWRmxBeMD
+DoDLKvbdzQnliKXA
+EPDKjvbdpfDdtWAh
+DncLKvbdMgCpMpVL
+DnbkKvbdiZtfLpmf
+EPDLKvbdzQoNJJwA
+EPCkKvbdaNKasUmH
+EPDLKvbdRbDeLhyL
+DoDLKvbdKRZeOeme
+EOcKjvbdZxdJmcMS
+DncLKvbdeKKSVtzn
+EPDLKvbdRjxeuHLT
+EObkKvbdNGcPmPtk
+DoCkKvbdtcDVWvPP
+EPCjjvbdcTDKscjB
+DoDLKvbdbrcLTcia
+EObjjvbdvlvAMcdm
+EObjjvbdFxuVBDwb
+EPCjjvbdhkdcmtby
+EOcKjvbdRotHKFcw
+DncLKvbdelfWgNKL
+EObkKvbduCbuXVno
+EPDKjvbdEYXlUUUM
+EOcKjvbdbUbHXjsh
+EOcLKvbdmgEwmOHZ
+DoCjjvbdEXxLsssl
+EPDLKvbdZLqdTmlN
+EOcLKvbdbsCkUEJa
+EOcKjvbdqvpLbhxq
+EOcKjvbdfIKvRmpg
+DncLKvbdGBOpxizm
+DoDLKvbdnBiwXnmu
+DoCjjvbdKWVFceGi
+EOcLKvbdRbEEkiZL
+EObjjvbdffMZmgHA
+DoCjjvbdUMWPBWPJ
+EObkKvbdkClKpftg
+DoDLKvbdBhkBkIej
+DoDKjvbdhgJbyWJu
+DoCjjvbdEASIlzXX
+EPDKjvbdGZUtaDxC
+DnbjjvbdlYsRryHU
+EOcKjvbdhgKCyWJu
+EPCkKvbdsQWOibuf
+DoCjjvbdRMwbYmtz
+DoDKjvbdZxdJnClS
+EPCjjvbdJTZBTNYM
+DnbjjvbdiLeEOUby
+EOcLKvbdjEjgUoAO
+EPCkKvbdzitopDrt
+EPCjjvbdtcCuWvPP
+DncKjvbdZMRdUNlN
+DoDLKvbddZxoxZRC
+DoDKjvbdFVxoomKF
+DoCkKvbdSLYeuGkT
+DncLKvbdYSlBNTnx
+EObkKvbdeuzwoizs
+EPDKjvbdUQpoUuIN
+DoDKjvbdmpZxujyC
+EPCjjvbdDGlFgAzc
+EPCjjvbdkCkkRGuH
+DnbkKvbdvlvAMdFN
+DoDLKvbdatbHXkUI
+EPCjjvbdFWYoolie
+DnbjjvbdrEFJPnWB
+EObkKvbdpyOggQcx
+EOcKjvbdqwQMChxq
+EOcKjvbdqrVLNkAm
+EOcKjvbderBWzlCo
+DoDLKvbdRWmdDMHc
+EOcLKvbdZoNhdeZj
+DnbkKvbdunszpkPU
+EPDKjvbdGAnpxizm
+DoCkKvbdKCjCqKCx
+EOcKjvbdZshhyDrn
+DoDKjvbdddoSBvcK
+DncKjvbdcScKtEJa
+EOcLKvbdZjShQGbG
+DncLKvbdDncKkXDE
+EPDLKvbdrzMQTBHn
+EPDLKvbdIxUBglRQ
+EPDKjvbdcyxpXxpb
+EObkKvbdMSXMytpz
+EObkKvbdijGIKMwr
+EObkKvbdzdzOzdyp
+DnbjjvbdeATplwjG
+DnbkKvbdcIlikFwY
+DoDLKvbdsPunicVf
+EPDKjvbdmozYvLZC
+DoCkKvbdkyTSSxgU
+DncLKvbdRWnDcLhD
+DncKjvbdHELWJaij
+DncKjvbdZQmFIleR
+EOcKjvbdiCOcEvpq
+EOcKjvbdbrbkUEKB
+EOcLKvbdOFEThhjd
+EObkKvbdbBVdepPw
+EObkKvbdUxhTzKnn
+EObkKvbdzoPpdblY
+EOcLKvbdrbFllHLZ
+DoDKjvbdjggMGGOL
+DncLKvbdqceJQNua
+DoDKjvbdiHJbxvJu
+DoDLKvbdySnImSBg
+EPCkKvbdtTRrxzFD
+EOcLKvbdkVvnEBxX
+DnbjjvbdtcCtvvOo
+EPCkKvbdyzdmrHiI
+DoDKjvbdFjdrbhMu
+DoDLKvbdZyEKODLr
+DoDKjvbdURQnuVHm
+EPCkKvbdZyDimcMS
+EOcLKvbdNQXpunHT
+DnbjjvbdQlxCYmtz
+DnbjjvbdCDoaVimG
+EObjjvbdsPvOibvG
+DnbjjvbdgGLynGgA
+DncLKvbdCDoaWJmG
+EObkKvbdnCKXXnnV
+EOcLKvbdUxgtZkPO
+DnbkKvbdiMFDmuDZ
+DncKjvbdiGicZWKV
+DoDKjvbdcScKtEJa
+DoDKjvbdpssgRqkU
+DncKjvbdsBfNLgKy
+DoDLKvbdGYttaDwb
+DncKjvbdjvWnDaxX
+EPCjjvbdhgJcYuiu
+DnbjjvbdxUldpxlO
+DoDKjvbdUaCRSqSZ
+DnbkKvbdNwoVzdNt
+DoCkKvbdZnnIeEzK
+EPDKjvbdNeEUJIkE
+DnbjjvbdJbjDQjDY
+EPDLKvbdKVuFceGi
+EPCkKvbdKkBIWAJy
+EObjjvbdrafMlHLZ
+EOcLKvbdZLqctNkm
+EObjjvbdMgComPtk
+DncKjvbdjhHMGGOL
+DnbkKvbdJYUCIMQp
+DoCjjvbdhlEcnVCy
+DoDLKvbdxsOJNSBg
+EOcLKvbdRMxBxmtz
+EOcLKvbdHDjujCJj
+EObjjvbdZRMdhmFR
+EPDLKvbdUQpoUthN
+EPCkKvbdvlvANEFN
+EObkKvbdSCEEkhxk
+EPCjjvbdLBKfmCXq
+EPDKjvbdOStVfduQ
+EPCjjvbdGcjvJbKK
+DnbjjvbdVBBprpqy
+DoCjjvbdirziTLJz
+DncLKvbdFWYpQNKF
+DoDLKvbdjKGHjNYS
+DncKjvbdZnmiEdzK
+DoDKjvbdySmiMrBg
+DncLKvbdeAURNYKG
+EPDLKvbdemGWflik
+DoDKjvbdaMkBrtmH
+DoDKjvbdIxUBglRQ
+DoDKjvbdOEcshhjd
+EPCjjvbdpxnhGqDx
+DncKjvbdYSlBNToY
+DnbjjvbdGGKSOJUR
+EOcLKvbdZjTHpGbG
+EPCjjvbdIHGzZYXg
+DncKjvbddndsLTsr
+DnbjjvbdqAheAXIE
+EOcKjvbdVhXvXfxz
+DncKjvbdFyVVAdYC
+DnbjjvbdJvVFceGi
+EPCkKvbdoznDjwoA
+EPDKjvbdvPTzqLPU
+EObjjvbdiifIKMwr
+EOcLKvbdlZTSSxgU
+EObjjvbdQvnECkgc
+DncLKvbdjgfkfGNk
+DnbkKvbdCDoaWJmG
+DnbkKvbdxnTHwriD
+DncKjvbdoAKzshDn
+DoDKjvbdvAdZSndh
+DnbjjvbdRpTgKFcw
+EOcLKvbdiiegilwr
+EOcKjvbdGdLVjBjK
+EObkKvbdGFjRmhtR
+EPCjjvbdZsiJYdTO
+EPCjjvbdJJdAKPfd
+EPDLKvbdKfGHbBRV
+DncLKvbdjhHMFenL
+EObkKvbdbLMFnnDA
+DoCjjvbdUWMPisaR
+DnbkKvbdZjTHpHCG
+EObkKvbdbsCkTcjB
+EPCkKvbdSLYfUfkT
+DoDKjvbdZeYGzhIb
+DncKjvbdrovPJcVf
+EPCjjvbdePFSjtTr
+DncKjvbdJbibqJbx
+EPDLKvbdDxYMUUTl
+DnbkKvbdZHXEAPSi
+DncKjvbdVTmUFlVj
+EPDKjvbdzoQREcLx
+EPDKjvbdKfFhCAqV
+DoDKjvbduDDUwVoP
+DoDKjvbdgFlZmfgA
+EObjjvbdTAEiHbOd
+DoCkKvbdMowqVmgT
+DncKjvbduMXwBTaX
+DncKjvbdeYZssrFz
+DncLKvbdmfdxNNgZ
+DncLKvbdxLXDgzzG
+DoCjjvbdNsTvGduQ
+EPDLKvbdTpqOtuHm
+EObkKvbdZMRctOMN
+EPCjjvbdHEKuibJj
+EPCjjvbdBiKbLJGK
+DoCjjvbdUtNUFkvK
+EOcKjvbdVTltFkuj
+DnbjjvbdczYpXxqC
+EPDLKvbduWNxKQsA
+EOcKjvbddZyQYYqC
+DnbkKvbdyfyMAMdw
+DncLKvbdDihKWXjA
+EPCjjvbdoAKztIDn
+DoCjjvbdcTDLUDjB
+EPDKjvbdJcJcRKCx
+DncKjvbdIxTahLqQ
+DoDLKvbdTqROttgm
+DoDKjvbdjblLQgUg
+EOcLKvbdTppnuUhN
+EPCjjvbdrMyjZLgi
+EObjjvbdypnmIjXA
+DoCkKvbdczYoxZRC
+EObkKvbdFjeTDHmV
+EPCjjvbdZxcimbkr
+DoDKjvbdatbHXkUI
+EPDKjvbdvmWAMdEm
+DoCjjvbdqwQMCiYq
+DoDKjvbduWNwjQsA
+DncKjvbdACqwjZiQ
+DoCjjvbdOTTvGduQ
+EObkKvbdirzhsKiz
+EObjjvbdOTTugFUp
+EOcLKvbdKDJbqJcY
+DoCjjvbdiUyeXRtb
+EObjjvbdfMfXHNKL
+EOcKjvbdjhHMFfNk
+DncKjvbdRpUGjFcw
+EPCjjvbdfILVqnRH
+EOcKjvbdiHKCyWJu
+DoDLKvbdnPzYvLYb
+DnbkKvbdnGeYNOHZ
+DoDKjvbdtvOXjQsA
+EPCjjvbdmIctRVRa
+EOcKjvbdpyOhGpcx
+DnbkKvbdKQydoFnF
+DoDKjvbdkVvnDaww
+EObjjvbdbUbHXjsh
+EOcKjvbdCJLCLIfK
+EPDKjvbdZeYGzhJC
+DncKjvbdcScLUDia
+DoCkKvbdQmXbZOUz
+EOcLKvbdRadFMIxk
+DnbkKvbdziuPodSt
+EOcKjvbdEXxMUUTl
+DnbjjvbdegjvSOQg
+EObkKvbdZtJJYdTO
+EPDKjvbdVAbQsQrZ
+DnbkKvbdkHflFfOL
+EObkKvbdtcCuXWOo
+DnbjjvbdcTDLUEJa
+EPCjjvbdZjTIQHBf
+EObjjvbdTAEhhCPE
+EOcLKvbdbhlikFwY
+DoDLKvbdEPDKkWbd
+EOcKjvbdZtJJZESn
+EPDKjvbdZMRdUNlN
+EPCkKvbdhgJcZWJu
+DncKjvbdUaBqSprZ
+EOcLKvbdEJgiuxKA
+EObjjvbdSPtHKFcw
+DoCjjvbdFfKSOJUR
+EObjjvbdVrOXaeMD
+DoCjjvbdrXPkcIxq
+DoDKjvbdZjTHofaf
+EOcLKvbdVYgszLOn
+DncKjvbdIwsagkpp
+DncLKvbdTkvPBVni
+EOcLKvbdUtNUFkuj
+EObjjvbdZnmheEyj
+EPDKjvbdyYIjBoyk
+EPCkKvbdqlyiyMIJ
+EPCjjvbdYzbeqjVy
+EOcLKvbdUQqOuVIN
+EObkKvbdZMSDtOMN
+DncKjvbdVvhxWDdg
+EOcLKvbdiZuFlRNf
+EObjjvbdZtJJYcrn
+EPCjjvbdmuUzKirG
+DoDLKvbdVUMtGMVj
+EPDLKvbdhWyAzzAJ
+DoDLKvbdfIKvRmqH
+DnbjjvbdqdFIpOVa
+DnbkKvbdIwtCHkpp
+EOcKjvbdeEnrBvcK
+DnbkKvbdJuuFdFGi
+DoDKjvbdeOeTKtUS
+EObjjvbdKWUfDeGi
+EPCjjvbdiHJbyViu
+EOcKjvbdBraCsfWr
+DoCjjvbdGYuVBEYC
+DoCkKvbdnHEwmOHZ
+EPDKjvbdZisIQGaf
+EPCkKvbdmpZxvKyC
+DoDLKvbdmSYuZrdJ
+EObkKvbdKDJbqKCx
+EOcLKvbdZsiJZETO
+EPDKjvbdnCJvxOmu
+DoCkKvbdjgflGGOL
+DnbkKvbdRosfjFdX
+EPCjjvbdRECaQQcr
+DnbkKvbdNHComQVL
+EPCjjvbdrJAKEmOe
+DoDLKvbdqBJFAXIE
+DncLKvbdGLFTDINV
+EOcLKvbdhgJbxujV
+DnbkKvbdjSzhsKiz
+EOcKjvbdKWVGDdfi
+DoDKjvbdZnnIeFZj
+DnbjjvbdxxIiaoyk
+EObkKvbdczYpYZQb
+EPCjjvbdZxcjODMS
+EObkKvbdiHJbxvKV
+DoCjjvbdJzoexEAN
+DoCjjvbdaRfChTek
+DoDLKvbdxwhjCPyk
+DoDLKvbdVqnYBeLc
+DnbkKvbdRDcBPpdS
+EObkKvbdYqNFImFR
+EPDKjvbdsrrTYzFD
+EOcKjvbdqcdhpOWB
+EOcKjvbdaNLCTUmH
+DoDKjvbdnPzYukZC
+DncLKvbdKCjDRKCx
+EObjjvbdFkEsDINV
+EPDKjvbdMgDQMouL
+DncLKvbdOXnuzdNt
+EPCjjvbdpstGqrLU
+EPCkKvbdRbDdkhyL
+DnbkKvbdaogGdLzd
+DncKjvbdjlbLydgP
+DnbjjvbdUMVoAvPJ
+EPCjjvbdJqZeOfOF
+DoDLKvbdUsmTekvK
+DoCjjvbdpyOgfpcx
+DnbkKvbdJYUCIMRQ
+DncLKvbdjJfHjMwr
+DoCjjvbdRosgKGDw
+DoCkKvbddZxpYYqC
+DncKjvbdddnrBwCj
+EPDKjvbdijGIJlxS
+DoCjjvbdkWWnECYX
+EObkKvbdqlzJxlIJ
+EOcLKvbdzaAPHHBl
+DoDKjvbdlZTSSyGt
+DnbjjvbdatbHXkUI
+EOcLKvbdNdcshiKd
+DncKjvbdGdKujBjK
+DnbjjvbdRWnDcMID
+DoCjjvbdSxKlNzkY
+EPDKjvbdHDkWJbJj
+EPDLKvbdZxcjNcLr
+EOcKjvbdLYqKSzuG
+EPDLKvbdjuvmcaww
+EPDKjvbdxmrhYTJD
+EOcKjvbdZirhPfaf
+DnbjjvbdfIKurNqH
+EPCkKvbdYTLaNTnx
+DoDLKvbddtAUASlv
+EPCkKvbdZLrDtOLm
+DnbjjvbdnGdxMnHZ
+DoCjjvbdeFPSCXCj
+DncLKvbdYORAYUvU
+EPCjjvbdrXQMDJZR
+EPCkKvbdRpTfjGDw
+DoCjjvbdpssfrSKt
+EPCkKvbdKWUedFHJ
+DnbjjvbdVvhwvDdg
+DncKjvbdLrWlzUpz
+DncKjvbdwtmFQxkn
+EObkKvbdmIdTqUqa
+DnbkKvbdJutedFHJ
+EOcKjvbdVZITykPO
+DoDLKvbdhbPDFXQq
+DnbjjvbdmuVZjirG
+DncLKvbdieKgVPAO
+DncKjvbdEuyPpNJe
+DoDKjvbdiHJcYuiu
+EPDKjvbdmgFYNNfy
+DnbkKvbdOTUWGeUp
+DoCjjvbdZRNFJNFR
+EPDLKvbdYpmFJNEq
+EObkKvbdRMxBxnUz
+DncKjvbdNQYQvOHT
+EOcLKvbdMoxRVnHT
+DoDKjvbdpyOhGpcx
+EObjjvbdRyjITDWA
+EObjjvbdrykosAhO
+EOcLKvbdhaoDFXRR
+DoDLKvbdIryBSmYM
+DnbjjvbdlZSrTYft
+DncLKvbdegjurORH
+EOcKjvbdJYUCHlRQ
+EOcLKvbdREDApRES
+EObjjvbdmgFYMnHZ
+EPCkKvbdZyDimblS
+DoCkKvbdiCPCdwQq
+EObkKvbdbVBgYKtI
+DoDLKvbdNddUJJLE
+DoCjjvbdrpVnibuf
+EPDLKvbdKaLGlbYR
+DnbjjvbdTpqPVUhN
+DoCjjvbdcyxoxYpb
+EPDKjvbdhfibxvJu
+EPCjjvbdJpydnfNe
+DncLKvbduWOXipsA
+DoDKjvbdrRtkNkAm
+EObkKvbdNQXqVmgT
+EObkKvbdCIkBkJFj
+EPDLKvbdqUUHSRjt
+EOcLKvbdeYZtTqez
+EPCjjvbdqUUHRqkU
+DncKjvbdkWXODaxX
+EPCkKvbdaNKbTVNH
+EPCjjvbdvAcxroEh
+EOcKjvbdlZTSTZGt
+EOcLKvbdLAkHNCYR
+DoDLKvbdUtMselWK
+EPCjjvbdnVUzKjRf
+DoDLKvbdypoMiJwA
+EObjjvbdKDKCqKDY
+DoCjjvbdrWolDIxq
+DoDKjvbdwyhFfXeS
+EOcKjvbdnGeYMmgZ
+DoDLKvbdREDAopcr
+EPCjjvbdiUzFXRuC
+DoDLKvbdZQldhmEq
+EPCjjvbdtvNwipsA
+EPDKjvbdbrcLUDia
+DoDLKvbdegkVqnQg
+DoCjjvbdznopdcMY
+DoCjjvbdmfeXlmgZ
+DncLKvbdXrlBMsnx
+DoCjjvbdmgEwmOGy
+DoCkKvbdjmCLydgP
+DncLKvbdmJEUQuSB
+DnbjjvbdRbDeLiYk
+DnbkKvbdQdDBPqDr
+EObkKvbdjKGHjMxS
+DoCkKvbdyOTHxSiD
+EPCjjvbdQwNdCkhD
+EObjjvbdfNFwGljL
+EObjjvbdVqmxCElD
+EOcKjvbdeOeTKtTr
+DoDKjvbdUaBqSpqy
+DnbjjvbdmIdURUqa
+DoCkKvbdUWMQJtBR
+DnbjjvbdxnSgxSiD
+DncKjvbdwXMBVaVu
+DnbjjvbdvvkaVaWV
+EObkKvbdmaiwXnmu
+DoCjjvbdgQBzwEYI
+EOcKjvbdFVxpPmJe
+EObjjvbdKDJcQjCx
+DoCkKvbdYlRdUOMN
+EOcLKvbdZoOIddzK
+DoCjjvbdffMZnHHA
+DncKjvbdnQZxujxb
+EPDLKvbdwXMBWBVu
+DoCjjvbdLFfIBaQu
+DncKjvbdGQASwHFy
+DnbkKvbdauBfxKsh
+EOcLKvbdraelkgKy
+EObkKvbdnVUzLKSG
+DoDKjvbdANHxrwZx
+DncLKvbdqZPHfqEY
+EObjjvbdvPTzpjoU
+EObjjvbdrWpMDIyR
+DnbkKvbdCDpBWKNG
+DnbkKvbdyOSgwrhc
+DnbkKvbdeKKSVtzn
+DncKjvbdMowpumgT
+EOcLKvbdOFDtIhjd
+EPDKjvbdkDMLRGtg
+EPDKjvbdiiehJlwr
+EPDLKvbdBdQAvJlf
+DoDLKvbdZyEKODMS
+EObjjvbdJqZePFme
+DnbkKvbdKxqKSztf
+EObkKvbdmJEUQuSB
+DnbkKvbdREDAopdS
+EPDKjvbdwzHefYEr
+EPDKjvbdnHExMnGy
+EOcKjvbdmozZVjyC
+EPDKjvbdZHWdAPTJ
+DoDKjvbdjgfkfFnL
+DncKjvbdczZPxYqC
+DoDKjvbdEXwlUUTl
+DncKjvbdhuZdvrVC
+DnbkKvbdxKwDgzzG
+EPCkKvbdsZlQSaIO
+EOcKjvbdzRPMiKXA
+DoDKjvbdqvolDIxq
+DoDKjvbdQdCaPpcr
+EPCjjvbdJmADyfuB
+DnbjjvbdsCGNLgLZ
+DoDKjvbdKfGICAqV
+DoCkKvbdbiNJkGXY
+DncKjvbdiGicYvKV
+EPCjjvbdSxLLmzjx
+DncKjvbdLAjflaxR
+EPCkKvbdUyHsyjoO
+DnbjjvbdcyxoxYqC
+EObkKvbdxZgfGYFS
+EPDLKvbdZoNiEeZj
+DncLKvbdZtIhxcrn
+EPDLKvbdIwtCILqQ
+DncLKvbdQmXbYmtz
+EOcLKvbdmuUzKiqf
+EPDKjvbdsQVnibuf
+EObjjvbdOSsugEtp
+EOcLKvbdYlSETnLm
+EObkKvbdUtNUGMWK
+DoDLKvbdzeZnzeZp
+DoDKjvbdqTtHRqkU
+EObjjvbdmbJvxPNu
+DoDLKvbdliDsqUqa
+EPCjjvbdhanbdvpq
+DoDKjvbdiifHilxS
+DoDKjvbdmJDsptqa
+DnbkKvbdDncKkWcE
+EPCkKvbdaofgELzd
+DncKjvbdijGIJmXr
+EPCkKvbdRkYfUgLT
+EObkKvbdHEKuibKK
+DnbjjvbdVhXuwfxz
+DoDLKvbdiMEcmuCy
+DnbkKvbdJcJcQibx
+DnbkKvbdmfeYNOGy
+DoDKjvbdqUTgSSKt
+EPDLKvbdePErjtUS
+EObkKvbdaNKasUmH
+EObkKvbdiifIJmYS
+EOcKjvbdsPunjCvG
+EObkKvbdbrcKtDjB
+EPDKjvbdbhlikFwY
+EPCjjvbdrpVnjDWG
+EPCjjvbdaMkCStlg
+DncKjvbdMpXqVnGs
+EPDLKvbdZjShPfbG
+EPDLKvbdfHkVrOQg
+DoCkKvbdDnbjjvbd
+DoCkKvbdkySqsYft
+DoDLKvbdZRMeImEq
+DoDLKvbdYpleIleR
+DncKjvbdiHJbyViu
+EObkKvbdrMyixkgi
+EPDKjvbdqvokbiYq
+EOcKjvbdzitoodTU
+DnbjjvbdVYhTyjnn
+EPDLKvbdyYJJbPzL
+EObkKvbdeFPSCWcK
+EPDKjvbdIsZArlxM
+DnbjjvbdkIHLfGNk
+DoDLKvbdehLVqmqH
+EOcLKvbdvBEZTPFI
+DncKjvbdnUuZjirG
+EPCjjvbdakLfOnDA
+DnbkKvbdEzsqEkcJ
+DnbjjvbdVhXvXgYz
+DoCjjvbdIryBTNYM
+DncKjvbdZirgpHBf
+DoDKjvbdEYYLsstM
+DnbjjvbdZshhyETO
+DoCjjvbdOTUVgFVQ
+EObjjvbdZisHpGbG
+DoDLKvbdkDLkRGtg
+EObkKvbdegjvSNpg
+DncLKvbdfIKvRnQg
+DncLKvbdJKEAJpGd
+DncKjvbdrRtkNkBN
+EPCkKvbdjvWnDaxX
+DoCjjvbdmfdwmNgZ
+DnbjjvbdbrcLUEJa
+DncLKvbdnQZxujxb
+DoDKjvbdNsTugEuQ
+EOcKjvbdUVlPisaR
+EObkKvbdHDjujBij
+EPDLKvbdSBdFMJYk
+EPCkKvbdVvhxVdFH
+DncKjvbdIsYaTNXl
+EPDLKvbdIrxaSlxM
+EPDKjvbdfoazwDwh
+EPCkKvbddeOqbXDK
+DoCjjvbdJpzEnfNe
+DncKjvbdqiAKFNOe
+EPDLKvbduDCtwWOo
+DnbjjvbdZjShQGbG
+EObjjvbdVAbQsRSZ
+DncLKvbdtcCuWuoP
+DoDKjvbdTvLoitAq
+EOcLKvbdZQleIleR
+DoCkKvbduLxXAtAw
+DnbjjvbdqYoHfqDx
+DoDKjvbdJYTbHkqQ
+DncLKvbdGZUtaDxC
+EObjjvbdqFdEtWAh
+EPCkKvbdILaznWqL
+EObkKvbdQwNdCkhD
+EPCkKvbdmJDsqUqa
+EOcKjvbdvBEYrneI
+DoDKjvbdapGgELzd
+DoCjjvbdwWlAvAvV
+DoDLKvbdJbicQicY
+EPDKjvbdaaVdepPw
+DoCkKvbdsZkosAhO
+DoCkKvbdNeETiJKd
+EObkKvbdEObkLXCd
+EPCjjvbduCbuXVno
+DoCkKvbdrykpTBHn
+DnbkKvbdrEFIpNua
+DoCjjvbdlYrrSxft
+DoDLKvbdqdFIpOVa
+EObjjvbdrbFmMGjy
+DnbkKvbdRpUHKGDw
+EOcLKvbdzoPpdcMY
+DoDLKvbdfILVqnQg
+DoCkKvbdlZSqsZHU
+DncKjvbdrzMQSaIO
+DoCkKvbdhuZeWrUb
+EObjjvbdfSAvzkbo
+DoCkKvbdVZIUZjnn
+EOcLKvbdhlEdOUcZ
+DoDKjvbdbUagXkUI
+DoCjjvbdqUTgRqjt
+DoDLKvbdqTsfrRjt
+DnbkKvbdrouoKCuf
+EPDKjvbdmbKXXoNu
+DoDLKvbdhbPDEwRR
+DncLKvbduVnYKRTA
+DoCjjvbdcJNKKfXY
+EPCjjvbdeFOrCXDK
+EPCkKvbdczYoxYpb
+DnbkKvbdKfGHaaRV
+DoCjjvbdMuTRjmAX
+DoDKjvbdkMalZeGo
+DnbkKvbdbhmKLFvx
+EPDLKvbdjuwODbXw
+DoDLKvbdUMVoBVoJ
+DoCkKvbdRpTgJfDw
+EOcLKvbdajlFoNcA
+EPCjjvbdRMwaxnUz
+EOcLKvbdJcJbpjDY
+DoCjjvbdjhHLefNk
+EOcLKvbdcasNSATm
+DoDKjvbdyOTHwriD
+EObjjvbdKQydnenF
+EObjjvbdZirhPgBf
+EPCjjvbdBiKbLIfK
+EOcKjvbdNeDtIiKd
+EOcKjvbdkDLjqGtg
+DoDKjvbduDDVWuoP
+DncLKvbdePErjtTr
+EOcKjvbdJbicQjDY
+EPDKjvbdrylQTBHn
+DnbjjvbdkMbMZeGo
+DncLKvbdtlYWaUAw
+DoCjjvbdDwxMUTtM
+EObkKvbdjblKqGtg
+DoDKjvbdRMxCZNtz
+EObkKvbdqYoIGqDx
+EPDKjvbdmfeYNNgZ
+EObjjvbdTAFIhCPE
+DoCjjvbdjKGIKMxS
+EOcLKvbdMpYRWOHT
+EOcLKvbdMoxRVnGs
+DncKjvbdhaoDEwQq
+DnbkKvbdEXxMTtTl
+EPCkKvbdMgCpMpVL
+EObjjvbdRzKITDWA
+EOcLKvbdrzLosBHn
+EPCkKvbdBraCsfWr
+DoCkKvbdaaVeGPow
+EOcLKvbdIGgZyXxH
+EPDKjvbdliETptqa
+EOcLKvbdbKlGPODA
+DnbjjvbdRadElJZL
+EPDLKvbdjFLHVPAO
+DnbkKvbdiBnbdwRR
+EObkKvbdvBDyTOeI
+DnbjjvbdUyHtZjnn
+DnbkKvbdmgFYNOGy
+DnbkKvbdGKdsDHlu
+EPDLKvbdZRNEiMeR
+DoCkKvbdbLLeoODA
+EObkKvbdANIZSvzY
+DoCkKvbdziuPpDrt
+DnbjjvbdWHwvXgYz
+EPDKjvbdsBfNLgLZ
+DoCkKvbdWWiXudFH
+EPDLKvbdwzIGGYEr
+EOcLKvbdVTmUGMWK
+EObjjvbdMSXMytpz
+DncKjvbdZirhQGaf
+EObjjvbdCJLBjiGK
+EPCjjvbdZLrETnLm
+EObjjvbdelevfljL
+DncKjvbdGYuVBEYC
+EPCkKvbdkCkjpgUg
+DoCkKvbdbhljLFwY
+DnbjjvbdeEoSBvbj
+DncLKvbdvAcyTPFI
+DnbkKvbdjblLQgVH
+EPCjjvbdeEoSBvbj
+DnbkKvbdaMjbStlg
+EObjjvbdrDdhpOWB
+EOcKjvbdbKlFoODA
+EPDLKvbdZjTIQGaf
+EObjjvbdEzsqEkcJ
+DnbjjvbdZRNEiNEq
+EObjjvbdqlzJxlIJ
+DnbkKvbdkIHLfFmk
+EObkKvbdMtrrKmAX
+EPCkKvbdNQXpvNgT
+EPCkKvbdbrcKtEKB
+EObjjvbdSPtGjGEX
+DoDKjvbdxwiJaoyk
+DnbjjvbdVYhUZkPO
+DoDLKvbdXrlBNUPY
+DoDKjvbdZnmiEdzK
+DoCjjvbdWWiXvDeH
+DoDLKvbdyNsHwsIc
+DoDKjvbdwyhFfYEr
+EPDLKvbdNeDshhkE
+EPDKjvbdBiLBkJFj
+EOcKjvbdJqZdoGNe
+EOcKjvbdbAvEepQX
+DoCjjvbdaNLBsUlg
+EPDLKvbdvBDxsOdh
+DncKjvbdGFirNiTq
+EPDLKvbdZnmiEeZj
+DncLKvbdePFSjtTr
+EOcKjvbdnGdwlnHZ
+EOcLKvbduDDUvuno
+EObjjvbdZQmFIldq
+DoCkKvbdcyxpYYqC
+EOcLKvbdMRvlzVQz
+DoCjjvbdtcDUwVoP
+EPCkKvbdrXQLbhxq
+DoDKjvbdkVwODbXw
+DnbjjvbdnCJwYOmu
+DnbkKvbdqvpLbhxq
+DoDKjvbdKDJcQjDY
+DnbkKvbdvwMAvAuu
+EPDKjvbdtvNxKRTA
+DoDKjvbdYkqctOMN
+DoDKjvbdtcCuWvOo
+DoCjjvbdEObkLXDE
+DoCkKvbdbrbjtDia
+EObkKvbdDncKkXDE
+DnbjjvbdxxJKBozL
+EPCjjvbdbhlikGWx
+DncKjvbdJXtCIMRQ
+EOcLKvbdkVvmcaxX
+DoCjjvbdqwPkbhyR
+EObjjvbdySnImRbH
+EObjjvbdZQleImFR
+EObkKvbdmpZxujyC
+EPCjjvbdhbPDEvpq
+EObkKvbdpyPHgREY
+DoDLKvbdwzIGGXeS
+EObjjvbdaSGChUGL
+DoDKjvbdrbFmMGkZ
+EPCkKvbdxKwEHzyf
+DnbkKvbdJXtBgkpp
+EPCkKvbdlZTRrxft
+EOcKjvbdFVyPpNKF
+DoCkKvbdaRecHsek
+DoDKjvbdFfKRnJUR
+DoCjjvbdyOTIXrhc
+DoDLKvbdyOSgxShc
+DoDKjvbdEOcKjwCd
+DoCjjvbdzoPpeClY
+DoCkKvbdURRPVUhN
+DoDLKvbdVqmxCFMD
+EOcKjvbdNVSrKmAX
+EOcKjvbdTvLpKTaR
+EPDLKvbdCTAbtFwS
+EPDLKvbdZyEKNblS
+EOcLKvbdsCFllHLZ
+EObkKvbdjlbMZeHP
+EPDKjvbdMpXpunGs
+EObjjvbdaNLCSuNH
+DoDLKvbdkCkjqHUg
+EPCjjvbdTYKlNzjx
+DnbjjvbdNxOuzdOU
+DoCkKvbdegjvRmpg
+DoCjjvbdhfjCyWKV
+DncLKvbdjggMFfNk
+EOcKjvbduVmwjRTA
+DnbkKvbdDjHiuxKA
+EOcLKvbddePRavcK
+DnbkKvbdwkWcgzyf
+DnbkKvbdHlBznXQk
+EPCkKvbdatafxKsh
+EPCjjvbdcJMjKfXY
+DoDKjvbdrDdiQOWB
+DoDLKvbdVvhwvEEg
+EObjjvbdwjvdHzzG
+DncLKvbduMYXAtAw
+DoDLKvbdZQmFJNEq
+EPCjjvbdyOTIXriD
+DoCkKvbdbiNKLGWx
+DncKjvbdHEKvKBij
+EPDLKvbdYlSDtNkm
+DoDKjvbdTqROuVIN
+EPCkKvbddeOqbXCj
+EOcLKvbdCTBCsewS
+EPCjjvbdnUtykJrG
+DnbjjvbdlZTSSyGt
+EPCjjvbdjmBkyeGo
+DnbkKvbdVhXuwfxz
+DncLKvbdePFTLTsr
+EOcKjvbdemGWgMik
+EObkKvbdhuZeWquC
+EPCjjvbdEvYpQNKF
+EOcKjvbdpaJFAXHd
+DoDKjvbdJSyBSmYM
+EOcLKvbdSCDdlIxk
+DncKjvbdSLZGVGkT
+DnbkKvbdrbFlkgKy
+EObjjvbdJSyAsMwl
+EOcKjvbdEOcKkXDE
+EPCjjvbdMoxQumfs
+EPDKjvbdUQpnuUgm
+DncKjvbdaaWFFoow
+DnbkKvbdakMGPODA
+EObkKvbdrEEhomua
+EOcKjvbdmozZWLYb
+EObjjvbdVgwuxGxz
+EOcLKvbdCJLCKhej
+EPDLKvbdVUNUGLvK
+EOcLKvbdLGGHbBRV
+DoCkKvbdlqxtysEJ
+EOcLKvbdcScLTdKB
+DncKjvbdhtydwRtb
+DoCjjvbdcTCjscia
+DncLKvbdUslsekuj
+DoDKjvbdwuNFRYkn
+EOcLKvbdijGHjNYS
+DoCjjvbdJSyBSmYM
+DoDKjvbdEYXlUTtM
+EPDKjvbdUyITzKoO
+DnbkKvbdvBDyTPFI
+DoDKjvbdYlRcsmkm
+DoDKjvbddePRbXCj
+EPCkKvbdVZHtZjoO
+EPDLKvbdWXIxVceH
+EPCjjvbduDDUwVoP
+DncKjvbdQlxBxnUz
+DoDLKvbdfpBzvdYI
+DoCjjvbdMJBlRYAS
+EPCkKvbdZisHofaf
+DnbkKvbdkWXNdCXw
+EOcKjvbdEYXkstTl
+EOcKjvbdfekymgHA
+EPDKjvbdelfWflik
+EPCjjvbddCTNSAUN
+EPDKjvbdpfDeUVaI
+DncLKvbdiBnbeWqR
+EObjjvbdEuyPoljF
+EPCkKvbdRDcBQRES
+DncKjvbdhfibxujV
+EObkKvbdVqnYBeMD
+EPDKjvbdJKEAKQGd
+EOcLKvbdsQVoJbuf
+EOcKjvbdqcdhonVa
+EObjjvbdJcKCqJcY
+EOcKjvbdpfEEsuaI
+EPDLKvbdxnTIYShc
+EOcLKvbdxVMdqYlO
+EObjjvbdZyDimcMS
+DncKjvbdiGjCxvKV
+DoCkKvbdRbEEkiYk
+DoCjjvbdWIYVxHYz
+EPDLKvbdYzcFqjVy
+DncLKvbdTYLLmzjx
+DoDLKvbdwXLaVaWV
+DoDLKvbdMRvlyuQz
+DoCjjvbdajkeoNcA
+EPCjjvbdjEkHUoAO
+DoCjjvbdZoNiFFZj
+DncLKvbdlZTRryHU
+DoCjjvbdcTDLTdJa
+EOcLKvbdlhctRVSB
+EObjjvbduaEYroFI
+DncKjvbdzjUpQDsU
+DoDLKvbdyqPNIiwA
+DnbjjvbdhkdcnUby
+EObjjvbdVYgtZjoO
+DnbjjvbdCJLCLJFj
+EPCjjvbdzeZnzdyp
+DnbjjvbdqlyjZMIJ
+EOcLKvbdGAnpyJzm
+DoDLKvbdNGcQMpVL
+DncKjvbdADSXiyiQ
+DoCjjvbdLBLHNCYR
+DoCkKvbduVnXjRTA
+DncKjvbdtSqsZZeD
+EPDKjvbdpyOhGqEY
+EObjjvbdEuyPomKF
+EPDKjvbdyOSgxTIc
+EPDKjvbdGFiqnJTq
+EOcKjvbdyYJJbPzL
+DncLKvbdADRwjZiQ
+DncLKvbdCSaDUFwS
+DoDLKvbdEzsqEkbi
+EOcLKvbdssSTYyeD
+DnbkKvbdSBdEkiZL
+EObjjvbdFWZQPlie
+EObkKvbdbBVeFpPw
+DoDLKvbdBdQBVjMf
+EPDLKvbdptUHRqjt
+EPCkKvbdQwODcMID
+DoDLKvbdelevgMik
+DnbjjvbdVTmUFkuj
+DnbkKvbdLYqJrzuG
+DoCkKvbdCTAbsevr
+DoCjjvbdJpyeOfOF
+EPCkKvbdOStWHEtp
+EOcLKvbdKVtfEEfi
+DoCkKvbdmuUykJqf
+DnbjjvbdQZNAHSrK
+DnbjjvbdMgDPlpUk
+DnbkKvbdCIkBjhfK
+EObjjvbdBsBCsewS
+EOcLKvbdYzbfRivZ
+EOcLKvbdrzMQSaHn
+EOcKjvbdRosfjFcw
+EPDKjvbdANHyTXZx
+EPCkKvbdliDsptqa
+EOcLKvbdACrXizIp
+EPCjjvbdLFfICApu
+DoCjjvbdbAvEepPw
+EOcKjvbdTpqPVVHm
+DoCjjvbdsBemMGjy
+EPCkKvbduaEZTPEh
+DoCkKvbdOStWHEtp
+EPCjjvbdbBVeGQPw
+EObjjvbdOSsufeUp
+DoCkKvbdjAQHBPgK
+EPCjjvbdbBWEfPow
+EPDKjvbdtSqsZZdc
+EPCkKvbdegjuqmpg
+DoDLKvbdRotGifDw
+DoDKjvbdmJEUQtrB
+DoCjjvbdcIljKewY
+EObkKvbdbiMjKewY
+EObjjvbdcScKsdJa
+EPDKjvbdtSqsYyeD
+DnbkKvbdrpWOjCvG
+EPDLKvbdBiKbLIej
+EPCkKvbdBdPaWJmG
+EObjjvbdZRNEhmEq
+EOcLKvbdiUzFWrUb
+EPCkKvbdmIdUQtrB
+EPCkKvbdbUafxLTh
+EOcKjvbdnCKWxOmu
+DoCkKvbdsZkosBIO
+DnbkKvbdHDjujCJj
+DoCjjvbdWSOYCFLc
+EPDKjvbdmJETqVSB
+DnbjjvbdrXPkcJYq
+EObkKvbdMgDPlpVL
+DnbjjvbdZisHpGaf
+DoCjjvbdGGJqmiTq
+EObkKvbdIHGyyYXg
+EObkKvbdqTsgRrKt
+EObjjvbdmJDtRVSB
+DnbjjvbdddoSBvbj
+EPDKjvbddePSBvbj
+DnbjjvbdBcpAvJlf
+DncKjvbdezvYeItX
+DoDKjvbdmgEwmNfy
+EObjjvbdDigivXjA
+EOcLKvbdmJEURUrB
+EOcLKvbdePFTLTtS
+EPDKjvbdVTmUGMVj
+EPDKjvbdnBivwnnV
+EPCjjvbdZnmhddzK
+DncKjvbdZeXfzgiC
+DoDLKvbdEuyPpNJe
+DoDLKvbdqdEhpNua
+DoDKjvbdFWYpQMie
+DoCkKvbdMfcQMpVL
+EOcKjvbdmttykKSG
+DnbjjvbdlhcspuSB
+EPCjjvbdWSNwbFMD
+EPDKjvbdRbEElIyL
+EOcKjvbdyNsHwsIc
+EPCjjvbdrylQTAgn
+DncLKvbdADSYJyiQ
+EOcKjvbdZjTIPgBf
+EObjjvbdKDKDQibx
+EObkKvbdKDJcRJcY
+DoCkKvbdmSZUzSdJ
+EPCjjvbdaNKartlg
+DoDKjvbdIGgZyXwg
+EObjjvbdauCHXjsh
+EObkKvbdxUmEpyLn
+EPCjjvbdNsTugEtp
+EPDLKvbdZyDimblS
+DoDKjvbdbUagYKtI
+DncKjvbdliETpuSB
+EOcKjvbdDihKWXjA
+DncKjvbdZtIiZETO
+EObjjvbdygZMAMeX
+DoDKjvbdfNGWgMik
+DoCjjvbdZMSEUNkm
+EOcKjvbdsrqsZZdc
+EPCkKvbdACqxJzJQ
+EPDLKvbdNdcshiKd
+DoDKjvbdyqOmIiwA
+EOcKjvbdRMwbYmtz
+EOcKjvbdYpmEhleR
+DoDKjvbdjJfHimYS
+DoCjjvbdrbFmMHLZ
+DoCkKvbdBcpBWKNG
+DoDKjvbdIxTbHkqQ
+DoDKjvbdhuZdwSUb
+EPDLKvbdJYUBglQp
+EPCkKvbduCcUwVno
+DnbkKvbdwuNEpyMO
+DncKjvbdssSSxzEc
+DoDLKvbdGdLWJbKK
+EObjjvbdFjdsDIMu
+DncLKvbdfkGzbfAE
+EOcLKvbdrRtkOLBN
+EPDLKvbdajkfOmcA
+EPCjjvbdrMzJxkhJ
+DncLKvbdqZOhHREY
+DoDKjvbdmJEUQuSB
+DnbkKvbdRDbaQRES
+EPCjjvbdpyPHgREY
+DnbjjvbdMIalQxAS
+DncLKvbdiZuGMROG
+DoDKjvbdgFkymfgA
+DncLKvbdsCGMkgLZ
+EObkKvbdRotHJecw
+EPDKjvbdkClKpftg
+EPCkKvbdRjyGUgLT
+EOcKjvbdhuZdvqtb
+EOcLKvbdmttzKjSG
+EObjjvbdhlEdOVDZ
+DoDLKvbdZisHpGaf
+DnbkKvbdTqQntuHm
+EPDLKvbdNdctIiLE
+EObkKvbdWRnXbFLc
+EPDLKvbdKVtfDdgJ
+EPCkKvbdJSyBTMwl
+DnbkKvbduWNxKQsA
+DoCkKvbdqGEFUVaI
+EPDKjvbdhkdcnVDZ
+EPCjjvbdySnIlrBg
+EOcLKvbdYlRctNlN
+EObkKvbdvBDxroFI
+DoDLKvbdxwiJbPzL
+EPCjjvbdyNsHxTJD
+DoCjjvbdhfjDYujV
+DoDLKvbdcImKLFwY
+DnbjjvbdqwQMChxq
+DncLKvbdaaWEfQPw
+DnbkKvbdUQqOuUhN
+EOcLKvbdUaCRSqSZ
+DnbjjvbdRMxByOUz
+EPDKjvbdKCjCpjCx
+DncLKvbdrMzJyMIJ
+EPCjjvbdOEdThhjd
+EPDKjvbdrSUkOKaN
+EObkKvbdMowpunGs
+DoCjjvbdhzVGLpmf
+EOcLKvbdaMkBsVMg
+DoCjjvbdkIGkfFnL
+DnbkKvbdYpldiNFR
+EPDLKvbdZxcjNcMS
+EPDKjvbdGGKRnJUR
+EPCjjvbdbiNKKfWx
+EObjjvbdmRyUyrci
+DncKjvbdLrXNZtpz
+DncKjvbdZjTIPgCG
+DnbkKvbdypoNIiwA
+EPCjjvbdDihKVxKA
+DncKjvbdyfxlANFX
+DoDKjvbdiMFEOVCy
+EPCkKvbdtcDUvvPP
+DoCkKvbdEvYpQMie
+DnbjjvbdZLrDtOLm
+EPCjjvbdKQzFPGNe
+EPDKjvbdGdLVjCJj
+DoDKjvbdqYoHfqDx
+DoDLKvbdFVxoomJe
+DnbkKvbdKRZePFnF
+DoCjjvbdFVyQQMjF
+DnbkKvbdTulQJsaR
+EObkKvbdkHgMFenL
+DoDKjvbdVUMselVj
+EPDLKvbdrDdhonVa
+DncKjvbdkVvmcaxX
+DoDLKvbdrRuKnLAm
+EOcKjvbdJbibpjDY
+EPDKjvbdXrlAmToY
+DnbkKvbdZirhQGbG
+DnbjjvbdjgfkfFnL
+EOcKjvbdGFjSOJTq
+DoDKjvbdSCDeMJYk
+DoCkKvbdpecdtWAh
+EObjjvbdzeZnzdyp
+DoCjjvbdMJBlQxAS
+EPDKjvbdnBivwnmu
+DoDKjvbdRadElIyL
+DoDLKvbdsZlPsBHn
+EObjjvbdznopeDLx
+EOcLKvbdCJKbKiFj
+DncLKvbdmgExNNfy
+DnbkKvbdnPzYvKxb
+DncKjvbdrDdiPnVa
+DoCjjvbdAMgxrwZx
+DncLKvbdTfzmkwWF
+DncKjvbdqiAJdloF
+EPCkKvbdwuMeRZLn
+DoCjjvbdVUNUFkuj
+DoDLKvbdKQyePGNe
+DncKjvbdLqvlzVQz
+DoDKjvbdmgFYNNgZ
+DnbjjvbddxZtTrFz
+EObkKvbdqTsgSSKt
+DnbkKvbdZxcimcMS
+DoCjjvbdANHySvyx
+DoDLKvbdZQmFJMdq
+DoCkKvbdHDjujBij
+EPDLKvbdsPuoJbuf
+EPCjjvbdYpmEhmFR
+DncLKvbdZjTHpGaf
+EPDKjvbdEuyQQNKF
+DoCkKvbdmbKWxPNu
+DoCkKvbdRjyFtfjs
+DoCkKvbdiifHjNYS
+EPDKjvbdpyOhGpdY
+DoDKjvbdUVlPitBR
+DoCjjvbdEKIJuwjA
+EPCjjvbdFkFTDHmV
+EOcLKvbdySnJNSCH
+DncLKvbdRpUHJedX
+EPDKjvbdtvOYJpsA
+DoDKjvbdKDKDQjCx
+DoDLKvbdaMkCTUmH
+EOcKjvbdMpYRVnGs
+EOcKjvbdtSqsYzFD
+DncLKvbdKaKgNCXq
+DoCkKvbdsCFllGkZ
+EObkKvbdNrsvGeUp
+DoDKjvbdmaivxOnV
+EOcLKvbdOEctIhjd
+DoCkKvbdemGXGljL
+DoDLKvbdjvWmdBxX
+EPCkKvbdCIjbLIej
+EPCjjvbdkHfkfFmk
+DoDLKvbdwzIGFwdr
+EOcKjvbddBrlrAUN
+EPCkKvbdJutecdgJ
+DoCjjvbdWRmwaeLc
+DnbkKvbdiVZdwRuC
+DnbjjvbdGLEsDHmV
+EPCkKvbdxsOJNSCH
+EPCjjvbdIwtBgkqQ
+DncKjvbdbrbjtDjB
+EPCkKvbdjhGkeemk
+DncKjvbdWWiXvDeH
+EPCjjvbdnUtzKiqf
+DncKjvbdTukoitAq
+DncLKvbdCIkBjhfK
+DoCkKvbdhgKDZWJu
+EPDKjvbdBhkBjiFj
+DnbjjvbdMfbpNPtk
+DoDKjvbdnBjWxPOV
+DoCjjvbdEJhKWYKA
+EOcKjvbdTpqOtuHm
+DoCjjvbdwzIFfXdr
+EOcKjvbdrpVoKDVf
+EOcLKvbdEYYLtTsl
+DoCkKvbdLFfICBQu
+EOcKjvbdeXzTsrFz
+EOcLKvbdSQUHKFdX
+EOcLKvbdraemMHLZ
+EPDKjvbdkIGlFemk
+DncKjvbdOYOuzcnU
+DoCkKvbdIwtCILpp
+DncLKvbdZoNiEdzK
+DoDKjvbdsrqsZZeD
+EPDLKvbdzGyMANEw
+DncLKvbdBraCsewS
+EObkKvbdpyOgfpcx
+DnbjjvbdxmrgxTIc
+EOcLKvbdZjSgpHCG
+EPCjjvbdrWpMDIxq
+DncKjvbdZtJIyESn
+EPCjjvbdJSxaSmXl
+DoCjjvbdiMFEOVCy
+DoCjjvbdDwwlTstM
+DncLKvbdJYUCHkpp
+EPDLKvbdsrrSxzFD
+EObjjvbdkHgMFfNk
+EPDKjvbdOStVgFUp
+DnbjjvbdjhHMGGOL
+DnbjjvbdZyEJmcLr
+EPDKjvbdDihKWYKA
+DncLKvbdRosfiecw
+DoCjjvbdyTNhmSCH
+DnbkKvbdFeirNhsq
+DoDKjvbdrDeIpNvB
+EObkKvbdVAaqTRSZ
+EPDLKvbdLAkGlbXq
+EOcKjvbdVAaprqRy
+EPDLKvbdfIKvRnQg
+EPCjjvbdUQpoVUgm
+EObjjvbdxVNEpyMO
+EOcKjvbdsCFllGkZ
+DncKjvbdsBelkgLZ
+DoDLKvbdvlvANDeN
+DoCjjvbdnBivwoNu
+EObjjvbdsCGMkgLZ
+EObjjvbdsPvPJbvG
+EPDLKvbdxrnImRbH
+EPDLKvbdNPxRVnHT
+DoDLKvbdMtrqkNAX
+DoDKjvbdiGicZWJu
+EPDKjvbdOFEUJJLE
+EPDLKvbdoAKzshDn
+DoDKjvbdehKvRnQg
+EObjjvbdLLBIWAKZ
+EPDKjvbdeOdsLUUS
+DncKjvbdjvWmdBxX
+DncLKvbdezuyFJTw
+EPCkKvbdNPwpumgT
+EPCjjvbdkxsRrxgU
+EPDLKvbdptUHSSLU
+EPDKjvbdeATqNXif
+EPCkKvbdjlakzEgP
+EObjjvbdyXiKCPzL
+DoCjjvbdhlFDmuDZ
+DncKjvbdauCGxLUI
+EObjjvbdySmiNSBg
+EOcLKvbdfNGWfljL
+DncLKvbdVviYWDdg
+EPCkKvbdkIHLefOL
+EPDLKvbdRNYCZNtz
+DoDLKvbdmfdxNOGy
+DoDLKvbdcScKtDjB
+EOcLKvbdEPDLKvcE
+EPCjjvbdUaBprqSZ
+EObkKvbdddnqbXDK
+EPCkKvbdaaVeGQQX
+DoDLKvbduoTzqKnt
+DnbjjvbdqwPkbhxq
+EObkKvbduaEZTOdh
+EOcLKvbdKfFhBaRV
+EOcKjvbdVYgtZjoO
+EOcLKvbdrSVKnKaN
+DnbkKvbdsCFmMGjy
+DnbkKvbdSLYeuGkT
+DoCkKvbdwWlAvAuu
+EPCjjvbdRXOEClID
+EPCkKvbdCIkCKiFj
+EOcKjvbdGckViajK
+DoCkKvbdznpRFCkx
+DnbjjvbdxKwDgzyf
+DncKjvbdVAaprprZ
+DoDKjvbdOEctIhjd
+EObjjvbdmIdTptqa
+DnbjjvbdvwMAuaWV
+EObkKvbdEYXksssl
+EPCkKvbdiZtelQnG
+EOcKjvbdqdEhpOVa
+DnbjjvbdidjfuPAO
+DnbkKvbdnBivxPNu
+EObkKvbdrSVKmkBN
+DnbkKvbdiCPDFWqR
+DncKjvbdZisHofaf
+DoCjjvbdJvVFcdfi
+DoDLKvbdcyxpYYpb
+DoCjjvbdrykpTBHn
+EPDLKvbdqrUkOKaN
+DoCkKvbdGQATWgFy
+DncKjvbduaDxsPFI
+EPCkKvbdYkqdTnLm
+EObjjvbdQYmAGsRj
+DnbkKvbdZyEKOCkr
+DnbkKvbdOEdThhjd
+EPDKjvbdiCOcFWpq
+EOcKjvbdMfcQNPtk
+EPDLKvbdLGFhBaRV
+EPDLKvbdssSSyZeD
+EPCkKvbdTAFJIBoE
+EObkKvbdeFPRavbj
+DnbkKvbdjKFhKNYS
+DncLKvbdCJLBjiGK
+DncLKvbdqlzJyLhJ
+EOcLKvbdRyigsCvA
+DoDKjvbdYqMdhldq
+DnbjjvbdehKvSOQg
+EObjjvbdMgColouL
+DoCkKvbdehKuqnRH
+DoDKjvbdQvmdCkhD
+DoDKjvbdMSWlzVQz
+EObkKvbdbhlikGXY
+DoCjjvbdeAUQmYJf
+EPCjjvbdZyEJmcMS
+DoDKjvbdIGfzYxYH
+DoDLKvbdHDjvJbJj
+EOcKjvbdQwNdCkgc
+EPCkKvbdRWnDcMHc
+DnbjjvbdrMzJyMIJ
+DncKjvbdlhctQuSB
+DoDKjvbdbPgGdLzd
+EObkKvbdijFhJmXr
+DoCjjvbdbQGgDkzd
+EPDLKvbdDihJvXjA
+EObjjvbdaNKasUmH
+DncKjvbdZyEKOClS
+DnbjjvbdSLYfVHLT
+DoDLKvbdwzHfFweS
+EPCjjvbdfNFwHNJk
+DoDLKvbdelewHNJk
+EPCjjvbduaDxroEh
+DoDKjvbddwytURez
+DncKjvbdwtmEpyLn
+EOcLKvbdCIkBkIej
+EOcLKvbdiLddOUcZ
+EPDKjvbdiUydwSVC
+DncKjvbdrEEiQOVa
+DnbkKvbdYzbeqivZ
+DoCjjvbdkVwOECYX
+DoDLKvbdZLqcsmkm
+EObjjvbdVYgtZkPO
+EOcLKvbdHffyxwwg
+EPDKjvbdcIljLGWx
+DnbkKvbdMpXpvNfs
+EOcLKvbdFeirOJTq
+DncLKvbdWWhxWEFH
+DoCjjvbdZRMdhmEq
+DnbkKvbdULvPBWPJ
+EPDLKvbdZRMdiMdq
+DnbjjvbdTYLMNzkY
+DoCkKvbdZxcjNblS
+DoCkKvbdKCibpicY
+EPDLKvbddoFTKtUS
+DncLKvbdcImKLGXY
+EOcKjvbdKaLGmBwq
+EPCkKvbdnHFYMnGy
+EPDKjvbdUQqPUuIN
+EPDKjvbdeAURNYJf
+DoCkKvbdxwiKCQZk
+DnbkKvbdKVuGDeGi
+EPDKjvbdrovOicVf
+DoDLKvbdrylQSaHn
+EOcLKvbdySmhlrBg
+EOcLKvbdNrsufeVQ
+EOcKjvbdzoQREblY
+EPCkKvbdzaAOgHCM
+DoCjjvbdZLqdTmkm
+EObkKvbdNGbpNQUk
+EOcKjvbdZshiYdSn
+EPDLKvbdDncLKvbd
+EOcKjvbdqlzJyMHi
+DoCkKvbdBhkCKiFj
+EOcLKvbdRaceLhyL
+EPDLKvbdxsNiNRbH
+DoDKjvbdtcCtwWOo
+DnbjjvbdmfdwlnGy
+DncKjvbdREDBQQdS
+DncLKvbdnPzYvKxb
+EPCjjvbdjgfkefNk
+DnbkKvbdnUtykJrG
+EPDKjvbdSCEFLiYk
+EOcLKvbdGcjuiajK
+EPCjjvbdJYUCHlRQ
+EPDLKvbdYpleIldq
+EObkKvbdfMfWflik
+DncLKvbdwuMdpyLn
+DoDLKvbdEPDLLWcE
+DoDLKvbdZLrDtOLm
+DoCkKvbddZxoxYqC
+DncLKvbdTulQKUAq
+DncKjvbdqrUjnKaN
+DoCkKvbdGFjRmiTq
+EPCjjvbdpssfrRkU
+EPDKjvbdrXQLbiYq
+DoCkKvbdNQYQunHT
+DoCkKvbdNrtWHEuQ
+DncLKvbdjgflGGNk
+DncKjvbdBsBCsewS
+DoCkKvbdMpYRVmfs
+DnbkKvbdKfFhBaQu
+EObkKvbdGcjuiaij
+EObkKvbdakMGOnDA
+DnbkKvbdFyUuAcxC
+DnbkKvbdtSrTZZdc
+EPCjjvbdatafxLTh
+EPCkKvbdUGzmlXVe
+EObkKvbdZyDinClS
+DncKjvbdyzdnSIJI
+DnbkKvbdnPyxukZC
+DoDKjvbdkDMLQgVH
+EObjjvbdbVBfwjtI
+EPDLKvbdzRPMhiwA
+EObkKvbdhkeDmuCy
+DnbkKvbdZQleImEq
+EObjjvbdrDeJPnVa
+EPDLKvbdaNLBsVMg
+DnbkKvbdOEctIhjd
+EOcKjvbdatagXkUI
+DncKjvbdMowpunGs
+EObkKvbdtvNwiqTA
+DnbjjvbdyzdnSHiI
+EObkKvbdbhlikFvx
+EOcKjvbdaNKaruNH
+DnbkKvbdiVZdvqtb
+EObkKvbdVYgszKoO
+DoCkKvbdjJfIKMwr
+DncLKvbdezvZFJTw
+EObkKvbdcyxoxYqC
+EPDLKvbdFejSNiTq
+DncKjvbdIwsbIMQp
+DnbjjvbdTukpJsaR
+EPDLKvbdIsZArlxM
+EPDKjvbdTAEhgand
+EOcLKvbdfNGXHMik
+DoDKjvbdjcMLQgUg
+DncKjvbdSLYfVHKs
+DoCjjvbdnBjWwoOV
+EPCjjvbdnBjWwnnV
+EObkKvbdQvmccLgc
+EPDKjvbdwuMeRYlO
+DoDKjvbdNddUJIjd
+DoCkKvbdqUTgSRkU
+DoDLKvbdehLVqmpg
+DoDLKvbdrovOjCvG
+EObjjvbdzoPpdcMY
+EPDLKvbdZRNFIleR
+DnbkKvbdSLZGVGjs
+DoCkKvbdySmiMrBg
+DnbkKvbdwyhFfXeS
+DoDLKvbdWHwvYHYz
+DoCjjvbdIHHZyYYH
+EObjjvbdJSyArmXl
+DncKjvbdACqxJyiQ
+DncLKvbdmpZxujyC
+DoCjjvbdFkFScINV
+EPDLKvbdCDpAujNG
+DnbkKvbdhkeDnUby
+DncLKvbdFWYopNJe
+DoCjjvbdLAjfmCYR
+EPCjjvbdxrmiMrCH
+EObjjvbdcImJkGWx
+DoCjjvbdFejRnJTq
+EObkKvbdYTMAlsnx
+EPCjjvbdsPvOibuf
+EObjjvbdNeDshhjd
+EOcLKvbdBiKbLIej
+EObkKvbdauCGxLTh
+EPDKjvbdbBWEepQX
+EPCkKvbdVrNxBdlD
+EObjjvbdMIalRYAS
+EOcKjvbdJcKCpjCx
+EOcLKvbdLqwNZtpz
+DoCkKvbdZisHogBf
+DnbjjvbdEPDKjvbd
+DoDLKvbdFWZQQNJe
+EObkKvbdHgGzYwxH
+EOcKjvbdjbkkQfuH
+DnbjjvbdtkxXAtBX
+EPDLKvbdLAkHNCXq
+EOcLKvbdWWhxVdFH
+DncLKvbdCWzdIeQW
+DoDLKvbdVvhwvDdg
+EObjjvbdpfDeUWAh
+EOcLKvbdqmZixkhJ
+DncKjvbdyzdmrIJI
+DncLKvbdRpTgJecw
+DoDLKvbdGFjSOIsq
+EOcKjvbdwuNFQyLn
+DnbjjvbdIsZAsMwl
+DncKjvbdptTgRqkU
+DncKjvbdZQmEiNEq
+DnbkKvbdauCHYLTh
+EPDLKvbdyzdmrHhh
+EPCjjvbdZoOJFEyj
+EOcLKvbdUQqOttgm
+DoCjjvbdRNYCZNtz
+EPDKjvbdrRtkOLBN
+DncLKvbdmajWxOmu
+EPDLKvbdLBLHMbXq
+DoDLKvbdCIjajhfK
+EObjjvbdYkrDtOMN
+EOcLKvbdUtNUGMVj
+EObjjvbdaSFcHsek
+DnbkKvbdXrkaMtPY
+DoCkKvbdZQmFImFR
+EOcLKvbdcJMijewY
+EPDLKvbdGLErbhNV
+DnbkKvbdiUydwSVC
+EPDLKvbddndsKssr
+DoDLKvbdxwhjCPzL
+DoCkKvbdxVMeQxkn
+DncKjvbdiBoCdwRR
+EPDLKvbdnPyyVkZC
+EPCjjvbdmuUzLKRf
+DoDLKvbdSQUGiecw
+DoDKjvbdRbDdlJZL
+DncKjvbdqrVKnLAm
+DoDKjvbdVBCQsQrZ
+DoDKjvbdmbKWxPNu
+EObjjvbdFVyQPmKF
+DnbjjvbdiiehJlxS
+EOcKjvbdIrxaSmYM
+EOcKjvbdsZkosAgn
+EOcLKvbdnCKWxPOV
+EPDLKvbdKWUecdfi
+DncLKvbdhgKDZWKV
+EPDLKvbdySnImSCH
+EObkKvbdJKEAKQGd
+EOcLKvbdZMSETmkm
+DoCjjvbdhgJcYujV
+EOcLKvbdehLVqmpg
+DoCkKvbdezuyFItX
+DncLKvbdvBDxsOeI
+EObkKvbdTulPisaR
+DnbkKvbdajkfPODA
+DoDKjvbdYkrEUOLm
+EPCkKvbdfIKvSNpg
+EPCkKvbdiBncEwQq
+EOcKjvbdKWUecdgJ
+EObkKvbdYlRcsmkm
+EPCjjvbddwzUTqez
+DnbjjvbdeYZstRez
+EPDLKvbdxVNEqZLn
+DncLKvbdFjeScINV
+EObjjvbdxUleQxkn
+DncKjvbdKWUfDdfi
+DoDLKvbdssRrxzEc
+EObjjvbdRpUGiedX
+EOcLKvbdZQleJMdq
+DnbkKvbdqdFIpNua
+EPCjjvbdYzberKWZ
+DoDKjvbdxxIjBoyk
+EOcLKvbdEObkKwDE
+DoDLKvbdqquLNjaN
+DncKjvbdwuNFRZLn
+DoCjjvbdqUTgRrKt
+EObkKvbdVwIwvDeH
+DnbkKvbdVwJYWEEg
+DnbjjvbdYlSETnMN
+DnbkKvbdqTsgRqjt
+DoDKjvbdiGicZVjV
+DnbjjvbdxnTHxTJD
+EObkKvbdqUTfrSKt
+DoCkKvbdFyVVBEXb
+EOcKjvbdqGDdsvAh
+EPCkKvbdTkunaVni
+EObkKvbdMRvlzVQz
+EPDKjvbdDncKkWbd
+EObjjvbdqqtkNkBN
+DncLKvbdfHkWRnRH
+DnbjjvbdiLdcnUby
+EOcKjvbdVYgsyjnn
+EPCjjvbdUtNTfMWK
+EPDKjvbdqYoHgREY
+DncKjvbdGZUuAdYC
+DnbjjvbdDnbjjwDE
+EOcKjvbdTqQntthN
+EOcLKvbdUyITzLPO
+EOcLKvbdjblLRHVH
+DoCkKvbdLGFhCBQu
+DncLKvbdliEUQuSB
+EObkKvbdRacdkiZL
+EOcLKvbdaSFcHtFk
+DoDKjvbdJYTahLpp
+EPDLKvbdUQqOuVIN
+EPCjjvbdqmZjYkhJ
+DoCkKvbdRjyGUgKs
+EObjjvbdyNrhYSiD
+EPCkKvbdBhkCKiFj
+EObjjvbdYlSDtOLm
+DoCjjvbdTAFIhBoE
+DncKjvbdNdctJIjd
+DoDLKvbdGdKvJaij
+EObjjvbdJpydnfNe
+EPDLKvbdCDpAvKNG
+DoDLKvbdeEoRavbj
+DoCkKvbddoFSjssr
+EPCjjvbdqYoHfqEY
+EPCkKvbdFkFScHmV
+EObjjvbdcyyQYZRC
+DoDKjvbdyzdmrHhh
+DoDKjvbdUWLojUAq
+EObkKvbdiCPCdwRR
+DoCkKvbdCTBDTevr
+EOcKjvbdLAkGlbXq
+EPDKjvbdcyyQXyRC
+EPDLKvbdyNsHxSiD
+EPDKjvbdqUTgRrKt
+DoDKjvbdJuuFdEfi
+DoDLKvbdEXwktTtM
+EObkKvbdeJirVtzn
+EObjjvbdYTMBMsnx
+DnbkKvbdNQXpumfs
+EPDLKvbdzitopDrt
+DncLKvbdDxXlUUUM
+EOcKjvbdADSXiyhp
+DoCjjvbdqTsgSSKt
+DoCkKvbdZtIhxdTO
+EOcKjvbdUyHtZjnn
+EPDLKvbdcSbkTdKB
+DncLKvbdxZgfGYEr
+DncKjvbdeATplxJf
+DoDLKvbdnCJwXnmu
+DnbkKvbdbKlFnnDA
+DoCkKvbdrDeIpNua
+EPCjjvbdmttzKirG
+DoDKjvbdbrbkUDjB
+DnbkKvbddZxoxZRC
+EObkKvbdhgKDZWKV
+DnbjjvbdGFiqmhtR
+EPDKjvbdULvOaWPJ
+EOcLKvbdygYlANFX
+DnbjjvbdIHGzZYYH
+EOcKjvbdhkeENuCy
+EOcLKvbdNddTiJLE
+EObjjvbdGFiqnJUR
+EOcLKvbdjvWnEBxX
+EPCjjvbdVBCRTRSZ
+DncKjvbdVBCRTRSZ
+EObkKvbdBdQAvJlf
+EObkKvbdJYUCHkpp
+EOcKjvbdGckVjCJj
+EObkKvbdBsAcUGWr
+DoDLKvbdIxUBhMQp
+DoDKjvbdMgDQNPtk
+EOcLKvbdHEKujCKK
+DoCjjvbdLhalQxAS
+EObkKvbdULuoBVoJ
+EPDKjvbdhfjDZVjV
+DoCkKvbdKDJbqJbx
+DoCkKvbdbKlGPNcA
+DncKjvbdrpVnicWG
+EPDKjvbdvAdZSneI
+DnbkKvbdFyVUaEYC
+EOcKjvbdHDjuibJj
+DnbjjvbdbiMjLFvx
+EPCjjvbdUsltGLvK
+DoCjjvbdkNBkzEgP
+DncLKvbdFxtuBEYC
+EOcKjvbdnBjWxPNu
+DnbkKvbdqUTfrRjt
+EPCjjvbdZHXEAPSi
+DoCjjvbdxxJJapZk
+DncKjvbdZyDimcLr
+DnbjjvbdiBnbeWpq
+EObjjvbdjbkkQftg
+EObjjvbdqvokbhyR
+EOcLKvbdeYZtTrFz
+EPCkKvbdLqvmZtpz
+DoDKjvbdNeDsiIjd
+EPCkKvbdeXystRez
+EOcKjvbdAMhZSvzY
+EPCjjvbdSwkMNzkY
+DoDKjvbdtlYXAtBX
+EPCjjvbdBvzdIdov
+DoDLKvbdVBBqSqRy
+EOcLKvbdTvMQKUAq
+EOcLKvbdxVMeQyMO
+EPDLKvbdBsAbtGWr
+DoCkKvbdKefHaaRV
+DncLKvbdCTBDTewS
+EPCjjvbdTIyjRAAl
+DoDKjvbdkxsSSxft
+EObjjvbdjvXOECXw
+EPDKjvbdVTlsfLvK
+EOcKjvbdjJfHjNXr
+EObjjvbdfMfWflik
+DnbkKvbdYqNFImEq
+DoDLKvbdcJMikFvx
+DoCkKvbdrXPlDIyR
+EObjjvbdeOdsLTtS
+DncLKvbdJSyArmXl
+EObjjvbdkNBlZeHP
+EObkKvbdfHkVqnRH
+DncLKvbdKCjCqKDY
+DoDLKvbdUyHsykOn
+DncKjvbdWWiYWEEg
+EPCkKvbdKWVFdEfi
+EObkKvbdFpATWgFy
+EOcKjvbdrzLpTAgn
+EPCjjvbdhuZeWrVC
+EPCkKvbdraellGjy
+DncLKvbdGKeTCgmV
+DoDLKvbdCEQAvJlf
+DoDLKvbdJvUfEFGi
+EOcKjvbdHDkVjCJj
+EPCjjvbdZxdJnClS
+DoCjjvbdcImJjewY
+DoDLKvbdkDMLRHUg
+DoDLKvbdqZOggREY
+DoCkKvbdkMakyeHP
+DoCkKvbdEvYpPmJe
+DncLKvbdJJdAJpHE
+DoDKjvbdEPCjkXCd
+DnbjjvbdlAmOmALA
+DoDLKvbdsBfNLgLZ
+DncLKvbdKyQjSzuG
+EPDLKvbdeAURMxJf
+EPCjjvbdkHflGGOL
+EOcKjvbdEuxpPlie
+DncKjvbdcyyPxYqC
+DoCkKvbdRDbaPqES
+DncLKvbdaaVeFpQX
+EOcLKvbdMuTSLNAX
+EPCkKvbdbiMjKfWx
+EOcKjvbdSCEEkiZL
+DncKjvbdbhmJkGWx
+DncKjvbdWXJYVcdg
+EOcLKvbdvBDxrndh
+DoCkKvbdCEQBVjNG
+EPDLKvbdxUmFQyMO
+DnbkKvbdznpRFCkx
+DoCjjvbdKDJbpjDY
+EOcLKvbdREDBQRDr
+DoDLKvbdZtIhyETO
+EObjjvbdKfGHbBQu
+DnbjjvbdnUtzKirG
+EPDLKvbdyNsHwsIc
+DoCjjvbdIrxaSlxM
+DoCkKvbdRjyFuHLT
+EPCkKvbdJvUfDdgJ
+DnbkKvbdgQBzvcwh
+DnbkKvbdpyOgfqEY
+DnbkKvbdmRxuZsEJ
+EObkKvbdmRyUysDi
+DnbjjvbdrzMPraIO
+EPDLKvbdDxXksssl
+EPDLKvbdqUUGrSKt
+EPCjjvbdZisIPfbG
+EPDLKvbdiGicZVjV
+DnbjjvbdqcdiPnVa
+DoDLKvbdGKdsCglu
+EPCkKvbdYSlBNUOx
+DoCkKvbdjmBkyeHP
+EObjjvbdKDJcRKDY
+EPDKjvbdiLdcmuCy
+DoCjjvbdbAvEfQQX
+EPDKjvbdegjvRmqH
+EOcLKvbdrounibvG
+DoCkKvbdliEUQtrB
+DoCkKvbdrXPlChyR
+DnbkKvbdcyxoxZRC
+DoCkKvbdWIYWYHYz
+DnbkKvbdmJETptrB
+EObjjvbdbBVeGPpX
+DoCkKvbdypnliKXA
+EOcLKvbdatagXkTh
+EPDKjvbdrounjDWG
+EPDKjvbdUyHsyjnn
+EPDKjvbddZxoxZRC
+DnbjjvbdKCjCpjDY
+DoCjjvbdKkBHvAJy
+DnbjjvbdjbkkRGuH
+DoCjjvbdrafNMGjy
+DncKjvbdxnTHwsJD
+DncKjvbdemFvfmJk
+DnbjjvbdIwsbILqQ
+EObjjvbdUMWPAvOi
+EOcLKvbdGKdsChMu
+DoCjjvbdWXIxWEEg
+DoCjjvbdvPTzqKnt
+DoDKjvbdILazmwRL
+EPCkKvbdjlakzFHP
+EPDLKvbdKDJbqKCx
+EOcLKvbdHELWKBjK
+DoCkKvbdOFDshhkE
+EPDKjvbdBhkCKhej
+DoDKjvbdNddTiJKd
+EPCkKvbdVqmwadkc
+EPCkKvbdFfKSOItR
+EPCjjvbdZshiYcrn
+DncLKvbdvAcxsOeI
+EObkKvbdKVtfEFHJ
+DncLKvbdXsMBNUPY
+DoDLKvbdCTAbtGXS
+DoDKjvbdRyjHsDWA
+DoCjjvbdJcKDRJcY
+EOcKjvbdEuxpPljF
+DncLKvbduWNxKQsA
+EOcLKvbdhuZeXSUb
+EObjjvbdjvWnDaxX
+EObjjvbdwWlAvAuu
+EObkKvbdqquKnLBN
+DoDLKvbddCSmSATm
+DoCjjvbdwtmEpxlO
+DnbjjvbdDoCkLWcE
+DncLKvbdwyhGFxEr
+EOcKjvbdrykosAgn
+DnbjjvbdNeEUJJLE
+DoDKjvbdjuwNdCYX
+EPDKjvbdiGibyVjV
+DnbjjvbdYqNEhmEq
+EPDLKvbdxVNEpyLn
+DoCjjvbdZeYGzgiC
+DoCjjvbdZjTIQGbG
+DnbkKvbdSPsfjGEX
+EObjjvbdBsBDUGXS
+DoCkKvbdsBfNMGkZ
+EOcLKvbdLBLGmCXq
+EPDKjvbdJTZBTNYM
+DnbjjvbdJTZBSmYM
+DoDLKvbdjKFgjNYS
+DoDKjvbdqlzKYkhJ
+EPCkKvbdkWXOECYX
+EObkKvbdFkEsDINV
+EObjjvbddndsKstS
+DoCjjvbdauBfwjsh
+DnbjjvbdFjeTCglu
+EOcLKvbdfMfWflik
+EObjjvbdlYsRryGt
+EPCjjvbdtbcVWuoP
+DnbjjvbdMgDPmQVL
+DoDLKvbdjhHLefNk
+EOcLKvbdUsmTfMWK
+DoCkKvbdptTfqqjt
+EObkKvbdrRuKmjaN
+EPCjjvbdzoQQdcMY
+DoDKjvbdrpVoKDVf
+DoCkKvbdlZSrTYft
+DoCjjvbdBhjajiFj
+EOcLKvbdzoQQdbkx
+EObkKvbdOhAYZAYa
+EOcKjvbdjvXNdBww
+DnbjjvbdEXwlTtTl
+DoCkKvbdzjVPocsU
+DoDLKvbdZQldiMeR
+DncKjvbdYNqAYVVt
+DnbjjvbdtvNxKRTA
+EPCjjvbdqceIonWB
+EOcKjvbdyXiKCPzL
+DoCkKvbdfIKurNpg
+DoDKjvbdFxuVAdYC
+EOcLKvbdeOdrjssr
+DncLKvbdxnShYTIc
+EPDLKvbdoznEKwoA
+DoDLKvbdptTfrRkU
+DncLKvbdkWWnDaxX
+EPCjjvbdKWVGDeHJ
+EPCjjvbdtumwipsA
+DoCkKvbdZxcinDMS
+EObjjvbdCWzdIeQW
+EPDKjvbdHgGzYwwg
+EOcKjvbduDCtvvOo
+DnbjjvbdqvokbiZR
+DnbjjvbdmIcsptqa
+DncLKvbdrJAJdmPF
+EPCkKvbdKjaHvAJy
+DoCkKvbdhuZdwSUb
+EOcKjvbdnPzZVjyC
+DoDKjvbdYSlAmUPY
+EOcKjvbdffLzNgHA
+DncLKvbdptUHRqjt
+EPCjjvbdyTNiMqag
+DoCjjvbdauBgXkTh
+EPCjjvbdbiMikGXY
+EOcLKvbdIHGzZXwg
+DncKjvbdrXPkcIxq
+DnbjjvbdOTTugEuQ
+DnbkKvbdjcMKqHUg
+DoDKjvbdffMZnHHA
+DoCjjvbddijSWUzn
+DncKjvbdBhkCKiGK
+DncKjvbdJYTbHkqQ
+DnbkKvbdqwPlCiZR
+DoCkKvbdxUmFRYkn
+DoDKjvbdmSZUzTDi
+EPDLKvbdkyTSSxft
+DoCjjvbdmajXYPOV
+EPCkKvbdMowqVnHT
+DncLKvbdTppoUuHm
+EPDLKvbdgFkymfgA
+EObjjvbdhgJcYujV
+DncKjvbdtAGqIABS
+DoDLKvbdqZOhGpdY
+EObkKvbdjbkkRGuH
+DoCjjvbdGLEsChNV
+DnbjjvbdZoOIeEyj
+DncLKvbdbrbjsdJa
+EPCjjvbdGGJqmiTq
+EPCkKvbdNPxRWNgT
+EPCjjvbdJpydnfOF
+EOcKjvbdcyxoxYpb
+EPDKjvbdmozZWLYb
+EObjjvbdVTmUFlVj
+DoCjjvbdNrtWGduQ
+DncKjvbdqUTfqqkU
+DoDKjvbdTfznMWue
+EOcLKvbdNsTugEuQ
+DoDLKvbdjhHLfGOL
+EObjjvbdZtJJYdSn
+DoDKjvbdZjTHofbG
+DncKjvbduCbtwVno
+EPCkKvbdZtIhxcsO
+EOcLKvbdnUuZkJqf
+EObkKvbdiCPCeXQq
+EOcKjvbdZtJIxcsO
+EOcLKvbdZRNEhmFR
+DnbkKvbdFjdsDINV
+DncKjvbdsZlQSaIO
+EObjjvbduLxXAtAw
+DncKjvbddoFSjtTr
+DoCkKvbdmbKXXoOV
+DoDKjvbdOAIsTirA
+DncLKvbdMfcQMpVL
+EPDKjvbdsrqrxzFD
+EOcLKvbdZRMdiMdq
+EObkKvbdCTAbsfXS
+EPDLKvbdtunYJpsA
+EObkKvbdYSkaNToY
+DoCkKvbdZMRdUOMN
+EPCkKvbdIsYaSmYM
+DncLKvbdVYgtZkPO
+EObjjvbdaNLBsUmH
+EOcLKvbdZyEKOCkr
+DoDLKvbdOSsufdtp
+DoDKjvbdhbPCdvqR
+DnbkKvbdiZuFkpnG
+DoDKjvbdHDjujCJj
+EPDKjvbdCDpBVjMf
+EObkKvbdeFOrBwDK
+DoDLKvbdhgJbxvJu
+EObjjvbdiZuFlQmf
+EPDKjvbdeuzwpJzs
+EPDKjvbdezuyEhsw
+EPCkKvbdJYTbIMQp
+DnbkKvbdkIHLeenL
+DoCkKvbdAMgyTXZx
+DnbkKvbdfIKvRnQg
+EPDLKvbdJqZePFnF
+DoCjjvbdRjxfVGkT
+EOcLKvbdySmhlqbH
+DnbjjvbdEYYMUTtM
+DoDLKvbdhtydvquC
+EObjjvbdZRMdiMdq
+EPCjjvbdVZITzLOn
+DoCkKvbdmuVZjjRf
+DoCjjvbdzoQREbkx
+DnbkKvbdkyTSSxgU
+DoCjjvbdzRPNIjXA
+EPDKjvbdnPyxvLZC
+EOcKjvbdSZjHrbvA
+EPCkKvbdShyjRABM
+EObjjvbdYpmEiMeR
+DoCjjvbdFaOqYizm
+DncLKvbdEvZQQMjF
+DncKjvbdNrtWGeVQ
+DoDKjvbdqdFJPmvB
+DnbjjvbdRXODblID
+DoDLKvbdyzdnRhIh
+EPCkKvbdcTCjsdKB
+DncLKvbdJcKCqKCx
+EObjjvbdmfdwmNgZ
+EPDLKvbdqUTgSSLU
+EObjjvbdZyEKODLr
+EPDKjvbdTppoVVIN
+DnbjjvbdFVyPpNJe
+EPDKjvbdJYUBhLqQ
+EPDLKvbdqceIpOWB
+EPDLKvbdiBnbeXQq
+DnbkKvbdGZVVBEYC
+DncKjvbdGLFTDINV
+EObjjvbdUGzmlXWF
+EOcLKvbdxrmiMqbH
+DoDLKvbdJpzEnenF
+EObjjvbdEvYoomJe
+DoDKjvbdJqZdoFme
+EObjjvbdEuyPpMie
+EOcKjvbdmtuZjjRf
+EPDKjvbdjKGHilwr
+EPCkKvbdpaIeAWgd
+DoDKjvbdGZVUaDxC
+DoCjjvbdFkErcHlu
+EOcKjvbdrbFllGjy
+DnbkKvbdMRwMzUpz
+DoCkKvbdDxYLtTsl
+EOcLKvbdLBKfmBxR
+DoCjjvbdVwJYWDeH
+DoCkKvbdZoOIdeZj
+EPDLKvbdpfEFUWAh
+EOcLKvbdKWVGDdfi
+EObkKvbdtvNwipsA
+DoCjjvbdwuNEqZMO
+EObkKvbdfSBWzkbo
+EPDLKvbdFxuVAdXb
+DnbkKvbdRWnEClHc
+EOcKjvbdkCkjqHUg
+DoCjjvbdbsDKscia
+EPDLKvbdzQoMiKXA
+DnbkKvbdRDcApQcr
+DoDKjvbdZtIiYcrn
+DoDLKvbdqZPHgQdY
+EObjjvbdyfxlAMeX
+EObjjvbddjJrWUzn
+EPDKjvbdjcMLQgVH
+EOcLKvbdozmckXoA
+EPDKjvbdcJMjLGWx
+EPCkKvbdbhlijewY
+EObjjvbdrEFJPnWB
+EOcKjvbdmuVZjirG
+DncKjvbdnBjXYOmu
+DncLKvbdjcLjqHUg
+EPDLKvbdlhdUQuRa
+DoDKjvbdVwIwvEFH
+EObkKvbdZMSDsnLm
+DoDLKvbdzHZMAMdw
+EOcKjvbdZMSDsnLm
+DncKjvbdZshhyDsO
+DncKjvbdCEPaWJlf
+EOcKjvbdxxJKCQZk
+EPCkKvbdezvZEiTw
+EPDLKvbdypoMiKXA
+EPCkKvbdnUuZjjRf
+DnbkKvbdFfJqnJUR
+DoCjjvbdTpqPUthN
+DncKjvbdcyxoxYpb
+EObkKvbdCSaCsfXS
+DnbkKvbdRacdlIyL
+DoCjjvbdTIzKRABM
+EPCkKvbdatbGwjsh
+EObjjvbdUsltGMWK
+DoDLKvbdtvOXjQsA
+DnbjjvbdYSlAmUPY
+EOcKjvbdwuNEpxkn
+EObkKvbdYqMdiMdq
+EOcKjvbdnGeXlmgZ
+DnbkKvbdqwQLcJYq
+EObkKvbduVmxJqTA
+EObjjvbdmoyyVkYb
+DoDKjvbdBdPaWKMf
+DncKjvbdVvhwvEFH
+EObkKvbdauBfxLUI
+EOcLKvbdMgDQNQUk
+EOcKjvbdsQVnjCuf
+EObkKvbdjuvnEBww
+DoCkKvbdkWXODbXw
+EPCkKvbdZyDjNblS
+DoDKjvbdZLqdUNlN
+DoDKjvbdbLMFoNcA
+DoCkKvbdFVyQPmJe
+EOcKjvbdhkdcmuCy
+EPCkKvbdmtuZjiqf
+DnbjjvbdRbEFLiYk
+EPCkKvbdySnJMqag
+EPDLKvbdhlFDnVCy
+DoCjjvbdzoQREblY
+EPCjjvbdvBEYroFI
+EPCjjvbdJbjCqJcY
+DnbkKvbdliEURUrB
+DoDKjvbdOTUWGdtp
+EOcLKvbdZnmhddzK
+EPDKjvbdSBcdkiZL
+DoCjjvbdZMRctOLm
+DoDLKvbduCcUwVno
+DoDLKvbdEzspeMDJ
+EPCjjvbdULunaWOi
+DoDLKvbdIwsaglQp
+EObkKvbdJuuFdFGi
+EPCkKvbdQccBQRDr
+EPDKjvbdNrsugEtp
+EPDLKvbdEXxLtUUM
+DoDKjvbdVBCQsRRy
+DncKjvbdeFPSCWcK
+DoDLKvbdhficYvJu
+DncKjvbdkClLRHVH
+EOcLKvbduWNxKRTA
+EObjjvbdNPwpumgT
+DoCjjvbdjmCLzFGo
+DncKjvbdZtIhxdSn
+EObkKvbdKQyePFme
+EPCjjvbdEuxpPljF
+DoCkKvbdZtIhyDrn
+EPDLKvbdJpzFOfNe
+EPDKjvbduaEZTPFI
+EPDLKvbdSQTgKFcw
+EOcLKvbdBcpAujMf
+EPCjjvbdfHkVrOQg
+EPCjjvbdKaKflaxR
+EObkKvbdZjTIQGaf
+EOcLKvbdijGIKMwr
+EPDLKvbdvBEZTOdh
+DnbkKvbdZRNEhleR
+DnbkKvbdijFgimXr
+EObjjvbdEASIlywX
+DoCjjvbdKaKgNCXq
+EPDLKvbdTppoUuHm
+EPCkKvbdwzHefYEr
+EPCkKvbdhtyeWrUb
+DnbkKvbdPyNAGsRj
+EPDKjvbdmttzKiqf
+DnbjjvbdRacdkhyL
+EOcLKvbdeJjRvUzn
+EObjjvbdNHCpNQVL
+EPCjjvbdgLGzcGAE
+DoCkKvbdidkGtoAO
+DnbkKvbdKDJcRKCx
+DnbjjvbdSQTgKGEX
+EPDLKvbdyqPMiJwA
+DnbkKvbdLrWlytpz
+DnbjjvbdmgExNNgZ
+EPCkKvbdlYsRrxgU
+DnbjjvbdTkuoAvPJ
+EOcKjvbdgFkymgHA
+EPDLKvbdmaivxOnV
+DnbjjvbdEztQeMDJ
+EObjjvbdWfYzUAPT
+DnbkKvbdiMEdNuDZ
+DoDKjvbdgQBzwEXh
+EOcLKvbdSBcdlIyL
+DnbjjvbdrMzJxkhJ
+DnbjjvbdddnrCXDK
+DncLKvbdmbKXXnnV
+DnbjjvbdYzbfSKWZ
+EPCjjvbdUMWPBVoJ
+EPDKjvbdBraDUGWr
+DoCkKvbdFkFTDINV
+DncKjvbdYkqdTmkm
+DncKjvbdmpZyVjyC
+DoCjjvbdZisIQHCG
+DncLKvbdYqMeJMeR
+EPDKjvbdZjTHpHBf
+EOcLKvbdcJMikFwY
+DoCkKvbdFpATXHGZ
+DnbjjvbdVBBqSpqy
+DoCkKvbddZyQXxpb
+EOcLKvbdqlyiyMHi
+EPDLKvbdfMfWgNJk
+DoCjjvbdrNZjZLgi
+EPCkKvbdeOdsKtTr
+EPDKjvbdLrXMytpz
+DncLKvbdQvnDcMHc
+DoDLKvbdyYJJbPyk
+DnbjjvbdrylPsBIO
+DnbkKvbdTqROuUgm
+DoCjjvbdcyyQYZRC
+EObjjvbdbLMFnmcA
+EObjjvbdbVCGxKsh
+EObjjvbdelfWgMjL
+EPDLKvbdnGdwmOGy
+EPCkKvbdcTDLTdKB
+DncLKvbdUxhTyjoO
+EPCjjvbdwzHfFxEr
+EPCjjvbdkxrqryHU
+DncLKvbdDihJvYKA
+EPCkKvbdRzJhScWA
+EObjjvbdZHWdAOri
+DoDLKvbdjbkkRGuH
+DncKjvbdNVSrLNAX
+DncKjvbdVqnYCElD
+DnbjjvbdFWZPpMjF
+DoCjjvbdZMRctNkm
+EPCjjvbdRNXaxmtz
+EOcLKvbdLZQjSztf
+EObjjvbdePFSjssr
+EOcKjvbdjbkkRHUg
+EPDKjvbdcSbjtEJa
+EObkKvbdKQzFPFme
+DoCkKvbdnUtzKjRf
+DncLKvbdeOeTKtUS
+DoCjjvbdpstGqqjt
+EOcKjvbdrpWPJcWG
+EPCkKvbdwkXDgzyf
+DncKjvbdnPyxvLYb
+DoCkKvbdpxoIHRDx
+DnbjjvbdLFegaaRV
+EPCjjvbdrXQLcJYq
+DncKjvbdWXJXvDdg
+DnbjjvbdQdCaQRDr
+EOcLKvbdWWiXuceH
+DoCjjvbdbiNJkGXY
+EPDKjvbdijGHjMxS
+DoDLKvbdTfzmkwVe
+EObkKvbdmSZUzTEJ
+DnbjjvbdKefHaaRV
+DncLKvbddoFSjstS
+DncLKvbdSLYfUgKs
+EPCkKvbdCIjbLJGK
+DncKjvbdKNADzGuB
+DoDKjvbdBcpBVjMf
+DnbjjvbdpxoHfqEY
+DoCjjvbdANHyTWyx
+DoDKjvbdFjeSbgmV
+DnbkKvbdxwiKCPzL
+DncKjvbdqceIpNvB
+DnbjjvbdLFfHbAqV
+EPDLKvbdtTSTYydc
+EPCjjvbdezvYdiTw
+EObjjvbdWWiYVdFH
+EOcLKvbdZyDjNbkr
+EObkKvbdwzIFeweS
+EPCjjvbdjmBkzFGo
+EObjjvbdGAoRYizm
+EObjjvbdjcMLQgVH
+DoCjjvbddePRavbj
+EOcKjvbdlhcspuSB
+EPCjjvbdSCEFMJZL
+EObkKvbdEYYLsssl
+EObkKvbdpstGrSLU
+DoDLKvbdIGgZxwwg
+EObkKvbdWIYWYGxz
+EPCjjvbdfILWSNqH
+DnbkKvbdFWYpPljF
+DoCjjvbdVAbRSqRy
+EOcKjvbdeEoSCWcK
+EOcKjvbdSBceMIxk
+DoCjjvbdgFkzOGgA
+EObkKvbdbPfgELzd
+DnbjjvbdmtuZkJqf
+EPCkKvbdYgWdAPSi
+EObkKvbdmaiwXoOV
+EOcKjvbdjuvnDbXw
+DncLKvbdiBoCdvpq
+DnbkKvbdZxcjNbkr
+EPDKjvbdKfFgaaRV
+DoDKjvbdNGcPlouL
+EOcKjvbdHlBznXQk
+EPCjjvbdKQydoFme
+EPCjjvbdDxYLsssl
+DoCjjvbdHbLydzAD
+DnbkKvbdZisHofbG
+DnbkKvbdvvkaWBWV
+DncLKvbddxZtUSFz
+EPCjjvbdBcpBWJlf
+EObkKvbdVBBprpqy
+DoCkKvbdaSFcITfL
+DoCkKvbdZLqctOMN
+EPDKjvbdFWYpQMie
+DncKjvbdOEctJIjd
+DoCkKvbdEuyQPmJe
+DncLKvbdZGwEAOsJ
+DncKjvbdlqyUzSci
+EOcKjvbdKCibqKCx
+DnbjjvbdEOcLKvbd
+DncKjvbddneTLUUS
+EPCjjvbdhbPDFWpq
+DoCjjvbdeAUQmXjG
+EPDKjvbdVwJYWDeH
+DncKjvbdePFTKstS
+DoCjjvbdjggMFemk
+EPCjjvbdcScLUDjB
+DoDKjvbdZjTIQGbG
+EObjjvbdehKurNpg
+DncLKvbdbsDLUEJa
+EOcLKvbdEJgjWXjA
+EPCkKvbdqquKnKaN
+DnbjjvbdZjShQHCG
+DoCjjvbdCEPaVilf
+EObjjvbdzjUpQDrt
+EOcLKvbdUVlPjUBR
+DnbjjvbdeFPSCWbj
+DoCkKvbdKxpirzuG
+DncLKvbdrykpTAgn
+DoDKjvbdemGXGljL
+DncLKvbdTYKlNzkY
+DncKjvbduaDyTOeI
+EObkKvbdnBjWwoOV
+EPCkKvbdGdLWKCJj
+EPDKjvbdKeegaaQu
+EObkKvbdxnShXrhc
+DoCkKvbdsBemLgKy
+EPCjjvbdrzLoraHn
+EPDLKvbdrRuKmjaN
+DncLKvbdmajWxPOV
+DncKjvbdKVuGDeGi
+EObjjvbdziuQPdTU
+DnbkKvbdZxcinCkr
+EPCkKvbdlqxtzTDi
+EPCkKvbdyzeOSHiI
+DnbkKvbdqmZiyMIJ
+EOcLKvbdIwtBgkqQ
+DncLKvbdfekzOHHA
+EPCkKvbdKNADzGuB
+EOcLKvbdUaBqSqRy
+EPDKjvbdddnrBvbj
+DncLKvbdmuVZjirG
+EOcKjvbdbBWEepPw
+DncLKvbdwjvdHzyf
+EPDKjvbdmgFXlmgZ
+EPCkKvbdtSqryZeD
+EObkKvbdOFEUIhkE
+EOcKjvbdiBncFXRR
+DncLKvbdxZgeeweS
+EPDLKvbdxwiKCPyk
+EPDKjvbdHEKvJajK
+DncKjvbdrafMlGjy
+EOcLKvbdwWlBWBWV
+DncLKvbdegjvRmqH
+EObkKvbdehKvRmqH
+DoDLKvbdUaBpsQrZ
+EPDKjvbdRaceMJYk
+DnbkKvbdZRNEhldq
+DnbjjvbdKCibpjDY
+DoDLKvbdKaLGmCXq
+DncLKvbdKaKflbYR
+DoCjjvbdZQleJNFR
+EPCjjvbdZHWdAOsJ
+EObkKvbdpxnggRDx
+EPDKjvbdiUzFXSVC
+DncKjvbdhfjDZWJu
+DoCjjvbdYkrDtNlN
+EOcLKvbdkVvmdBxX
+DnbjjvbdFkFScHlu
+DoCjjvbdlrYuZrci
+EOcKjvbdrDdiPnWB
+DoCjjvbdfoazvcwh
+EPCkKvbdtkxWaUAw
+EObjjvbdVYgsyjoO
+EPCjjvbdssSTZZeD
+DoCjjvbdbVBfwjsh
+EPCjjvbdVgwuxGxz
+EOcKjvbdZoNhdeZj
+EPCkKvbdGYttaDwb
+DncLKvbdvAcySoEh
+DoDKjvbdIGfzZYYH
+DoDKjvbdtcCtvvPP
+EObjjvbdkxsRryHU
+DnbkKvbdJSyBTMwl
+DoCjjvbdsPuoJbuf
+DnbjjvbdZxcimcMS
+DoDKjvbdNGbpMouL
+DnbjjvbdSZjHrbvA
+DoCkKvbdmRxtysDi
+EOcLKvbdZQmEiMeR
+EPCjjvbdpfEEtVaI
+EPCjjvbdtTRrxzEc
+DoCkKvbdZdxGzghb
+DncKjvbdrykpTBIO
+EPCkKvbdxxIjCPyk
+DncLKvbdCEQAujNG
+EOcLKvbdrWokbhyR
+EPDKjvbdjJehKMwr
+DncLKvbdSxLMNzjx
+DnbjjvbdZyDinDMS
+EObjjvbdZirhQGaf
+DncLKvbdkClKqHVH
+EObkKvbdfIKvRmqH
+DoDLKvbdQvmcblID
+EPDKjvbdNsTufdtp
+EObkKvbdZRMeIleR
+DnbkKvbddwytTrFz
+EObjjvbdZxdKODMS
+EPCkKvbdSLZFtgKs
+EPDKjvbdrovPJbuf
+EPCjjvbdHgHZxxYH
+EPCjjvbdddoSBvbj
+DoDKjvbdegkVqmpg
+DoDKjvbdCfkfHAzc
+EObjjvbdtvNxJqTA
+EPDKjvbdhtyeXSVC
+EPDLKvbdUtMtGLvK
+EPCjjvbdFaPRYizm
+EPCkKvbdVZIUZkOn
+EPDKjvbdFeiqnIsq
+EObkKvbdddoRbWcK
+EOcLKvbdaNLCSuMg
+EObjjvbdFpATXGfZ
+DncLKvbdrXPkcJYq
+EPCjjvbdFjdrcHlu
+EObkKvbdUQqPVUhN
+DoDLKvbdpxoHfqDx
+DncLKvbdypoNIjXA
+EPCjjvbdmRxuZrdJ
+EPDKjvbdqZPHgREY
+EOcLKvbdZGwEAPTJ
+DncLKvbdjuwNcbXw
+DoCkKvbdTlWPBVoJ
+DoCjjvbdRzKIScWA
+EPDLKvbdZnnJFEzK
+EPDLKvbdqvokbhyR
+DnbkKvbdAMhZTWyx
+EPCkKvbdqYoHgRDx
+EPDKjvbdZtJJZETO
+EObkKvbdWRmxBdlD
+DnbkKvbdwWkaWBWV
+DncKjvbdgKfzcGAE
+DncLKvbdtbcUwVno
+EOcLKvbdcImJjfWx
+DncLKvbdSwjlNzjx
+EObkKvbdjblLQftg
+DncLKvbdQmYByNtz
+DnbjjvbdhlFDmtby
+DnbjjvbdcTDKsdJa
+EPCkKvbdqUTgSRkU
+EOcKjvbdZQleImEq
+EOcLKvbdtTRrxzFD
+EPCkKvbdUVkpKUAq
+DncLKvbdmbJvwoNu
+EPDKjvbdrJAKFMne
+DncKjvbdpyOhGqEY
+EOcLKvbdLrWlzVQz
+DnbjjvbdvAdYsPFI
+EPCkKvbdDoDKjvbd
+DoDLKvbdelfWgMjL
+EObkKvbdaMjbTUlg
+EObjjvbduVmwjRTA
+EPCjjvbdHffyxwwg
+DnbkKvbdXrkaNToY
+DoCjjvbdZshhyDrn
+DoDKjvbdunszqKoU
+EPCkKvbdmJDtRVSB
+DnbkKvbdcImKLFwY
+DoCjjvbdpedEtVaI
+DnbjjvbduMXwAtBX
+EPDLKvbdhbPDFWpq
+EPCjjvbdrDdiQNua
+DnbkKvbdKxpirzuG
+EObkKvbdcTCjtEJa
+DncLKvbdZQmFIldq
+DoCkKvbdqUUGrRkU
+DnbkKvbddZyQXyRC
+DncLKvbdIryBTNXl
+EPDKjvbduaDxrneI
+DoCkKvbdZMSDsmlN
+DoDKjvbdrovOjCvG
+EOcLKvbdhyuFkpmf
+DoDLKvbdddnrBwDK
+DncKjvbdDwxLstTl
+EPDLKvbddZxpXxpb
+DoDKjvbdCSaDTewS
+EPCkKvbdVqmxBeLc
+DoCkKvbdZMSEUNkm
+DnbkKvbdznopdcMY
+EPCjjvbdqYoHgQcx
+EPCkKvbdlhdUQuRa
+EObjjvbdauBgYLUI
+EObjjvbdySnJMrCH
+EObjjvbdkIGlGGOL
+DoCkKvbdwXMAvBWV
+DnbjjvbdiCOcFXRR
+EPCkKvbdIHGzZYXg
+EPDKjvbdiMFDmuCy
+EOcKjvbdtlXvaUBX
+DoDLKvbdhfibxuiu
+EPCkKvbdqwQMChxq
+EObkKvbdRkYeuGjs
+DoDKjvbdYkrEUNlN
+EPDKjvbdZshiYcsO
+DnbkKvbdQlxBxnUz
+DncKjvbdSPtGifEX
+DoDLKvbdmajXXoNu
+EObjjvbdHbMZdzAD
+EPCkKvbdZyEKNblS
+EObkKvbdKfFgbBRV
+EOcLKvbdOTUVgFVQ
+DoCkKvbdfMevgMik
+EPDKjvbdptTfrSKt
+DnbkKvbdxZhFexFS
+DncLKvbdUaBqTQrZ
+DoCjjvbduDDUwWPP
+DoDKjvbdNsUVfduQ
+EObkKvbdvOszpjoU
+EObkKvbdNsTvGdtp
+EPDKjvbdxwhiapZk
+DoDKjvbdiGjCxvJu
+DoDLKvbdxxIibPyk
+DncKjvbdvAdYroFI
+EOcLKvbdLAkGmBwq
+DncLKvbdIsYaTMxM
+EPDLKvbdFejRmiUR
+DoCkKvbdbrbjscia
+DoDLKvbdiHJbyWJu
+EOcKjvbdIwtBhMQp
+EObkKvbdpfDdtVaI
+EObjjvbdfMevfmJk
+EObjjvbdptUHRrLU
+EPDLKvbdYgXEAOri
+EObkKvbdZoOJEeZj
+DoDKjvbdqUUGqqjt
+DnbjjvbdxnTHwriD
+EPDKjvbdfHkWRmpg
+EPDLKvbdePEsLUUS
+EPCjjvbdEPCkLXDE
+DoCjjvbdgQBzvdYI
+DoCkKvbdZjSgogBf
+EObkKvbdtunYKQsA
+EPDKjvbdezvYdiTw
+EPDLKvbdLBLGmCYR
+EObkKvbdSLYfVHKs
+EPDKjvbdfILWSNqH
+EObjjvbdqlyixkhJ
+DoCkKvbdjKFgjNXr
+DoDLKvbdyzdmrHhh
+DoDLKvbdYpleImEq
+DoDKjvbdUxgtZkPO
+EPDLKvbdJKEAKPgE
+DoDKjvbdRXODblHc
+DoCkKvbdmozYujxb
+EOcKjvbdMgCpMouL
+DncKjvbdZsiJZESn
+EPCkKvbdzROmIiwA
+DnbkKvbdEOcLKvbd
+EPCjjvbdpxoIHRDx
+DnbkKvbdEJgivXjA
+DoDKjvbdfHjurOQg
+EObjjvbdyYIjCPzL
+DoCjjvbdvlvANEEm
+DncLKvbdOXoVzdOU
+EObkKvbdatagYKtI
+DnbkKvbdGYtuAcwb
+EObkKvbdegjuqnRH
+DnbkKvbdtumxKQsA
+DnbkKvbdIxTbILqQ
+DncKjvbdIsZBTMxM
+EPCjjvbdRjyFuHLT
+EOcKjvbdJXtCIMQp
+DoDKjvbdYkqdUOLm
+EObjjvbdZsiIyESn
+DnbkKvbdhtyeWrUb
+EPCjjvbdEuyQPmKF
+EOcLKvbdeFOrCWcK
+DoDLKvbdEvYpPlie
+DoCjjvbdZtJIyETO
+EPCjjvbdrWokcJYq
+DoDLKvbduaDySneI
+DncLKvbdsPunjCuf
+EObkKvbdpyOhGpcx
+EObkKvbdliDsqUqa
+DoDLKvbdhaoCeXQq
+DncLKvbdaRfChUFk
+EOcKjvbdYTMAlsoY
+EPCkKvbdfkGzbfAE
+EOcKjvbdURQnttgm
+DoDLKvbdDoCjjvcE
+DncLKvbdCJKbLJGK
+EPDKjvbdhlFEOVDZ
+DnbkKvbduCcVWvOo
+EPCjjvbdQdDBPpcr
+EObkKvbdbBVdeopX
+DnbkKvbdWHwuwfxz
+DoDLKvbdsrqrxzFD
+DoDKjvbdCSaCsfXS
+DoCkKvbdNPxQunGs
+EPDLKvbdyzeNrHhh
+EObjjvbdWXIwudFH
+EPCjjvbdKWVFceHJ
+EOcLKvbdqwPlCiZR
+DncLKvbdyOTHwsJD
+DncLKvbdxUleRZMO
+DnbjjvbdZHWdAPTJ
+DoDLKvbdePEsKstS
+EPDKjvbdHDkVjBij
+EObjjvbdSPtHJecw
+EObjjvbdyTOJNRag
+EOcKjvbdhfibxuiu
+EOcKjvbdRDbaPqES
+DnbjjvbdemGWflik
+DoDKjvbdwjwEHzzG
+EObjjvbdsCGNMGjy
+DnbjjvbdssRsYyeD
+DoDKjvbdJvVFceGi
+EPCkKvbdLZQjSzuG
+DoDLKvbdqUUHSSLU
+EPCjjvbdaaWEeoow
+EPCjjvbdDjHiuxKA
+EPDKjvbdZQmFIleR
+DoDKjvbdRDbaPpdS
+EPCjjvbdZoOJFFZj
+EObjjvbdQmYBxnUz
+EPDKjvbdKCibqKDY
+DoDLKvbdsCFmMGjy
+DncKjvbdKaKgMaxR
+DoCjjvbdrMzJxkhJ
+EObkKvbdeKKRutzn
+EPCkKvbdcTCjscjB
+EPCkKvbdZsiIyDrn
+EObjjvbdnBjXXoOV
+DoDKjvbdBiKakIfK
+EOcKjvbdRpTfjGEX
+DoCkKvbdtSqrxydc
+EObkKvbdHDkVjBij
+DncLKvbdqTsgSSLU
+DncLKvbdzdzOzdzQ
+DoDLKvbdVrNwadlD
+DncLKvbdSQUGifEX
+DncLKvbdxxJKBoyk
+EPCjjvbdrzLpSaIO
+DnbkKvbdhtyeXRuC
+DoDKjvbdyTOImSBg
+EPDLKvbddZxpXxqC
+DoCkKvbdZMSDsnLm
+DncLKvbdEARhlzXX
+EPDKjvbdkWXOECYX
+EObkKvbdSLYetgLT
+EPDKjvbdTfznLvvF
+DoCjjvbdSZjHrcWA
+DncKjvbdmJDsptqa
+EOcLKvbdZxdJmblS
+DnbjjvbdKWUfDeHJ
+EPCkKvbdLiBkpxAS
+EObkKvbdePFSkTtS
+DoDKjvbdYzbfSKWZ
+EPCjjvbdvAdYsPFI
+EObkKvbdTAFJIBnd
+DnbkKvbdsZkpSaHn
+DoDLKvbdczZQYZRC
+EPDKjvbdTvMQKTaR
+DnbkKvbdyYJKCQZk
+EPCkKvbdVAaqTQqy
+EOcLKvbdbPfgDkzd
+EObkKvbdePErjssr
+EPDLKvbdyTOJNRag
+EPDLKvbdyTNiNSBg
+DoCjjvbdqvpMCiYq
+DoDKjvbdRpUHKGEX
+DoCjjvbdDoCkLWbd
+DncLKvbddCTNSATm
+DoCkKvbdcSbkUEJa
+EPDLKvbdzjVPocrt
+DnbkKvbdxVNFQyLn
+DnbkKvbdSKyFtfkT
+DoCkKvbdmpZxukZC
+DncLKvbdGFjSOJTq
+EOcKjvbdhkdcmtcZ
+DoCjjvbdyzeORghh
+EPCkKvbdRbDeMJZL
+DoDLKvbdZMRctOMN
+EObjjvbdAMgySvyx
+EOcLKvbdTYLMNzkY
+DnbjjvbdmuVZjjSG
+DnbkKvbdZsiIyDrn
+EPDLKvbdjEjfuPAO
+DoCjjvbdkxrrSxgU
+DncKjvbdSLYfUfkT
+DnbjjvbdBcpAvJmG
+DoDLKvbdSPsgKFcw
+DoCkKvbdrXQMDIyR
+EObkKvbdKVuFdEfi
+DnbkKvbdrSVLOLBN
+DoDKjvbdZnmhdeZj
+DoDKjvbdNHDQNPuL
+DoDKjvbdpyOggREY
+DoCkKvbdQvmcblID
+EPCkKvbdMfbomQVL
+EPCjjvbdNVTRjmAX
+EOcKjvbdbhlijevx
+EObkKvbdWWiXvEFH
+DncKjvbdlqyVZrdJ
+DnbjjvbdrSUkNjaN
+DncLKvbdmSZUzTDi
+EObjjvbdZQmEhmEq
+EOcKjvbdiLdcnVDZ
+EObkKvbdySmhlqag
+DnbjjvbdbUagYLTh
+DncKjvbdBdQAvKNG
+DncLKvbdyzdnRghh
+EObkKvbdLZRKSztf
+DoDLKvbdRXOEDMHc
+DncKjvbdFkFSbgmV
+EPCjjvbdZQldiMeR
+EPDLKvbdFfJqmiTq
+EOcLKvbdpssgRrKt
+DnbjjvbdKRZeOeme
+DnbkKvbdnPzYvLZC
+DoDLKvbdUVlQJsaR
+EPCjjvbdqFceTvAh
+EPDKjvbdEARhlyvw
+EPCjjvbdNGbolotk
+DoCjjvbdVhYWXgYz
+DoCjjvbdUtMtFkvK
+DncKjvbdZQldhleR
+DnbjjvbdCEPaWKMf
+EObjjvbduWOXjQsA
+EOcKjvbdIjEAKPfd
+DoCjjvbdURRPUuIN
+EObkKvbdbhmKKfWx
+DoDKjvbdxrnJMrCH
+EObjjvbdGFirNiTq
+DoDLKvbdtSqsZZeD
+EPDLKvbdKkAhWAJy
+EPCkKvbdbVBgYKsh
+DoCjjvbdKWVFdFGi
+EPDKjvbdwXMAuaWV
+DoCkKvbdRXNdCkhD
+EPCjjvbdZRMdhmEq
+DncLKvbdcJMijfWx
+DnbkKvbdZRNEiNFR
+EObjjvbdAMhYrvyx
+EPDLKvbdijGIJmXr
+DoCkKvbdbhmJjfXY
+EOcLKvbdrzMQTBHn
+DnbkKvbdKVtfEEfi
+EPCkKvbdxVNFRZMO
+EPDLKvbdjcMLQgUg
+EObjjvbdjuwODbXw
+EObkKvbdZeXfzhJC
+EPCkKvbdUyITyjoO
+EPCkKvbdGFjRnIsq
+DnbjjvbdIwsbHlRQ
+DncKjvbdtTSTYzEc
+EPDKjvbdhfjCyWKV
+DoCjjvbdhytelQnG
+DoDKjvbdxnTHxTIc
+EOcKjvbdUQqPUtgm
+EPDLKvbdkNCMZdgP
+DnbkKvbdGKeTDINV
+EOcLKvbdZMRcsmlN
+DnbjjvbdRXNdCkgc
+DoCjjvbdRXNccMHc
+EObkKvbdRjyFuGjs
+EPDLKvbdmJDtRUrB
+DoDLKvbdpyPIGpdY
+EPCjjvbdkNCLzEgP
+DoDLKvbdZoNiFEzK
+DoDKjvbdKVuFcdfi
+DoDKjvbdqZOggQdY
+EPCkKvbdSQTgJecw
+EOcKjvbdrRuKnLAm
+EObkKvbdbUbHYLUI
+EOcLKvbdyNrgwsJD
+DoDKjvbdegkVqnQg
+DnbkKvbdGBOpxizm
+EObkKvbdJbjDQicY
+DncLKvbdSLZFuGjs
+DoCkKvbdGckVibJj
+DoCkKvbdzeZnzdyp
+EObjjvbdxxJKCQZk
+EObjjvbdJpzFPGNe
+EPCkKvbdUsltGLvK
+DoDLKvbdziuQQDsU
+DncLKvbdRzKIScWA
+DoCkKvbdSLYfVGjs
+EPCjjvbdhgKDYujV
+DoDKjvbdtunXjQsA
+EPDKjvbdqceJPnWB
+DncKjvbdUQqOuUhN
+EOcKjvbdJvVFceHJ
+EPCkKvbdMfcPmQVL
+EObkKvbdNrsufdtp
+DncLKvbdUQpnuUhN
+DncKjvbdYkqdUOMN
+EObkKvbdqceJQNvB
+EPDLKvbdCWzdJFPv
+DncKjvbdauBfxLTh
+DncKjvbdZnnJEdyj
+DncLKvbdEvYpPlie
+DoDLKvbdhaoCdvpq
+EObkKvbdCEQBVimG
+EOcKjvbdBiKbKhfK
+DnbkKvbdeuzwpJzs
+DncLKvbdhlEcnVDZ
+EObkKvbdkCkjpftg
+DncKjvbdZQldhmEq
+DoDKjvbdFyVVBEXb
+DncKjvbdZirgogCG
+EPCkKvbdWXJXvEFH
+DnbkKvbdOStVfduQ
+DnbkKvbdNGbpMouL
+EObkKvbdcIljKfXY
+DoDLKvbdXrlBMsnx
+EOcLKvbdfNFwGmJk
+EObjjvbdUQqPUuHm
+DnbjjvbdEXxLtUTl
+EPDKjvbdLGFhCBQu
+DncKjvbdTYLLmzkY
+DoCkKvbdkaNPNALA
+DoCjjvbdFxtuBDwb
+EPDLKvbdGGJrNhsq
+DoCkKvbdZyEJnDLr
+EObkKvbdDxXlTssl
+EPCkKvbdGKdrbglu
+EOcLKvbdmoyyVjxb
+DnbkKvbdRNYByNtz
+EObjjvbdGFirOItR
+DoCjjvbdxUmFRZLn
+EPCkKvbdsQWPJcWG
+EPCjjvbdegkWSORH
+DncLKvbdYzcGRjVy
+DoCkKvbdRXNcblHc
+EObkKvbdwtldqYkn
+DnbkKvbdZisHpGaf
+EPCkKvbdGQASvfey
+DnbjjvbdeFPRavbj
+EOcLKvbdGZVVBEYC
+EPCkKvbdKDKDQicY
+EPCkKvbdUsmUFkuj
+DoCkKvbdatbHXjtI
+EObkKvbdlrYtyrdJ
+DnbjjvbdjKGHilwr
+EOcKjvbdjlakyeGo
+DoDLKvbdnPzZVkZC
+DnbjjvbdCIjbLJFj
+DoCkKvbdegkWSORH
+DoDLKvbdjvXODbYX
+EPDKjvbdaaVeFoow
+DncKjvbdwtmFRZLn
+EObkKvbdkNCLzEfo
+DncLKvbdrbGMlGkZ
+EObjjvbdczZQXxqC
+DoCkKvbduaEZTOdh
+EObjjvbdZxcjNbkr
+EOcKjvbdCJKbKiFj
+DnbjjvbdjEkGuPAO
+DnbjjvbdZshhyDsO
+DoDLKvbdbsCkUDjB
+DoCkKvbdNddUIhkE
+EPDLKvbduVnYJpsA
+DnbjjvbdQvmccMHc
+DoDKjvbdDjIKWXjA
+DoDLKvbdxZhGGYEr
+EObkKvbdqquKmkBN
+EObjjvbdLBLHMawq
+DoDLKvbdrbFmLgLZ
+EPDLKvbdddnrBwCj
+DoCkKvbdbrcLUEKB
+DoDKjvbdqlyjYlHi
+DncKjvbdQwNdDMID
+EObkKvbdBiLCKhej
+EPCkKvbdSZigsDWA
+DnbkKvbdwuNFRYlO
+EPDLKvbduCbtvvOo
+DnbjjvbdaaWFFpPw
+EObkKvbdRECaQQdS
+DncKjvbdyOShXsJD
+EPCkKvbdFVyPomJe
+DoDLKvbdcJMijevx
+EObkKvbdSZigsCvA
+EObjjvbdrNZjYlHi
+DnbkKvbdKfFhBaRV
+EPDLKvbdSLZFtgKs
+EPDLKvbdrbGNMGjy
+EPCjjvbddwzTtSFz
+DoDLKvbdnGdxNNgZ
+DncLKvbdTfzmlWue
+EOcKjvbdbLLfOmcA
+DoDLKvbdNGcQNPuL
+DncLKvbdUaCQsQqy
+EPCjjvbdCfkfHAzc
+EPDKjvbdlrYuZsDi
+EPDLKvbdmajXYPOV
+EObjjvbduCcUvvOo
+DoDLKvbdJXsahLqQ
+EPCkKvbdOSsugEuQ
+DnbkKvbduaDyTOeI
+DncLKvbdYqNEhldq
+EOcLKvbdeOdsKtUS
+EOcKjvbdkHgLefOL
+EPCkKvbdrpVoKCuf
+EObjjvbdShzJqAAl
+DnbjjvbdgPazwDxI
+EPDLKvbdEztQdlDJ
+DoDKjvbdYpmFImFR
+DncLKvbdsBellHLZ
+DoCjjvbdatbHYKsh
+DoCjjvbdptTgRrLU
+EOcLKvbdznpRFCkx
+EPCjjvbdWWiYWEFH
+EPCjjvbdRosgJedX
+DnbjjvbdkIGkefOL
+DnbjjvbdiZuGLqNf
+EPCkKvbdANIZTWyx
+EObjjvbdZQmFJMdq
+EObkKvbdjvWmcbYX
+DncLKvbdRbEFMJYk
+EOcKjvbdpfDdtVaI
+EPDKjvbdJqZePFnF
+DnbjjvbdeFOqavcK
+DoCjjvbdnHFXlnHZ
+EPCjjvbdTvLpKTaR
+EPDLKvbdVgxVxHYz
+EObkKvbdZRNFJMdq
+EPDLKvbdbUafwkUI
+EObjjvbdKCjDQibx
+EPDLKvbdrXPlChyR
+DoCjjvbdxsNhlqbH
+DoDKjvbdNGbomPtk
+EPDLKvbdLBLGmBwq
+DncLKvbdIsZBTNYM
+EPDLKvbdOXnuzcmt
+EPDKjvbdKDJcRJcY
+EObkKvbdiBncFWqR
+DncLKvbdlhcsqUrB
+DncKjvbdrylQTAgn
+DoDLKvbdTlWOaWOi
+EPCkKvbdegjurNpg
+EObjjvbdyTNhmSBg
+EPCjjvbdQccBPpcr
+EPDKjvbdeOeSkTtS
+DoCjjvbdGYuVAdXb
+EObjjvbdrzMPsAhO
+DncLKvbdrEFJQOVa
+EPCjjvbdbhmKKfWx
+EPCkKvbdeYZssqez
+DnbkKvbdURQntuHm
+EPDLKvbdkDLkRHVH
+EOcKjvbdlZSrSxft
+EObkKvbdijGHimXr
+EOcLKvbdpxnggQdY
+DncKjvbdJKEAJpGd
+EPCjjvbdMowpumfs
+DoCkKvbdmSYtysDi
+DoDLKvbdBsBDTfWr
+EPDLKvbdrMzKZMHi
+DnbkKvbdBraDUGWr
+DnbjjvbdDxYMTtTl
+DncKjvbdFyUuBEYC
+EPCkKvbdVZITzKnn
+DnbkKvbdTkvPBWPJ
+EObkKvbdSQTfjFdX
+DoCjjvbdZisIPgBf
+EPCkKvbdLGFhCAqV
+DoCjjvbdNGcQNPuL
+DoCkKvbdqlzJyMIJ
+EObjjvbdZtIiZDrn
+DnbjjvbdeEoRawCj
+DoDKjvbdUaBqSqRy
+EOcLKvbdmfdwmOGy
+DoDKjvbdptTfqrKt
+DoDLKvbdvAcxsPEh
+DoCkKvbdySmhmRbH
+EOcLKvbdhfjDZWKV
+EOcKjvbdHffzZXxH
+DoDKjvbdLFfHaaQu
+EPCjjvbdgFlZmfgA
+EOcKjvbdtcCuXVno
+DoDLKvbdZirgpGbG
+EObjjvbdNsUWHEuQ
+DoDLKvbdsBfNLgKy
+DoDKjvbdGGKRnJUR
+DoDLKvbdKkAhWAKZ
+DnbjjvbdOFDtJJKd
+EPCjjvbdMuSrKmAX
+DnbjjvbdyXiKBpZk
+DncLKvbdOFDtIhjd
+DoDKjvbdNPxQumgT
+DnbjjvbdrSVLOKaN
+EPCjjvbdmJDtRVRa
+EPCkKvbdZeXfzgiC
+DoDKjvbdhaoCdwRR
+DncKjvbdiBncFXRR
+EPDLKvbdvBEYrndh
+DnbjjvbdBiLBkIfK
+EPDLKvbdhgJbyVjV
+DncKjvbdzRPNIiwA
+DnbjjvbdegjvRmpg
+DncLKvbdyYIibQZk
+EPCkKvbdxnTIXrhc
+EPCkKvbdhkeEOUby
+DnbkKvbdjJehKMxS
+DoDKjvbdkVwODbYX
+EPCkKvbdFWYpQNKF
+EPCjjvbdXrkaMsnx
+EPDKjvbdRjxetgLT
+DoDKjvbdEztRFLbi
+DnbkKvbdqdFJQNua
+EPDLKvbdTqQntthN
+DoDLKvbdYORAXtvU
+DnbjjvbdEYXksstM
+EPDKjvbdkMbMZdfo
+DncLKvbdJKEAKQGd
+EOcKjvbdFejSOJUR
+DoCjjvbdYlRdTmkm
+DoDKjvbdlYrqrxgU
+EPDKjvbdKVuFdFGi
+EOcLKvbdJqZeOfNe
+DnbkKvbdzoPpdcLx
+DoDKjvbddePSCXCj
+DoDKjvbdEASIlywX
+DoCjjvbdrEEiPmua
+EPCkKvbdidkGuPAO
+EObjjvbdKRZdnfNe
+DncKjvbdhgJcZWJu
+EPDLKvbdZxcimbkr
+EPDKjvbdNeEUIiKd
+EOcKjvbdvAdZSndh
+DncLKvbdjggMGGNk
+EObkKvbdOStVgFUp
+EPCkKvbdRaceMIxk
+DncKjvbdDwxMUUUM
+DncKjvbdWeyZtAPT
+EPCjjvbdEYXkstTl
+EOcKjvbdxsOJNSBg
+EPCkKvbdKQzFPFnF
+EOcLKvbdJXtCHkpp
+DoCjjvbdtlYXBUBX
+EPCjjvbdwuNFRYkn
+DoDLKvbdkDLjpfuH
+EPDKjvbdxrmhlqbH
+EOcLKvbdjmCLzEgP
+DoCjjvbduaEYsPFI
+EPCkKvbdCEPaWJmG
+DncKjvbdwtmEpxlO
+EPCkKvbdJbjCpjCx
+DnbjjvbdhzVGMRNf
+EPCkKvbdZxcinDMS
+DoCkKvbdrNZiyLgi
+EOcLKvbdIHGyyYYH
+EObkKvbdYNqAXuWU
+EPDKjvbdtvNwjRTA
+EPCkKvbdcJMjLFvx
+EPCjjvbdNrsvHEuQ
+DoCjjvbdnGeYMmgZ
+DoDLKvbdSLZGUfjs
+EPDKjvbdtvOYKRTA
+DoDKjvbdziuPpESt
+DoCkKvbdMgDPlotk
+DoCkKvbdeFOrCXDK
+DnbkKvbdMgColpUk
+EPCkKvbdKVuFdFGi
+DoDLKvbduCcUvuoP
+DoCkKvbdRDcAopdS
+EPDLKvbdehKvSNpg
+EOcKjvbdDoCjjvbd
+DoCjjvbdOSsufdtp
+EObjjvbdGQASwGfZ
+DncLKvbdiHJcYujV
+DncKjvbdRadFMJZL
+EPDLKvbdZxcinDLr
+EPDLKvbdhaoDFXQq
+DoDKjvbdcJNJkGXY
+DoDLKvbduaDySoEh
+EOcKjvbdUxhUZkPO
+DncLKvbdVYhTzKoO
+DnbjjvbdehKvRnQg
+DnbkKvbdOhAXyAYa
+DncLKvbdxsNiNRag
+DoDLKvbdTppoVUgm
+EObkKvbdURROuVIN
+EOcLKvbdNsTugFVQ
+DoCkKvbdrXPlChxq
+EPDKjvbdHDkWJajK
+DoCkKvbdxnTHxTIc
+EPDKjvbdEvZPoljF
+EPDKjvbdrzMQTBIO
+EPCjjvbdqZPHgQcx
+DoCkKvbdVqmxCFMD
+DncLKvbdSPsgKGEX
+DoCkKvbdzjVPodSt
+DoDKjvbdnUtyjiqf
+DnbjjvbdIBkydzAD
+DoDKjvbdcTDKscjB
+EOcKjvbdiHKDYuiu
+DncKjvbdBraDUFvr
+DoCjjvbdQmYCZOUz
+EPCkKvbdySnIlqbH
+DnbkKvbdkDLjqGuH
+DnbjjvbdVqnYCFMD
+DncLKvbdGKeTCglu
+DncKjvbdlZSqrxft
+DncLKvbdrEEhpNvB
+EOcLKvbdrDeJQNvB
+EPCkKvbdQmXbYmtz
+DoCkKvbdQlxCYnUz
+EPCjjvbdEObkLWbd
+EPDLKvbdehKuqmqH
+EPCkKvbdkCkjpfuH
+DncKjvbdRXNcblHc
+EPCjjvbdsrqrxydc
+EPDKjvbdddoSBvcK
+EPCjjvbdADRxJzIp
+EPDLKvbdvAcxsPEh
+EPDKjvbdSLYfUgLT
+DoCkKvbdsrrTYyeD
+DoCkKvbdLFegbApu
+EPCjjvbdyqOliJwA
+EPDKjvbdqTtGrRjt
+EPCkKvbdhbObdvqR
+EPCjjvbdcScLUEJa
+DoDLKvbdRWnDblID
+EObkKvbdZLrETnLm
+DoDKjvbdiBoDEvpq
+DoDKjvbdMpXqVmfs
+EPCjjvbdpxngfpcx
+DncKjvbdsCGNLfjy
+DncKjvbdRjyGVHLT
+EPDKjvbdkHflGFmk
+DoDKjvbdlhdUQuSB
+EPCjjvbdKaLGlbXq
+EPCkKvbdVhXvXgYz
+EOcLKvbdKyQirztf
+EOcLKvbdliDsqVRa
+DncKjvbdJutfDdfi
+DoDKjvbdEXwksssl
+DncLKvbdxxIjCPyk
+EObkKvbdKaKgMaxR
+EPDKjvbdkCkjpgUg
+EOcLKvbdZLqctNlN
+EPDKjvbdNddThhjd
+EOcKjvbdYlSDsmlN
+EPDLKvbdmgExNOGy
+DoDKjvbdePErjstS
+DnbkKvbdZQleIldq
+DncKjvbdpssfrRkU
+EOcKjvbdDxYMTtTl
+EPCjjvbdySmhmSBg
+EPDKjvbdiiehJlxS
+EOcLKvbdFkFTDINV
+EPCjjvbdVqmxCFMD
+DncLKvbdIsZAsMwl
+DncKjvbdBraDTfXS
+EPDKjvbdmuUykJqf
+DnbkKvbdFyVUaEXb
+EObjjvbdzROmJJwA
+DncKjvbdEYXlUUTl
+EPDKjvbdBhjbKhfK
+DoCjjvbdJpzEneme
+DncLKvbdVwIwuceH
+EPDKjvbdhfjDYuiu
+EOcLKvbdFpASwHGZ
+EPDKjvbdZoOJEdyj
+DoDKjvbdqdEiPnWB
+DoDKjvbdnBjXYPNu
+DoCjjvbdiHKCxuiu
+EOcKjvbdGLFTChMu
+EOcKjvbdiMEdNtby
+DnbkKvbdGdKujBij
+DncKjvbdKQydneme
+DnbkKvbdziuPocsU
+DoDKjvbdmfdxNNgZ
+EObjjvbdDxXlUTtM
+EObjjvbddePSBwCj
+EOcKjvbdNPxQvOHT
+DnbkKvbdZHWdAOsJ
+EPDLKvbdyqPNIiwA
+DoCkKvbdpyPHfqDx
+EPDLKvbdUslsekuj
+EPCjjvbdiZtfLpnG
+DoCkKvbdmSZVZsDi
+EPCjjvbdpyOhGpcx
+EPDLKvbdzitoodSt
+DoDKjvbdVYhUZkOn
+EObkKvbdBsAbtGWr
+EPDKjvbdvBEYsOdh
+EObkKvbdGcjuibKK
+DncKjvbdeATqNYKG
+DoCjjvbdKNAEZgVB
+DncLKvbdqUUHSRjt
+EOcLKvbdGcjuibJj
+DoDLKvbdnBivxPOV
+DnbkKvbdKCjDRKCx
+DnbkKvbdrykosAgn
+EOcKjvbdUaBqTRRy
+EPCjjvbdcSbkTcjB
+DoDLKvbdIxTbILpp
+DoCjjvbdHDjuibJj
+DncKjvbduaDxroFI
+DoDKjvbdpedEtWBI
+EOcKjvbdXsLaNTnx
+EPCjjvbdYORAYVWU
+DoCjjvbdYpleIleR
+DoDKjvbdCDpAujMf
+EPCkKvbdpxoHfpcx
+DoCkKvbdUWMPisaR
+EPCjjvbdmuUzKjSG
+EPDKjvbdkxsRsYgU
+EPCkKvbdZxcjNblS
+DnbkKvbdbPffckzd
+EPDKjvbdUVkpJtBR
+DoCkKvbdvlvANEFN
+EObkKvbdShyjRAAl
+EPDKjvbdxrmhmSCH
+DoDKjvbdjvXNcaww
+EPDKjvbdkDLjqGuH
+EObkKvbdhfibxuiu
+EPCjjvbdlqyUyrci
+EPDLKvbdFVxopMjF
+EOcKjvbdqdEiPnWB
+DncKjvbdrXPlChxq
+DoCkKvbdxVMeRYkn
+EPCjjvbdlhdUQtqa
+EObjjvbdRotHKFcw
+EObkKvbdwjvcgzzG
+EPDLKvbdBhkBjiFj
+EObjjvbdlZTSTZGt
+DoCkKvbdkIHMFemk
+EObjjvbddndrkTsr
+DoDLKvbdFVxpQNKF
+EPCjjvbdZsiJZETO
+EObjjvbdiMFEOUby
+DoCkKvbdhlFEOUby
+EPCkKvbdrWolDIyR
+EObjjvbdmajWwoOV
+DoCkKvbdypoMiJwA
+DoDKjvbdCDpAvKMf
+EPDLKvbdzjVQQDrt
+EObjjvbdjlakydfo
+EObkKvbdJpyeOeme
+DoDLKvbdiHJcYvJu
+EOcLKvbdbsDKtEKB
+EOcLKvbdrpWOjDVf
+EObjjvbdelfWfmKL
+EObjjvbdxnSgwriD
+DnbkKvbdqlyjZLhJ
+EPCkKvbdQdDBPqDr
+EPCkKvbdRkYfUfjs
+EObjjvbdhtydwSVC
+DnbjjvbdWWhwvDdg
+DoDLKvbdypnliKXA
+DncLKvbdhfibxvKV
+DncLKvbdxrmiNSCH
+DncKjvbdUaBqSqRy
+DoDKjvbdZMSDsmkm
+DncLKvbdFjeScHmV
+EPDLKvbdQYmAHSrK
+DoCkKvbdUVlQJsaR
+DoDKjvbdGKdsDHmV
+EPCkKvbdkHgLfGNk
+EPDKjvbdCIkCLJFj
+DoCkKvbdrpWOicVf
+DncLKvbdqmZiyMIJ
+EObkKvbdNGcQMpUk
+EOcLKvbdhfibxuiu
+DoCjjvbdjcLjqHVH
+EPDLKvbdZxdJnDMS
+DncLKvbdHDkViajK
+EPDKjvbdhytelRNf
+EPDKjvbdZRNFIleR
+EObjjvbdNQYRWNgT
+EPCjjvbdNdcsiIkE
+DoCkKvbdajkfOnDA
+EPCjjvbdRNYCZOUz
+EPCkKvbdBcpAvKNG
+DncKjvbdqTsfqrLU
+EPCjjvbdsZlQSaHn
+EOcKjvbdqdFIpNvB
+DoCjjvbdtbcUwWPP
+EObjjvbdEYYMTtTl
+EOcLKvbdgGLzNfgA
+DoDLKvbdzdynzeZp
+DnbjjvbdajlGPNcA
+EPCjjvbdEJhJuxKA
+EPCjjvbdLLBIWAJy
+DnbkKvbdwzIFewdr
+DoCkKvbdBvzciEpW
+DoDKjvbdaNKasVNH
+EPDLKvbdVviXudEg
+EPDKjvbdcbSmSAUN
+EPDKjvbdqcdiQNua
+EPCkKvbdbBVdfPpX
+EOcLKvbdrEFIpOVa
+DoDKjvbdDigivXjA
+DoDKjvbdYSlBMtPY
+DoDKjvbdrRtjnLAm
+DoDKjvbdKeegbApu
+DnbkKvbdHgHZyXxH
+EPCkKvbddwzUTrFz
+DnbjjvbduDCtwWPP
+EOcLKvbdaRfDHsfL
+EPCjjvbddeOqbWbj
+DncLKvbdOFDsiJLE
+EObkKvbdSBceMIyL
+EOcLKvbdrylQSaIO
+DncLKvbdJcJcQjCx
+EPCkKvbdaRfCgsek
+EOcKjvbdzitoocsU
+DoDKjvbdyzdnSIJI
+EObkKvbddndsLTsr
+DoDLKvbdcTDKtEKB
+EPCkKvbddZyQYYpb
+EPDLKvbdCIjakJFj
+DncLKvbdLrWlzVQz
+EOcKjvbdxrnIlqag
+DncLKvbddeOrCWcK
+DoCkKvbdRaceLiZL
+EPCkKvbddePSCXCj
+DoDKjvbdJpzFOeme
+DoCkKvbdiMFEOUby
+DncKjvbdUQqPVVHm
+EOcLKvbdcSbjscjB
+DnbjjvbdvPTzpjoU
+EPDKjvbdEPDLKvbd
+DncKjvbdvBEYsPEh
+DnbjjvbdIxTbIMQp
+DoDLKvbdZLrETnMN
+EPCkKvbdZxdJmbkr
+EPCjjvbdIidAKQHE
+DncKjvbdrSUjmjaN
+DnbkKvbdkaNOmALA
+DnbkKvbdiGjCyViu
+EPCjjvbdYkrDsmlN
+EOcKjvbdypoMhjXA
+DoCkKvbdiGjDZViu
+DoDLKvbdZxcinClS
+DoCjjvbdqUUGrSLU
+DnbkKvbdYTLaNUPY
+EObkKvbdehKurNpg
+EOcKjvbdmRyVZrdJ
+EObkKvbdZirhPgBf
+EOcKjvbdpyOggQcx
+DnbkKvbdfoazwEXh
+DnbkKvbdmuUzLJqf
+EPDLKvbdYlRdUOLm
+DncKjvbdRjyFuGjs
+DoDLKvbdQdDAopdS
+DoCkKvbdmSYtysEJ
+EObjjvbdQdDApRDr
+DoDKjvbdyOTHxShc
+EPDKjvbdptUHSRkU
+EOcKjvbdLGGHaaRV
+EOcLKvbdaaWFFopX
+DoCjjvbdlBMnmALA
+DnbjjvbdZnnIdeZj
+DoCjjvbdZMRdUNkm
+DoDLKvbdRMxByNtz
+EPCkKvbdJYTahMRQ
+DncLKvbdpyPIHQdY
+DoCkKvbdVBCRTRRy
+EOcLKvbdZyEKODLr
+EObkKvbdRadEkiYk
+EOcKjvbdcyyQXyRC
+DnbkKvbdVqnXadkc
+EPCkKvbdGKeTDIMu
+DnbkKvbdrRtjnKaN
+EObkKvbdFVxooljF
+DoDKjvbdDoCjjvcE
+DnbkKvbddneTLTsr
+EPDKjvbdGcjvKCKK
+EObjjvbdgPazvdYI
+DoDKjvbdSLYfVHKs
+DoCkKvbdEPCjkWbd
+DnbjjvbdmaivxPOV
+EObjjvbdJJdAJogE
+DoDKjvbdhkddNtby
+DoCkKvbdiCPDEwQq
+EOcKjvbdmajXYOmu
+DnbkKvbdqYngfqEY
+EOcKjvbdTppoUuIN
+EPDKjvbdNddThhkE
+DncKjvbdDnbkKvbd
+DnbjjvbdZRNEiNFR
+EPCjjvbdaaWFFopX
+EPDLKvbdBhjbKhej
+DoCkKvbdfpBzvcwh
+DoDKjvbdmSZVZrdJ
+EObkKvbdbAueGQQX
+EOcKjvbdNQXqWOGs
+EPCjjvbdvAcySndh
+EOcLKvbdySnImRag
+EObkKvbdSxLLmzkY
+DnbjjvbdcJMjLGXY
+EObkKvbdBsBDUFwS
+DoCjjvbdqlyjZLhJ
+EPCjjvbdliEURVRa
+DoDKjvbdptTgRrLU
+DncKjvbdiBoCdwQq
+EOcKjvbdEOcLLXDE
+EObjjvbdEYYLtTsl
+EPDKjvbdVTmTekuj
+DncLKvbdLFegbBQu
+EPCjjvbdmttzLKRf
+EPDLKvbdpfEFTuaI
+DncKjvbdiiegjMwr
+EObkKvbdxVNEqYlO
+DoCjjvbdRWnDblHc
+EPCjjvbdaSFbgtGL
+DnbkKvbdozmcjwoA
+DoDKjvbdPyNAHSrK
+DncLKvbdVqnXbEkc
+EPCkKvbdFWYpQNJe
+EOcLKvbdlYsRsZHU
+EOcLKvbdQvmcblID
+EObjjvbdRkYetfkT
+DoCjjvbdFjdsDINV
+EPCjjvbdrafNMGkZ
+EPDKjvbdczZQXxqC
+EPDLKvbdDwxLtTsl
+DoCjjvbdFpASvffZ
+DoCjjvbdiMEdOVCy
+DoCkKvbdelevfljL
+DnbjjvbdaSFcHtFk
+DncKjvbdBhkBkIfK
+EObjjvbdGKdsDHmV
+DncLKvbdhzUekqOG
+EOcLKvbdZshiZDrn
+DncLKvbdDjIJuwjA
+EPCjjvbdpxoHfqEY
+EPCjjvbdOAIrsjSA
+EPDLKvbdEuyPolie
+EPDKjvbdssRrxydc
+EPDKjvbdjlakzEgP
+DncKjvbdiUydwRuC
+DoCkKvbdZMSDtNkm
+EPDLKvbdbBVeGQPw
+EObkKvbdNHDPlpVL
+DoDLKvbdDjHiuxKA
+EPDKjvbdatbGwkUI
+DnbjjvbdeqaWzkbo
+DoDKjvbdvvlBWAuu
+EObjjvbdZirhQHBf
+EPCkKvbdDncLKvcE
+DnbjjvbdehKvSNpg
+DncKjvbdVwIwudFH
+DoCjjvbdNQYRVmgT
+EOcKjvbdNrtWGeUp
+DncKjvbdvvlAvAuu
+DnbkKvbdjKGHimXr
+EObjjvbdhkddNuDZ
+EPCkKvbdNddThhkE
+EPCjjvbdsPunjDVf
+EPDKjvbdxZgfFwdr
+DncKjvbdZyDjNblS
+EPDKjvbdjcMLQfuH
+DncKjvbdwtmFRZMO
+DncKjvbdVhXuwgYz
+DoCkKvbdVZITyjnn
+EPCkKvbdNrtWHEtp
+EPCjjvbdMfbomQUk
+EObkKvbddwyssqez
+EPCkKvbdhfjCyVjV
+DoDKjvbdtvOYJpsA
+DoDKjvbdiLdcnVCy
+EObkKvbdLrWlzUpz
+DoCkKvbdSPsgKFdX
+EPCjjvbdkNCLyeGo
+DncKjvbdCSaCtGWr
+DnbjjvbdRkZFtgLT
+DoCkKvbdVAaprprZ
+DnbjjvbdyXhibQZk
+DoCkKvbdsQVnibvG
+EPCjjvbduaDyTPFI
+DncLKvbdUaCRSpqy
+DoDLKvbdnPzYukZC
+DoDKjvbdRWnDcMHc
+EOcKjvbdxVNFRZLn
+EOcKjvbdRkZGUfkT
+DnbkKvbdvmWAMdEm
+EOcKjvbdmbKXYOmu
+EPCkKvbdyXiKCPyk
+DnbkKvbdkHgMFfOL
+DncKjvbdVYgtZkPO
+EPCkKvbdDnbkKwCd
+EObkKvbdKfGHaaRV
+EPCkKvbdqZOggQdY
+EOcLKvbdTlVnaVoJ
+DoCkKvbdhanbeWqR
+DnbkKvbdypoMiJwA
+DnbkKvbduMXvaUBX
+DoDKjvbddiirWUzn
+EObkKvbdqYoHgQcx
+DnbjjvbdFyUuBDwb
+DoCkKvbdKCicQjDY
+EPDLKvbdezvYeJTw
+EPCjjvbdSxKlNzkY
+DoDKjvbdQmYByOUz
+DnbjjvbdIGgZxxXg
+EPDKjvbdqmZjZLgi
+DncKjvbdmfeYMmgZ
+DncLKvbdGdLVibKK
+DoCkKvbdZGvdAOsJ
+EObkKvbdjSzhrkJz
+EPDLKvbddePRbWcK
+EObjjvbdDxXkstUM
+DoCjjvbdvlvANDeN
+EOcKjvbdrDdiQOWB
+DoCkKvbdmajXXoOV
+DncKjvbdUtMsekvK
+EOcLKvbdxxJKBoyk
+EPDKjvbdqYnhGpcx
+EObjjvbdatafwkTh
+DncLKvbdajkenmcA
+DnbjjvbdZQleImEq
+EPCjjvbdDncLKwCd
+EObjjvbdHELWKBij
+EPDLKvbdxrmhmRag
+DoCjjvbdwXMBWBVu
+EObjjvbdsPvOjCvG
+EOcLKvbdssSTZZdc
+EPCkKvbddndrkUUS
+EOcLKvbdNGbolotk
+EObjjvbdZMSDtNlN
+EObkKvbdZshiYcsO
+DncKjvbdDwxLsstM
+EOcLKvbdqZPIGqEY
+EOcKjvbdZRNFImFR
+EOcKjvbdrDeIonVa
+DnbjjvbdYzberKWZ
+EObjjvbdegjvRnQg
+DoCkKvbduDDUwWOo
+EPDKjvbdRotGjGEX
+EOcKjvbdKQyeOeme
+EPCjjvbdDwxMTtUM
+EObjjvbdpedFTvAh
+EPDLKvbdFxtuBDxC
+DoCjjvbdlqxtzSdJ
+DncKjvbdZLrDtOMN
+EPCkKvbdGdKujBjK
+DoCkKvbdezvYdiTw
+DnbjjvbdrEEiQOVa
+DncKjvbdOYPVzdOU
+DnbjjvbdxwiKCPzL
+EObkKvbdRpTgJecw
+DoCkKvbdwtmEpxlO
+EPDKjvbdqFceTuaI
+DncKjvbdsPuoJcWG
+DncLKvbdRyjHsCvA
+EPCkKvbdyXiJaoyk
+EPDLKvbdJvVFcdgJ
+DncLKvbdrXPlChxq
+EObjjvbdvBEZTOdh
+DoDKjvbdqvokcJYq
+EOcKjvbdlqxtzSci
+EPDKjvbdFkErbglu
+DoDKjvbdEPDLKvcE
+EObkKvbdijFhJlxS
+DoCjjvbdOFDtJJKd
+DnbkKvbdyXhiapZk
+DncKjvbdEXwlTtTl
+DncLKvbdZyEKOCkr
+DnbkKvbdqlyjYlIJ
+EObkKvbdIGfyxwxH
+DnbjjvbdyNrgxTIc
+DnbkKvbdeOeSkTsr
+EPCjjvbddZyPxZRC
+DncLKvbdkDMKpgUg
+EPDKjvbdfIKuqnQg
+EPCkKvbdhlFENuDZ
+DoDLKvbdiBoCdvqR
+EPCkKvbdySnImRag
+DnbjjvbdIxTahLqQ
+DoDKjvbdZnmhddyj
+EOcKjvbdgQBzwEXh
+EPDLKvbdfILWSNqH
+DncKjvbdjcMKqGtg
+EObkKvbdKQzEnfNe
+EPDKjvbdUQqPVVHm
+EObjjvbdREDBPpcr
+EObjjvbdnHExMnGy
+DnbkKvbdvBDxrndh
+DncKjvbdCEPaVimG
+DnbkKvbdGBPQxizm
+EPDKjvbdLqwMzVQz
+DnbkKvbdEPDLLXDE
+EPDKjvbdwWkaWBVu
+EObkKvbdxrnImSCH
+DncKjvbdsrqrxzEc
+DnbkKvbdpfDeUWAh
+EPDKjvbdjAQHApGj
+DoCkKvbdaSGChTfL
+DoDKjvbdiHJbxvKV
+EPDLKvbdlhdURUqa
+EPCjjvbdIwsahMRQ
+EObjjvbdGYtuBEYC
+DncLKvbdNeEThhkE
+EObkKvbdBvzdIePv
+EPCjjvbdbAueFpQX
+EOcLKvbdjAQGaQGj
+EPCjjvbdNHDQNPuL
+DncLKvbddoFSkUUS
+DncKjvbdACqxJzIp
+DnbkKvbdxLWcgzyf
+EPCkKvbdTlVnaWPJ
+DoCkKvbdCJKbLIfK
+DoCkKvbdDwxMUTtM
+EPCkKvbdEPDLKwDE
+EOcLKvbdTvMQKTaR
+EOcLKvbdeXytTrFz
+EPDKjvbdNUrrLNAX
+DnbkKvbdZjShPgBf
+EObjjvbdjAPfaQGj
+EPCkKvbdYlRdUNlN
+EPDKjvbdzjUoocsU
+DoDLKvbdKDKCqJbx
+EPCjjvbdQvnECkhD
+DnbkKvbdGckVjBij
+EObjjvbdXmqAXuVt
+EPCjjvbdeFPRavcK
+DoDKjvbdEYXlUTsl
+DoCjjvbdXrlBNToY
+DoDLKvbdrRuLNkAm
+DncLKvbdDxXlUTtM
+EOcKjvbdwuNEqZLn
+EPDKjvbdEOcLLWbd
+DoCkKvbdpfDdtVaI
+EOcKjvbdmpZyVjyC
+EOcKjvbdtSrSxzFD
+EObkKvbdsBemLfjy
+DoCjjvbdUGznMWue
+DncLKvbdbAvEfPpX
+DnbjjvbduCcUwVno
+DoDLKvbdTppoUuIN
+DncKjvbdYqMeImEq
+DoCkKvbdrDdhomvB
+EObjjvbdgFkzOGgA
+EPDKjvbdSwjkmzjx
+DoCjjvbdREDBPpcr
+EObjjvbdYkrDtNlN
+EObjjvbdZisHogCG
+DncKjvbdUtMselWK
+DoDKjvbdkHfkeemk
+DncLKvbdSLYeuHLT
+EOcLKvbdeFOrBwCj
+EObjjvbdHDjvKCJj
+DnbkKvbdkIGkeemk
+DoCkKvbdZQmFJMeR
+DoCkKvbdqTtGrSKt
+DncLKvbdcIljKfWx
+DnbjjvbdRjxfUgKs
+DnbkKvbdhyuFlROG
+EObkKvbdpxoHfpdY
+DoDKjvbdhuZdwRtb
+DnbkKvbdBdQAvKMf
+DoCkKvbdVTlsekuj
+EObkKvbdCJLBkIfK
+EOcKjvbdmgFYNNgZ
+EPDLKvbdxrnImRag
+DoCjjvbdbKlGPODA
+DoCjjvbdMoxRVmgT
+EPDLKvbdKfGIBaRV
+DoDKjvbdSCEElJZL
+EPCkKvbdmRxtzSdJ
+EPDKjvbdjKGIKNXr
+DnbkKvbdlhdTptrB
+EPDKjvbdBcoaVilf
+EPDKjvbdRzKIScWA
+EOcKjvbdnHFXmOGy
+EPCjjvbdFfJrNhtR
+DnbkKvbdzaAPHHCM
+DnbkKvbdwXLaWBWV
+DoDKjvbdKeegaaQu
+EPCjjvbdRotHKFcw
+EOcKjvbdnGeXmOGy
+DoCjjvbdmIdTqVRa
+DncLKvbdfNGWgMik
+EPCkKvbdrovPJbuf
+EObkKvbdEvYpPljF
+DncLKvbdOYPVzdOU
+EObjjvbdrzLosAhO
+DnbjjvbdyzdnSIJI
+EOcLKvbdIsZArmYM
+DoDLKvbdvAdZTPEh
+DoCkKvbdQvnDcMHc
+EObjjvbduMYWaUBX
+DncKjvbdUyHszLOn
+EPCkKvbdbrbjscia
+EObjjvbdTkunaVni
+EObkKvbdeATpmYKG
+EOcKjvbdqUTfqrLU
+EPDLKvbdGYttaDxC
+EPDKjvbdRNYByNtz
+DncLKvbdADRwizJQ
+DncLKvbdKfFgaaQu
+EPDKjvbdxZhGGYFS
+DncLKvbdwtmFRYlO
+EOcLKvbdehLVrNqH
+DnbkKvbdKxpirztf
+DoCjjvbdZxdKNcLr
+DoDLKvbdrbFmMGjy
+DoDLKvbdqYnhHQcx
+EPCjjvbdGKeTDIMu
+EPCjjvbdZRNEhleR
+DnbkKvbdfMfXGmJk
+DnbjjvbdRjyGVHKs
+EPDKjvbdZHXEAOri
+EObjjvbdxnTIYTIc
+DnbjjvbdTpqOttgm
+EOcLKvbdWXIwuceH
+EOcLKvbdzROmJKXA
+EPCkKvbduCbtwWOo
+DncLKvbdJTZBTMwl
+EObkKvbdlqyUysDi
+DnbjjvbdrpVoJcWG
+DoCjjvbdHDjvKCKK
+EObkKvbdVwJXvDeH
+EPDKjvbdZsiJZDrn
+DoCkKvbdhfjDYvJu
+DoDLKvbdZyEJmcLr
+DnbjjvbdmajXXoOV
+DoCkKvbdelewGmKL
+DoDLKvbdUtMsfMVj
+EOcKjvbdegjuqmpg
+DnbkKvbdZMRctNkm
+DncKjvbdhlEdOUcZ
+DoDLKvbdqAiFAXIE
+EObjjvbddBsMrAUN
+EPDKjvbdaSGDHtGL
+DnbjjvbdbVCGwjtI
+DncLKvbdzdzOzeZp
+EPDKjvbdKQyePFnF
+EPDLKvbdauBgXjtI
+EPDLKvbdCSaCtGWr
+DnbkKvbdbsCjtEKB
+DoDKjvbdCWzdIeQW
+EPCkKvbdRbDeLhxk
+EObjjvbdOEctJIkE
+DoCkKvbdSPtGiedX
+DncKjvbddZyPxZRC
+DnbjjvbdTukpKUBR
+DoCjjvbdpstHRqkU
+DncKjvbdNdctIhjd
+EOcKjvbdUWMPjTaR
+DoCkKvbdLGGHbApu
+EObjjvbdmozZWLZC
+EObjjvbdULvPAvOi
+EPDLKvbdcJMikFvx
+DncLKvbdjJfHjMxS
+EPCjjvbdqYoIHREY
+DoCjjvbdiifHjNXr
+EObkKvbdZLrETnMN
+DnbkKvbdtSqsYydc
+EPDLKvbdCIkCLJFj
+DoCkKvbdliDsqUrB
+DnbkKvbdNPxQumgT
+EPDKjvbdACrYJyiQ
+EOcLKvbdYTMBMtOx
+DoDLKvbdNGcQNPtk
+DncKjvbdtbbtvuno
+DncKjvbdZLrEUNlN
+DoCkKvbdaogHELzd
+DoCjjvbdgFlZmfgA
+EPCjjvbdvPTzpkOt
+DoCjjvbdjKGHjMxS
+EPDLKvbdauBgXjsh
+EOcLKvbdiBoCeWpq
+EObkKvbdSPsfjGEX
+DnbkKvbdzGxlAMeX
+DoDLKvbdqFcdtWAh
+EPCkKvbdOYOuzcmt
+DoCjjvbdDwxLtUTl
+DnbkKvbdOTUVgFUp
+DnbkKvbdiGibyWJu
+EPCjjvbdUyITzLOn
+DoCkKvbdbLMFnnDA
+DoCjjvbdDwxLsssl
+DncLKvbdBiLBjhfK
+EPDKjvbdNPwpvOGs
+EObkKvbdzQnliKXA
+DoCjjvbdeYZssqez
+DoCjjvbdeATplxKG
+EOcLKvbdRyjIScWA
+EPDKjvbddeOqbWcK
+EPDLKvbdACrXjZhp
+DnbjjvbdmuVZkKSG
+EPDKjvbdVqmwbFLc
+EPCkKvbdCSaCtFwS
+DnbjjvbdVZHszLPO
+DoDKjvbdVrNxCFLc
+EOcKjvbdegjuqnQg
+EPCjjvbdZMSETmlN
+EOcKjvbdHDjvKBjK
+EPCkKvbdyOTIXsJD
+DoDKjvbdnQZyWKxb
+DncLKvbdxwhiaozL
+DncLKvbdNdcshhkE
+EPCjjvbdXnRAYUut
+DoDLKvbdNsUWGeUp
+DncKjvbdWHwuwfxz
+DnbkKvbdRpUGifEX
+DnbjjvbdEOcLKwCd
+EPDKjvbduaEYsOeI
+DnbkKvbdjhHLfFnL
+DncLKvbdZoOJEeZj
+EPCkKvbdEPCjjvcE
+EObjjvbdxUldqYkn
+EObkKvbdOEdThiLE
+DnbkKvbdjcMKpgVH
+EObjjvbdkIGkeenL
+DncKjvbdZsiJZDrn
+EPCkKvbdxnShXsIc
+DoDKjvbdZnmiEdzK
+DoCkKvbdVTmUGLvK
+EOcLKvbduCcVXVno
+EObjjvbdZQleJNFR
+EObjjvbdFejRmhsq
+EPDLKvbdaMkBruNH
+DoCkKvbdNQXqWNgT
+DoDKjvbdjuwNcbXw
+EPCjjvbdSBceLiYk
+DoCjjvbdMgColpVL
+DoDLKvbdVZHtZkPO
+DoDKjvbduMYXBUAw
+EPDKjvbdNeDshiKd
+DoDKjvbdTAFJICPE
+EObjjvbdJvVFceGi
+EObjjvbdNHCpMpUk
+DnbkKvbdijGIKNYS
+DoDLKvbdDncKkXCd
+DncKjvbdkMakyeGo
+EObkKvbdjKFgilwr
+DoCkKvbdOhAXyAZB
+DoCkKvbdUGznMWvF
+EOcKjvbdRosfifEX
+EPDLKvbdfNFvgMjL
+EObkKvbdxxJJbPzL
+EPCjjvbdQlxCYmtz
+EOcLKvbdgPazwEXh
+DoDLKvbdkySrTYft
+DoDLKvbdhgKDYuiu
+DoDKjvbdYkrETmkm
+EObjjvbdNPwpunHT
+EOcLKvbdYlRdUNlN
+DnbkKvbdZLrDtOLm
+EObjjvbdxrnJMrCH
+EObjjvbdZnnIeFZj
+DoCjjvbdzRPMhiwA
+DncKjvbdssSSxyeD
+EOcLKvbdjAPgAofj
+DncKjvbdRosfifEX
+DoDKjvbdEXwktUTl
+DnbjjvbdWRmwadkc
+EPDLKvbdeEoRavbj
+DoDKjvbdXsMBNToY
+DnbkKvbdVqmxCFLc
+EOcKjvbdkVwOEBww
+DoCjjvbdfNGXGmJk
+EOcLKvbdmtuZjiqf
+DoCkKvbdnPyyWKyC
+EObjjvbdJpydoGNe
+DnbkKvbdjJfHimYS
+DoCkKvbdyXhjBozL
+DoCjjvbdkIHLeenL
+EOcLKvbdTAEiIBoE
+DnbkKvbdvBDxsPFI
+DncKjvbdlhdTpuRa
+EObjjvbdFfJqmiUR
+EPCjjvbderAvzkbo
+DncLKvbdwygeexEr
+EObjjvbdSBdElJZL
+EOcKjvbdySmiMrBg
+EPDKjvbdatbGwkTh
+DncKjvbdnBivwnmu
+EPDKjvbdFxuVAdYC
+EPDLKvbdqlzJyMHi
+EPDKjvbdZRMdhldq
+DoCjjvbdNeDtIhkE
+DoCkKvbdfMewGlik
+EOcLKvbdhaoDEwQq
+DnbjjvbdIwsagkqQ
+DncKjvbdkIHMGFnL
+DoDLKvbdGdKuibKK
+DnbjjvbdTAEiICOd
+DncLKvbdNeEThiKd
+EObkKvbdYpmEiNFR
+EPDLKvbdFkFTDHlu
+DoCkKvbdkDLkRHUg
+DnbkKvbdyYIjCPyk
+DncLKvbdFVyQPmKF
+DnbjjvbdZQldhldq
+DoDKjvbdVqnYBdkc
+EPDKjvbdSKxeuGkT
+EPCjjvbdiZuGLqNf
+DnbjjvbdJTZArmXl
+DnbkKvbdyNrgwrhc
+EOcLKvbdrNZiyLgi
+DncKjvbdSBdFMJZL
+EPCkKvbdfMfWfmKL
+EPDLKvbdfMevfljL
+DoCjjvbdmIcsqVRa
+DoDLKvbdrEEhpOVa
+EPDLKvbdZRMeImEq
+DoDLKvbdyTNiMrBg
+EPCjjvbdsQVnibvG
+EOcKjvbdvBDxsPFI
+DoDKjvbdqquKnKaN
+DncLKvbdqGDeTuaI
+EPCkKvbdZdxGzgiC
+DoDKjvbdkDLkQftg
+DoDKjvbdePEsKtUS
+DoDKjvbdUxgtZjoO
+DncLKvbdxUmFRYlO
+DnbjjvbdwuMeRYkn
+DoCkKvbdRWmdClID
+EPDLKvbdCDpBWJlf
+DncKjvbduaEYrneI
+DnbjjvbdfHkVqmpg
+EPDKjvbdKxpirzuG
+DoDLKvbdZLqdUNkm
+DoDLKvbdDwxMTstM
+EOcKjvbdrzLosAhO
+DnbjjvbdqZPHgQdY
+EObkKvbdjggMFfNk
+EPCjjvbdZMRcsmkm
+EObjjvbdEJgiuxKA
+DncLKvbdZtJJZDsO
+EObkKvbdRjxeuGkT
+DncKjvbdqdFJPmua
+DoCkKvbdGYtuAcxC
+DoCjjvbdZnmheEzK
+DoCkKvbdKWUfEFGi
+DoCkKvbdfMfXGmKL
+DnbjjvbdjvWmcbXw
+DnbkKvbdyzeORhJI
+EPDLKvbdpstHRqjt
+DoDKjvbdTukpKUAq
+DoDKjvbdSPtGjFcw
+DncKjvbdWSNxCFMD
+DnbkKvbdjlalZdgP
+EOcLKvbdkxsRsYgU
+EObjjvbdLFfICApu
+DoDKjvbdCEQBWKMf
+DoDKjvbdbAvFFpQX
+DoCkKvbdhgKCxvKV
+DncLKvbdjcMLQgVH
+EPCkKvbdzitpQDrt
+EOcKjvbdNVTRjmAX
+EPDKjvbdkxsRsZHU
+DoDKjvbdKDJcRKCx
+EPDKjvbdFjeScHmV
+EPCkKvbdZjTIQHBf
+DnbkKvbdlqyUyrdJ
+DoDKjvbdehKurORH
+EObjjvbdbKlFoODA
+DoCkKvbdwtmFQyMO
+DoCjjvbdXnRAYUut
+DoDKjvbdxsOIlqbH
+DncLKvbdyNsIXrhc
+DoDLKvbdCEQAvKNG
+DncKjvbdRotHJedX
+EPDLKvbdVZHsyjoO
+DnbjjvbdkCkkRHVH
+DoDKjvbdRWmcblHc
+DncLKvbdqvokbiYq
+DoDLKvbdRkZGVHLT
+EObjjvbduCbuXVno
+DoCkKvbdEJgivYKA
+DoDKjvbdkWWnDbYX
+EPDKjvbdnGdxMmfy
+DoDLKvbdIHGzYxYH
+DoDKjvbduCbtwVno
+EObkKvbdqlyjYkgi
+EObjjvbdVwIwudEg
+DnbjjvbdfRaWzkcP
+EPCkKvbdEARhlzXX
+DnbkKvbdfMevfmJk
+DncLKvbdZyDjNcLr
+EOcKjvbdtAHQhABS
+DncKjvbdkClKqGtg
+DoCkKvbdEObkLXCd
+EObjjvbdFkFTDINV
+EOcKjvbdEztQdkcJ
+DoCkKvbdKaLHNBxR
+EPDLKvbdhaoCdvqR
+EObkKvbdrJAJdmOe
+EObjjvbdrpVnjCuf
+EPCkKvbdFjeTCglu
+DoCjjvbdqdEiPnWB
+EPDKjvbdGFirOJUR
+EPCkKvbdJmADzHUa
+EPCjjvbdWWhwucdg
+DncLKvbdBhkBjiFj
+DoCkKvbdSZihSbvA
+DncKjvbdZtIiZETO
+EPDLKvbdCTAcUGXS
+DoDKjvbdVqmxCFLc
+DncLKvbdmajWwoOV
+EPDKjvbdVhYVxHYz
+DoDLKvbddoFSjtTr
+DoDLKvbdrzMQTAgn
+DoCjjvbdUVlPjUBR
+EPDLKvbdtvOXipsA
+DoCjjvbdrouoKCvG
+EObkKvbdOSsufdtp
+EPDLKvbdIGfzZXxH
+EObkKvbdbQGgDkzd
+DoCkKvbdOFDtJIkE
+EPCjjvbdiHJbyWJu
+DnbjjvbdLAkHMaxR
+EPCkKvbdJTZBTMwl
+DncLKvbdSQTfjGEX
+EOcLKvbdlrZVZrci
+EObjjvbdkyTSTZHU
+EPCjjvbdxUleQxkn
+EPDLKvbdEKIKWYKA
+DoCkKvbdZHWdAPSi
+EPDLKvbdxVNFRZMO
+EPDLKvbdcSbkTcjB
+DoCkKvbdlYsSTZGt
+EPDKjvbduaDxroFI
+EObkKvbdNHDQMouL
+DoDLKvbdxrnJMqbH
+DnbjjvbdmfeXmOGy
+DoDKjvbdidkGtoAO
+DnbjjvbdGYtuBEXb
+DnbjjvbdRECaQQdS
+DoCkKvbdmajXXnnV
+DncKjvbdZMSEUNlN
+EPCkKvbdZtJIxcrn
+DncLKvbdJpydneme
+DncKjvbdVviYWEEg
+DoDLKvbdyXhjBoyk
+DoCjjvbdbhlikGXY
+DnbkKvbdVviXudFH
+EPCkKvbdYTMAlsnx
+EPCjjvbdxZhFeweS
+DoCjjvbdyNsIXriD
+DoDKjvbdznoqEcMY
+DnbjjvbdauCHXjtI
+DncKjvbdIsZAsMwl
+EPCkKvbdZMSDtOLm
+DnbkKvbdJqZePFme
+EPDKjvbdkHfkeenL
+DoDLKvbdaNLCStmH
+DncLKvbdIwsbHkqQ
+EObkKvbdfHjvRnRH
+EPCjjvbdlqyVZsDi
+EObkKvbdEuxoolie
+DoDKjvbdjAPgAofj
+EOcLKvbdjcMLRHVH
+DncKjvbdjKFgjNXr
+EPCkKvbdmIctQuRa
+DncLKvbdJpyePGOF
+DncLKvbdNGbpMouL
+EObkKvbdpfDdsuaI
+EPCjjvbdyzeORhIh
+DoDKjvbdrDdhpNua
+DoCjjvbdFfKRmhtR
+EPDLKvbdpfEEsuaI
+EPDLKvbdqcdhpOVa
+EPCjjvbdVYgsykPO
+DoDLKvbdDncLLXCd
+EObkKvbduaEYroEh
+EOcLKvbdkNBlZeHP
+EObjjvbdGcjvJajK
+DncLKvbdrpVoJbuf
+EObjjvbdEKIJuxKA
+DncKjvbdZxcjODMS
+DncLKvbdmgFXmOGy
+DoCkKvbdUMVoAuoJ
+DoDKjvbdqcdiQNua
+DnbkKvbdbrcKtDia
+DnbkKvbdKfFgbApu
+DncKjvbdezvZEiTw
+DnbkKvbdlqxtzSdJ
+DoCjjvbdOTUWGeUp
+EPCkKvbdJXtBhMQp
+EOcLKvbdOAJTTjSA
+EOcKjvbdfILVrNpg
+EOcLKvbdnQZxvLZC
+EPDKjvbdyYJJaoyk
+DnbjjvbdkMakzFHP
+DnbjjvbdjbkjpfuH
+DoCkKvbdgGLymfgA
+DoDLKvbdJYUBhLpp
+EPCjjvbdJSyBTMxM
+DnbjjvbdyTNiMrBg
+DnbkKvbdqYoHfpdY
+EOcKjvbdZyEKNcLr
+DoCkKvbdZtIiYcsO
+EPCkKvbdZQmFJNFR
+DncKjvbdSPsgKFdX
+DoCjjvbdvwMAuaWV
+EPDKjvbdHfgZxxYH
+EObkKvbdrSUjnKaN
+DnbjjvbdKWVGEFGi
+DncKjvbdsPvOjDWG
+EPDKjvbdhzVFkqOG
+DoDKjvbdssSSyZdc
+DoDKjvbdYkqcsmlN
+EPCjjvbdYpldiNFR
+DncLKvbdemFwGlik
+DoDLKvbdjuvmdBxX
+DoDKjvbdCTBDTewS
+DoCkKvbdKeehBaQu
+EObkKvbdwyhFexEr
+DoDKjvbdQvmccMID
+DoDKjvbdVviYVceH
+EPCkKvbdmRxtyrdJ
+EPDLKvbdYqMeJNFR
+EPCkKvbdRbDeMIxk
+EPCkKvbdcJMjKfXY
+DnbkKvbdVwIwvDdg
+DnbjjvbdIwtCHkpp
+DncLKvbdczYpYYqC
+EPCkKvbdKaLGmBxR
+DncKjvbduLwwAsaX
+DncLKvbdssRrxzEc
+EObjjvbdrXQMCiZR
+DnbkKvbdZRNFImFR
+EOcKjvbdACqwjZhp
+DnbjjvbdbKlGOmcA
+EObjjvbdGFirOJUR
+EPDLKvbdqvokbiYq
+EOcKjvbdJmAEZgUa
+DoCkKvbdbhljKevx
+EPCjjvbdbKlGPNcA
+EOcKjvbdRMxByOUz
+EOcKjvbdbsDLUEJa
+EPCkKvbdRacdlJZL
+EObkKvbdmuUyjjSG
+EObkKvbdjKFgjNXr
+DoDLKvbdlhctQuRa
+DoCkKvbdjKFhKMxS
+EObjjvbdpedEtVaI
+EOcKjvbdIwtBhLpp
+DnbjjvbdZHWdAPSi
+EOcLKvbdiLdcmuCy
+EOcLKvbdjcMLRGuH
+EPCjjvbdRbDdkiZL
+EOcKjvbdiHJbxvKV
+EOcLKvbdaSGDHsfL
+DoCkKvbdjKFhJlwr
+DncKjvbdiBoCeWqR
+EOcLKvbdegjvSNpg
+EOcLKvbdrbGMlHLZ
+DnbjjvbdBraDUGXS
+DncLKvbdFeirOIsq
+EPDLKvbdhytekpmf
+EOcKjvbdIsYaTMwl
+DnbkKvbdrSVLOKaN
+DoCkKvbdTIyjRABM
+EOcLKvbdsBfNMGkZ
+EPDLKvbdUtNTfMWK
+EObkKvbdRjxeuGjs
+EObkKvbdTqQnuVIN
+EObjjvbdhuZdwRuC
+EOcLKvbdqTtHSSKt
+DncKjvbdmpZxvLZC
+DoDLKvbdlAloNALA
+EPDKjvbdiLddOUby
+EPDLKvbdwuMdpxlO
+DncKjvbdNrsvHEuQ
+EPCkKvbdyOSgxTJD
+EOcLKvbdIryArlxM
+EPDLKvbdZHXEAPSi
+EPCjjvbdSCDdlIxk
+EOcKjvbdySnJNSCH
+DnbjjvbdijGIKNXr
+EPDKjvbdVAaqTRSZ
+EObjjvbdkxsSSxft
+EPCkKvbdnUtzKiqf
+EPCkKvbdlqxuZsEJ
+EObjjvbdEXxMUUUM
+EPCkKvbdLFfIBaQu
+DnbjjvbdrRtkNjaN
+DoCjjvbdNHCpMpUk
+EPDKjvbdZjTIQGaf
+EPCkKvbdHELWJbKK
+DoDKjvbdJbibpjCx
+DnbjjvbdJSyArmYM
+EPCjjvbdfNFwGmJk
+EOcLKvbdYTMBMsnx
+DoDLKvbdyTOJMqbH
+EObjjvbdEPDLLXDE
+DncLKvbdkyTSTZGt
+EObjjvbdGBPRYizm
+DoCkKvbdVviXvDeH
+DncKjvbdsQWOicVf
+DoCkKvbdfHjvSNqH
+DncKjvbdlZTSSxft
+DncKjvbdFVyPolie
+EPCjjvbdRXODblID
+DoCjjvbdlhcsqVSB
+DncLKvbdqYnhGqDx
+EObjjvbdFeiqmiUR
+DnbjjvbdKefHaaQu
+DoDKjvbdRNXbYmtz
+EOcKjvbdNwnuzcmt
+DoDLKvbdXFxytAPT
+EPDLKvbdOTUVfdtp
+DoCjjvbdraelkfkZ
+DncKjvbdXsMAltPY
+DoDKjvbdVUMsfLuj
+EPDLKvbdZisIPfbG
+EPDKjvbddZxpYYqC
+DnbkKvbdzjUopESt
+DnbkKvbdVUMtGMVj
+DncLKvbduCbtwWOo
+EObkKvbdaaVeFpPw
+DncKjvbdKNADzGta
+DncKjvbdeEoSCXCj
+EObjjvbdhancEvqR
+EObkKvbdKCicQibx
+DncLKvbdijGHjMwr
+DoCkKvbdziuPpETU
+DoCjjvbdiBnbeXRR
+DoCkKvbdZQmEiMdq
+EObkKvbdrMyjZMHi
+EOcKjvbddoErkTtS
+DoCkKvbdtkwvaUAw
+EPDLKvbdTlVnaVoJ
+DncKjvbdfHjurOQg
+DoDLKvbdWWiXvEEg
+EPCkKvbdqdEhpNua
+EOcLKvbdYSkaMtPY
+EPCkKvbdxmsHxTIc
+DnbjjvbdJqZdnenF
+EPDKjvbdWexzUAOs
+EOcLKvbdrovPKCuf
+DoDKjvbdkxsSSyGt
+Dnbjjvbdzdynzdyp
+EOcLKvbdHEKvJbJj
+EObjjvbdOStWHEuQ
+DnbjjvbdkyTRsZGt
+DoCkKvbdcJNKKevx
+DoDKjvbdSPtGifDw
+EObkKvbdGdLVibKK
+DnbjjvbdbBVdfPow
+DncKjvbdhtyeXSVC
+EPDLKvbdptTfrSLU
+DncKjvbdjvXODaww
+DncKjvbdqZOgfqDx
+DncLKvbdTJZjRABM
+EOcLKvbdTpqPVUhN
+EOcKjvbdRWmdClID
+DoCjjvbdqquLOLAm
+DoCjjvbdFfJqmiUR
+EOcKjvbddBsMrATm
+EOcKjvbdYzcFrKVy
+EPCjjvbdsZlQSaIO
+EPCkKvbdkHfkeenL
+EOcKjvbdiHJcYuiu
+DoDKjvbdCEPaVilf
+DoCjjvbddBrmSAUN
+EPDLKvbdSPtGifDw
+EOcLKvbdAMhYrvyx
+DncLKvbdTIyjRAAl
+EOcLKvbdZtIhyESn
+DnbjjvbdVUNUFlWK
+EOcKjvbdyXiJaoyk
+EPCkKvbdDncLKvbd
+EOcLKvbdKWVFcdgJ
+EPDKjvbdnQZxvKyC
+DncKjvbdjJehJlxS
+DoDKjvbdRkYfVHKs
+EPDLKvbdirzhsLJz
+EObkKvbdVUMtFkuj
+DnbjjvbdqwPkbiYq
+EPCjjvbdIGfzZYXg
+DoCkKvbdlYsRryGt
+EObjjvbdpfDeUWBI
+EOcKjvbdwtldpxkn
+DoCkKvbdzitopETU
+DoDKjvbdJuuGEEfi
+DnbkKvbdnPzZVkZC
+EOcKjvbdmfeYMnGy
+EPDKjvbdkIGlGGNk
+DncKjvbdezvZEhtX
+EPDKjvbdqqtjmkAm
+EPDLKvbdzRPNIiwA
+DoCkKvbdGKeSbgmV
+EPDLKvbdmJETqVSB
+EPDKjvbdbVCGwkTh
+DoCjjvbdBhkBkIej
+EOcLKvbdbBWFFopX
+DncLKvbdjggLfGOL
+EPCkKvbdzQnmIiwA
+EOcLKvbdhbPDFWpq
+EPDLKvbdkClLQgVH
+EObkKvbdrWpMChyR
+DncKjvbdMfbpNPuL
+DnbjjvbdNsUVfeVQ
+EOcKjvbdaRfDHtFk
+DoDKjvbdRbEFLhyL
+EOcKjvbdmIcsqUqa
+DncKjvbdFVyPpNJe
+DoCjjvbdLAjgMaxR
+EOcLKvbdypoNJKXA
+DncLKvbdEztRFMCi
+DoCkKvbduVmwiqTA
+EObkKvbdUyHsykPO
+DoCkKvbdhzUfLqNf
+EPCjjvbdiUzEvqtb
+EPDKjvbdpfDeTuaI
+EPCkKvbdSwjkmzjx
+DncLKvbdjKFgjMwr
+EOcLKvbdRWnECkhD
+EOcKjvbdZoOJFEyj
+DnbkKvbdvvlAvAvV
+DncKjvbdZLqcsmlN
+DncKjvbdyqOliJwA
+EPCkKvbdKWUedEfi
+DoCkKvbdePEsLTtS
+DnbkKvbdtcDVXVoP
+EPCjjvbdKCjCpicY
+EObkKvbdZdwfzhJC
+EPDLKvbdBhjajiGK
+EOcKjvbdJXsahMRQ
+DoCkKvbdZxdKNcLr
+EPDKjvbdnBjWwoOV
+DncLKvbdapGgDkzd
+EPDKjvbdjmCLzEgP
+EPCkKvbdWRmwbFMD
+DnbjjvbdBdQAujMf
+EObkKvbdzjUpPcsU
+DoDLKvbdwtmFQyMO
+DoCkKvbdiMEcmtby
+DncKjvbdSBcdkiYk
+EPCkKvbdfSBWzkbo
+EOcLKvbdxVMeRZLn
+DnbjjvbdCSaDUGXS
+DncKjvbdZtJIyETO
+EPCkKvbdTkvOaVni
+DnbkKvbdkySqsYft
+EPCjjvbdxsOJMrCH
+EPCjjvbdCWzdJEov
+EPCjjvbdEARiMywX
+EObkKvbdxsNiNSCH
+DncLKvbdhbPDFWqR
+EObkKvbdVUNUFlVj
+EObjjvbdXrlBNToY
+EOcLKvbdfHjvSOQg
+EPCjjvbdwWkaWAuu
+DncKjvbdbKlFnnDA
+EPCkKvbdRkZFuGkT
+EPCjjvbdMowpvNfs
+DncLKvbdmtuZjjSG
+DnbkKvbdiCPDEvqR
+DncLKvbdbAudfPow
+DnbjjvbdFjeSbhMu
+DncKjvbdSQTfjGEX
+EPDKjvbdbAueGQQX
+DnbkKvbdjKGIJmXr
+EOcKjvbdIryBTNYM
+EPDLKvbdmgEwlnGy
+EObjjvbdSBdEkhxk
+DoCjjvbdfMfWgMjL
+EPDLKvbdEObjjwCd
+EObjjvbdhzUekqOG
+EObjjvbdWSNwbElD
+DoDKjvbdrNZjYkhJ
+DoCkKvbdRkYfUgKs
+EObjjvbdczYpYZRC
+DoCkKvbdzoQQeDMY
+DncKjvbdFxuVBEXb
+DoDKjvbdSiZjRABM
+DoDLKvbdYzbfRivZ
+EPDLKvbdlqyUyrdJ
+EOcLKvbdtbbuWvOo
+DncKjvbdSKxfVGkT
+DoCjjvbdEXxLtUTl
+EOcLKvbdEPCjkWbd
+EPDLKvbdEObkLXDE
+EPCkKvbdxKvdHzzG
+EPDKjvbdpfDdtVaI
+DoCjjvbdbAueGPpX
+DoCjjvbdZMRdUOLm
+DoDLKvbdwtmFRYkn
+DoCjjvbdNPwpumgT
+DoCkKvbddijSWUzn
+DoDKjvbdJXsbHkqQ
+DnbjjvbdxZhFexEr
+DoCjjvbdSQUHJedX
+EPDLKvbdjmCMZdgP
+DncLKvbdMfbomPtk
+EOcLKvbdqTtHRqjt
+EPCkKvbdqceIpNvB
+DncLKvbdFxtuBDxC
+EPCkKvbdxVNEpyLn
+EOcKjvbdYzbeqivZ
+DoCjjvbdNdcsiJLE
+DoDKjvbdzjVQQDsU
+EObjjvbdvBDySneI
+DoDKjvbdBhjbKhej
+EPDLKvbdWSOYBdlD
+EOcKjvbdOYOuzcnU
+EPCkKvbdkCkkQgVH
+DnbkKvbdtlXwBTaX
+DnbkKvbdTppoVUgm
+DoCjjvbdQmXaxnUz
+DncKjvbdkHfkfFmk
+EPCjjvbdmgEwlnHZ
+EPDLKvbdZdxGzhJC
+EPCkKvbdmIdTqUqa
+DoDKjvbdzGyMAMeX
+DnbkKvbdTppnuUhN
+DoCjjvbdSLYfUgLT
+DnbkKvbdZsiJZETO
+EObkKvbdNUrqjmAX
+EObjjvbdZyDimcLr
+DoCkKvbdRDbaQRDr
+DnbjjvbdbAudfPow
+EPDKjvbdZjTHpGaf
+DoDKjvbdqwQLcIxq
+DnbjjvbdZLqdTmkm
+DoDKjvbdyXiKCPzL
+EObjjvbdssSTYyeD
+DoCjjvbdddoRawCj
+DoCjjvbdkMbLydfo
+DoCjjvbdVTmUFkvK
+DoCjjvbdhyuFkpmf
+EObkKvbdlYsSSyGt
+EPCjjvbdtvNxKQsA
+DoDKjvbdRpTgKFdX
+EObjjvbdjbkkQgVH
+DnbjjvbdaNLCStlg
+EOcKjvbdDxYLsssl
+DoCjjvbdfNFvgMjL
+DncLKvbdrovPJcWG
+DnbkKvbddoFSjssr
+DnbjjvbdSQTgKGDw
+DoCjjvbdQvnEDLhD
+EOcKjvbdUxhUZkOn
+EPCjjvbdEzsqFMDJ
+DoDKjvbdGdKuiaij
+EOcKjvbdxrnJMrCH
+DnbjjvbdUWMQJtBR
+EObkKvbdEKHivYKA
+EPDLKvbdYSlAltOx
+DnbjjvbdbVCHXjtI
+DnbkKvbdtkwwAtBX
+DoCjjvbdZQleJNEq
+EPDKjvbdEPCjjvcE
+EPCjjvbdCSaDUFwS
+EPDKjvbdHELViajK
+DoDLKvbdijFgjNXr
+DncLKvbdjmCLydfo
+EObkKvbddZyQXxqC
+DnbkKvbdySnImSCH
+EPCjjvbdqmZjYkgi
+EPCjjvbdGFirNiTq
+DoDKjvbdRXNdDMID
+DncLKvbdMfcQNQUk
+EOcLKvbdZdwfzghb
+EPDLKvbdULuoBWOi
+EObjjvbdFyVUaDwb
+DoCjjvbdNQXpumfs
+DnbkKvbdrWolDIxq
+EPCkKvbdBvzdIeQW
+DnbkKvbdfIKuqmpg
+EOcKjvbdnBiwXoNu
+EObjjvbdiHKDZWKV
+EPCjjvbdZLqdTnLm
+DoCjjvbdlYsSTYgU
+EPDLKvbdsBfNMHKy
+DnbkKvbdjuvmdCXw
+EPDLKvbdRDcBQQdS
+EOcKjvbdySmhmRbH
+EPDLKvbdbrbjscia
+EPDLKvbdkxrrTZGt
+DoDKjvbdcJMjLGWx
+EPDKjvbdKeegbBQu
+DnbjjvbdvPTzqKoU
+EOcLKvbdIidAKPgE
+DoDLKvbdVrOYBdkc
+EObjjvbdeFOqawDK
+EOcLKvbdZRNEhmFR
+EObjjvbdKfFgbBRV
+DoCjjvbdiLeEOVCy
+EPCkKvbdqmZjYkgi
+EPDKjvbdHffyxxXg
+EPDKjvbdZLrDsmlN
+DnbjjvbdTkuoBVoJ
+EOcKjvbduDDUvvOo
+DoDKjvbdZdwfzhJC
+EPCkKvbdfMfWgNKL
+EPCjjvbdRXOECkgc
+EOcKjvbdMowpvNfs
+DoDLKvbdiBoCeWpq
+EObkKvbdNwoVzdOU
+EPDLKvbdDoDKjvbd
+EObjjvbdLFehCBRV
+EOcLKvbduCcVWuno
+EOcKjvbdXsMBMtOx
+DnbkKvbdcIljKewY
+DoDLKvbdEzspdkcJ
+DncKjvbdqcdhomua
+EPDKjvbdiifHjNXr
+EObkKvbdVqnXbFLc
+EPCkKvbddwyssrFz
+DncKjvbdrSVKmkAm
+EPCjjvbdTlVoBVni
+EObjjvbdOhAYZAYa
+EPCjjvbdRadEkiZL
+DoCkKvbdSCEEkiYk
+EObjjvbdGZVVAcxC
+DnbjjvbdZyEJnDMS
+EOcKjvbdzitoodSt
+EPDKjvbdXFxzUAPT
+DnbjjvbdziuQQESt
+EPCjjvbdEARhmZvw
+DncLKvbdatbHXkTh
+DncKjvbdbsCjtDjB
+EPCjjvbdKWVGDdgJ
+EPDKjvbdrafNLfkZ
+EObkKvbdFkEsChMu
+DnbkKvbdVgxWXfxz
+EObjjvbdJbjDRJbx
+EObkKvbdwyhFfYFS
+EPCjjvbdMfbpNPtk
+EObkKvbdbsDKtDia
+EPCkKvbdkxsRsZHU
+DnbkKvbdvAdZTOdh
+DncKjvbdptUHRrLU
+DncKjvbdvPTzqKnt
+DncLKvbdTppoUthN
+DnbkKvbdrbFlkgLZ
+EPCjjvbdGdKvJajK
+EPDLKvbdACqxKZiQ
+DoCkKvbdbPffckzd
+DoCkKvbdhbOcEvqR
+DnbjjvbduCcVWvOo
+DoCkKvbdmuUzLKRf
+EPCjjvbdbUbHYLUI
+DoDKjvbdbKkeoNcA
+DoCjjvbdcScKtEJa
+DoCjjvbdyzdnRgiI
+EPCjjvbdkIGlFfOL
+EOcLKvbdzjUpPcsU
+DoDLKvbdJuuGEEgJ
+DncLKvbdTqROtthN
+EOcLKvbdpstGqqkU
+EPCkKvbdtSrTYzEc
+EPDKjvbdezvYdiUX
+DoDKjvbdtTRrxzFD
+DoCjjvbdrovOjDWG
+DoDKjvbdUQpoUthN
+EOcKjvbdKDJbpicY
+DnbjjvbdaSGCgtFk
+DoDKjvbdGZVVAcwb
+DnbjjvbdEvYopNJe
+EObjjvbdSQTgKFdX
+EPDLKvbdrXPkbhyR
+DoDLKvbdhyuGMROG
+DoDKjvbdzoQRFClY
+EPCkKvbdKWUeceHJ
+EObkKvbdZnmiFFZj
+DnbjjvbdtcDUwVoP
+DoCkKvbdjlakyeHP
+EPCkKvbdBvzdIdpW
+EPCjjvbddePRawCj
+DoDKjvbdmfeYNNfy
+DnbkKvbdSLYetgKs
+DncKjvbdFejRnJTq
+EPDLKvbdIGfzZXwg
+DncKjvbdJvVFdFHJ
+EOcLKvbdIHHZyYYH
+EPDLKvbdyXhiaoyk
+DoCjjvbdADSYJzIp
+EObjjvbdNPxQunHT
+EPCkKvbdxnTHwrhc
+DncKjvbdTppnuVHm
+EObkKvbdjlbLydfo
+DoDLKvbdVBBpsRRy
+DnbjjvbdACqwiyhp
+DoCkKvbdZRNFJNEq
+EOcLKvbdaRfDHtFk
+DoCkKvbdKfFgbBQu
+DnbjjvbddCTNSAUN
+EPDLKvbdTfznMXVe
+EOcKjvbdeOeSkUTr
+DnbkKvbdqdEiPnVa
+EOcLKvbdsBemMHLZ
+DoCkKvbdNPxQvOGs
+EPDLKvbdOTTufeUp
+DncKjvbdraelkfjy
+DoDLKvbdZoOIeFZj
+DnbkKvbdptTgRrLU
+DncKjvbdACrXiyhp
+EPDLKvbdIGgZxwxH
+DnbjjvbdZnmiEeZj
+DnbkKvbdWRmxCFLc
+DoDLKvbdyYIiaozL
+EPCjjvbdOTTvGeUp
+EPCkKvbdNUsSKmAX
+EPCjjvbdDigiuwjA
+DoDKjvbdIrxaTMxM
+DoDKjvbdZyDimcLr
+EPCjjvbdjbkkRHVH
+DoCjjvbdWXJYVceH
+EOcLKvbdlZTSSyHU
+DncLKvbdwuNEqYlO
+EPCkKvbdrpWPJbuf
+DncKjvbdtbcUwWPP
+EOcKjvbdGKeScINV
+DncKjvbdZeXfzhJC
+DncKjvbdUQqPVVIN
+DoDKjvbdxsNhmSBg
+DoDKjvbdURROuVHm
+DncKjvbdRMwbYmtz
+DoDKjvbdZRMeImEq
+EOcLKvbdWHwvXgYz
+EPDLKvbdIwsahMQp
+EOcKjvbdfHkVrNqH
+EObjjvbddjKSWUzn
+DncKjvbdxwiJbQZk
+EPCkKvbdMSWlzVQz
+DoDLKvbdUQpnuUhN
+DncLKvbdiCPCdvqR
+DoCjjvbdapHHELzd
+DncKjvbdyOSgwrhc
+DoCkKvbdDxYLtUTl
+EObjjvbdyfyMAMdw
+EObjjvbdHffzYxYH
+DoDKjvbdYzcFrKWZ
+EPDLKvbddZyPwyRC
+EPCkKvbdLhalRYAS
+DoCkKvbdGYtuBEXb
+DoCjjvbdrylQTAgn
+DoCjjvbdbBVeGPpX
+EPDLKvbdYpmFImFR
+DnbkKvbdJcKCpjDY
+DncLKvbdYTLaNUPY
+DnbkKvbdeOeSjtTr
+DoCkKvbdEYYLtTtM
+EPCkKvbdrzLoraIO
+DoCjjvbdKWVGDdfi
+DoDKjvbdBhjbLIfK
+EPCkKvbdNQYQvOGs
+EOcLKvbduLxXBTaX
+EPDKjvbdANHySwZx
+DnbkKvbdeOdsLTtS
+DnbkKvbdUsmTfMWK
+DoDLKvbdcImJkGXY
+DncKjvbdsPunibuf
+DnbjjvbdIGfyxxYH
+DoDLKvbdvBDyTOeI
+EPDLKvbdGKeScHmV
+EOcLKvbdqFceUVaI
+DncLKvbdqdEhpOWB
+DoDLKvbdTulPitAq
+DnbjjvbdWXIwudEg
+EPDLKvbdcTDKtDjB
+DoCjjvbdgFlZnHHA
+DnbkKvbdwuNEqZLn
+EObkKvbdmRxtzSci
+EObjjvbdjvXNdCYX
+DnbkKvbdqGDdsvBI
+DncKjvbdqdEhomvB
+DoCjjvbdrpVoKCvG
+EObkKvbdWHwvYHYz
+EOcKjvbdrykoraHn
+EPCkKvbdsPuoKCuf
+DncKjvbdZjSgofaf
+DncKjvbdNeETiIjd
+DoDLKvbddoFSkTsr
+EPCkKvbdkWWnECXw
+DnbkKvbdZRNFIldq
+EObjjvbdzjVQPdTU
+DnbjjvbdhytelRNf
+EOcKjvbdNPxQunHT
+DoCkKvbdmuVZkJrG
+EPCjjvbdUVlQJtBR
+DoDKjvbdzitpQESt
+DoCjjvbdraemLfkZ
+DoDLKvbdkNBlZeHP
+EObkKvbdrbGNMHLZ
+EPDLKvbdkIHLeemk
+DoDKjvbdbAvEeopX
+DoDKjvbdiGjCxujV
+EPCkKvbdqlzJxkgi
+DncLKvbdVZITzLPO
+EOcLKvbdVZITykOn
+EPCjjvbdjuvnDaww
+DoDKjvbdkVwOECYX
+EObjjvbdcyxpXyRC
+DnbjjvbdULvPAuni
+DnbkKvbdOTUWGdtp
+EOcLKvbdKDJcRKCx
+EPCkKvbdBsBDUFwS
+DncLKvbdQdDAopcr
+EObjjvbdcSbjtEKB
+DnbjjvbdlAloNALA
+DoCjjvbdADSXizJQ
+EOcKjvbdrpWOibvG
+EObjjvbdIGfzZXwg
+EPDKjvbdptUHRrKt
+DncLKvbdZdwfzhIb
+DoCkKvbdQZNAGrrK
+DoDKjvbduCbtvuoP
+EPCjjvbdJuuFceGi
+EPCkKvbdgGLymgHA
+DnbjjvbdcyyPxYpb
+EPCkKvbdhuZeWquC
+EObkKvbdyTNiNRbH
+DoCjjvbdVAaqSprZ
+DncLKvbdoznDkYPA
+EPCkKvbdiUydvquC
+DncLKvbdhytfMROG
+DoCkKvbdmbKXYPNu
+DnbkKvbdMpYQunHT
+EOcLKvbdHkaznXQk
+DoDLKvbdTvMPisaR
+DoCkKvbdIryBTNXl
+DoDLKvbdZLrDsmkm
+DncLKvbdlhctRVRa
+EPCjjvbdYkqcsmkm
+EPCjjvbdEXwlUTtM
+EObkKvbdEvZPoljF
+EPDLKvbdZRNEiNFR
+DoCkKvbdANIZTXZx
+DncKjvbdZoOIeFZj
+DoDLKvbdeJirWUzn
+DoCjjvbdRWmdDLgc
+DoDKjvbdACrYKZhp
+EPDKjvbdMowpunHT
+EOcKjvbdYTLaNTnx
+DnbjjvbdQvnEClHc
+DnbkKvbdSBceLhyL
+DoDKjvbdjgflGGOL
+EOcKjvbdYpldiMdq
+DoCjjvbdrovPKDWG
+DoDKjvbdZisHofbG
+DoDKjvbdEOcLKwDE
+EPCjjvbdhfjDZWJu
+DncKjvbdhfjCyWJu
+EOcLKvbdtSqsYzEc
+DoDLKvbdbQHHELzd
+DoDKjvbdySnImRbH
+EOcLKvbdVqmxCElD
+DnbjjvbdNdcsiJKd
+EPCkKvbdkNBkzEfo
+DnbkKvbdJKEAKPfd
+DncLKvbdiifIJlwr
+DnbjjvbdhtzEvqtb
+EObjjvbdwWlAvBWV
+EPDLKvbdlhctQuSB
+EOcLKvbdNddUIiKd
+EPDKjvbdJSxaTMxM
+EPDLKvbdVrOXaeMD
+DoDLKvbdGcjvKBjK
+DncLKvbdqvpLbiZR
+EPCkKvbdjKFgilxS
+DncLKvbdDoCjjvbd
+DoCjjvbdqqtjnKaN
+EOcKjvbdBvzdJEpW
+DoCkKvbdcarlrATm
+DoDLKvbdQdCaQQdS
+DncKjvbdVqnXadkc
+DoCjjvbdJvUecdgJ
+DnbkKvbdVYhUZkPO
+EPDKjvbdxZgfFxEr
+EPCjjvbdsPunicWG
+DnbkKvbdmSYtyrdJ
+DnbjjvbdTulQJsaR
+DncKjvbdsrrSxyeD
+DnbkKvbdzQnmJJwA
+DncKjvbdatafxLTh
+EOcLKvbdmfeYNNgZ
+EObkKvbdNxOuzcnU
+EPDLKvbdDwwksstM
+EPDLKvbdxnTIYTIc
+EPDKjvbdHgGyyXxH
+EOcKjvbdGAnpyJzm
+DoCkKvbdUQqPVUhN
+DncLKvbdYgWdAOri
+DoDLKvbdygZMANFX
+EPCkKvbdrJAJdlne
+EPDLKvbdZnmheEyj
+DnbjjvbdIxUCHkpp
+DnbkKvbdjJehJlwr
+DoDKjvbdhlEdNuDZ
+EOcKjvbdeOeSkTsr
+EOcLKvbdVqnYBdlD
+DoDKjvbdeATqMwif
+EPCjjvbdrXQLbhyR
+DnbjjvbdFkErbhMu
+DoCjjvbdpxnhHQcx
+EOcLKvbdrWpMDIxq
+EPDKjvbdVhYWYGxz
+DoCkKvbdwzIGFxFS
+DoCjjvbdEztQeLbi
+DnbjjvbdlZTRrxgU
+DncLKvbdSZihSbvA
+DnbjjvbdrzLpTAgn
+EPCjjvbdNrsugFVQ
+DnbjjvbdxUleQxlO
+DncKjvbdtkwwBUAw
+DoCjjvbdbBVdeoow
+EPDKjvbdEObjkXDE
+DnbjjvbdhgJbxvKV
+EPCkKvbdIwtCHlQp
+DoCkKvbdxmsIXrhc
+EObkKvbddePSCXDK
+EOcKjvbdVrOXbEkc
+EOcLKvbdFVyPomJe
+DoDLKvbdREDBPqDr
+DncLKvbdaNLCStmH
+DncLKvbdbAudfQPw
+DoDKjvbdRaceLiZL
+DoCkKvbdJYUCIMRQ
+DnbkKvbdYkrDtOMN
+DnbjjvbdFkFTChNV
+EOcLKvbdZRMeImFR
+EObkKvbdUxgszLOn
+EOcKjvbdFjdsChMu
+EObkKvbdrafNLgLZ
+EPDKjvbdelewGmJk
+EOcKjvbdZMRctNlN
+DoDLKvbdliEUQtqa
+DncKjvbdqUUHSRjt
+EPDKjvbduCbtwVno
+DoCkKvbdaaVeFoow
+EPDLKvbdkClKqGuH
+DoDLKvbdCflFgAzc
+DoDLKvbdTAEhgbPE
+EObkKvbdmtuZjjRf
+EObjjvbdKDKCqJbx
+DncKjvbdrovOjDVf
+DoCkKvbdhtzFWqtb
+DncLKvbdEvYpQNKF
+EOcLKvbdeFPRavcK
+DoDLKvbdhlEcnUby
+DoCkKvbdegjvSOQg
+DncKjvbdhbPCeWpq
+DnbjjvbdsrrTYyeD
+DncLKvbdTlWPAvOi
+EPCjjvbdwzHeexEr
+DncLKvbdmJEUQuRa
+DnbkKvbdkIHLeemk
+EObkKvbdhtyeXSUb
+EOcLKvbdHDkWKCJj
+EOcLKvbdRbDdkhyL
+EObkKvbdRosfifDw
+EPCjjvbdOStVfduQ
+DnbkKvbdiHJbxujV
+DoCjjvbdsPuoJcWG
+EPCkKvbdDxXktTtM
+DoCjjvbdHDjujCJj
+EObjjvbdUWLoisaR
+EPDKjvbdqiAKEmOe
+DoDLKvbdxmsIYShc
+EPCkKvbdCJKbKiGK
+DoDLKvbdRECaQRDr
+EPDLKvbdYqNEiNEq
+DnbkKvbdiMEcnVCy
+DoCkKvbduCbtwVno
+DoDKjvbdHbMZdzAD
+DnbkKvbdemGXGmKL
+DoDLKvbdgQBzwDwh
+DoDKjvbdKQzEoGOF
+DoDKjvbdWSNwaeMD
+EPDKjvbdySmhlqbH
+EObkKvbdDxYLtTtM
+DnbjjvbdFxuVBEXb
+EObjjvbdiBoCdwRR
+EPCjjvbdGQATWgGZ
+EPCkKvbdYpleJNEq
+EOcLKvbdvPTzqKoU
+DnbkKvbdZQmEhldq
+DncKjvbdLBKgMawq
+EPCkKvbdqFceTvAh
+EPCjjvbdkIHMFenL
+DoDKjvbdehLVqnRH
+DoDKjvbdxwhibPyk
+DnbkKvbdkMbMZeHP
+EOcKjvbdsrrSyZeD
+EOcLKvbdMowpunHT
+EObjjvbdJqZdnfOF
+DoCkKvbdezuxdhtX
+DnbjjvbdaaWFFopX
+DoCjjvbdqdFJQOVa
+EPCjjvbdWWhwudFH
+EPDKjvbdhtzFWrUb
+EPCkKvbdWSNwaeMD
+EObkKvbdcIlikFvx
+EPCkKvbdauCGwkTh
+EPCkKvbdbhmJkGWx
+EPDKjvbdRosgJfEX
+DnbkKvbdTvMQJtAq
+DnbkKvbdsBfMlGkZ
+DnbkKvbdVrNxCElD
+DoDLKvbdmpZxukZC
+EObkKvbdhlEcnVCy
+EOcLKvbdwzIFfYFS
+DnbkKvbdZtIhxdSn
+DoDLKvbdjgfkfFmk
+DoDLKvbdqTtHSRkU
+EObjjvbdSCDeLiZL
+DoDKjvbdeATplxJf
+DnbkKvbdIBkzEzAD
+EOcKjvbdFWZQPljF
+DoCjjvbdRbDeMJYk
+EPDLKvbdDoCkKvcE
+DoCkKvbdZjShPfbG
+DnbjjvbdNPxQvOGs
+EPDLKvbdKyQirztf
+DoDLKvbdJutecdfi
+DoCjjvbdTppoUuHm
+EPDLKvbdjEkGuPAO
+DnbkKvbdVTmTekuj
+DnbkKvbdZyEJmcMS
+EOcKjvbdNddThhjd
+DncLKvbdrDdhpNua
+EOcKjvbdBiLBkJGK
+DoCkKvbdrXPkbhxq
+DnbjjvbdZQmEiMdq
+DncLKvbdhzUfMROG
+EPDKjvbduaEYroEh
+DoCjjvbdJYUCHkqQ
+DoCjjvbdwzHfFxEr
+EPCjjvbdLiBkqYAS
+DoDLKvbdxZgfFxEr
+DoCkKvbdraemLgLZ
+DoDLKvbdxxJJaozL
+EPDLKvbdKeehBaRV
+DoCkKvbdPIAYZAZB
+EObjjvbdBvzdIdov
+DoDKjvbdjblKqGuH
+DoDKjvbdlhdURVSB
+EPDKjvbdqvpMDJZR
+DncKjvbdajkeoODA
+EOcKjvbdkySqsZHU
+DnbjjvbdJqZdnfOF
+DncKjvbdZHWdAOsJ
+DoCkKvbdaNLCStlg
+DoDLKvbdVZHszKnn
+DoCjjvbdtvOYJpsA
+DoCjjvbdNPxQvNfs
+DoDLKvbdZLqctOMN
+EObjjvbdvwMAvAvV
+DnbkKvbdEuxpPlie
+DnbkKvbdAMhYsWyx
+DoCkKvbdtumwjQsA
+EPCjjvbdVAaprqRy
+EObkKvbdlZSqsYgU
+EObkKvbdBvzdIdov
+DnbjjvbdyOShYTJD
+EOcLKvbdZshhxdSn
+EPDKjvbdUtMselWK
+DoDLKvbdYqNEiMeR
+DncLKvbddePSBwDK
+DncLKvbdqYnggQcx
+DnbkKvbdqceJQOVa
+DoDLKvbdtSrTZZeD
+EPCjjvbdANHyTWzY
+DoDLKvbdcIlikFvx
+DoDKjvbdxmsHwsIc
+EObkKvbdYzbfRiuy
+EPDKjvbdWHwuwfxz
+EOcLKvbddndsLTsr
+EObkKvbdwXMAuaVu
+EPDLKvbdbVBfwjtI
+EObjjvbdfMfXHMik
+DoCkKvbdOXoVzdOU
+DnbkKvbdnGeXlnHZ
+EPCjjvbdGGJrOJTq
+EPCkKvbdhanbeWqR
+EOcLKvbdLhbLpxAS
+EPDLKvbdbBVdepPw
+EOcKjvbdWSNwadlD
+DoCkKvbdaRfChTek
+EPCkKvbdmbJvxOmu
+DoCkKvbdCSaCsfXS
+EObkKvbdbhljKewY
+DncLKvbddZxowxpb
+DnbjjvbdRDcBQQdS
+DnbjjvbdKDJbqKDY
+EObkKvbdWRmxCFLc
+EPDLKvbdYlSETmkm
+EOcLKvbdMIalRYAS
+DoDKjvbdCEQAuimG
+EPDKjvbdCTAcTewS
+EPCjjvbdrRtkOKaN
+DnbkKvbdtTRryZeD
+DnbjjvbdMgColpVL
+EOcKjvbdrDdhomua
+EPDKjvbdRbDeMJZL
+DnbkKvbdxnSgwrhc
+DoDKjvbdVvhxVdFH
+DncKjvbdLYqJrzuG
+DncLKvbdZsiIyETO
+EPDLKvbdieLHUoAO
+EPDLKvbdNsUVgEuQ
+EPDLKvbdoAKztHcn
+DncKjvbdfNFvgNJk
+DoCkKvbdqYoHgQcx
+DncLKvbddwzUUSFz
+DoCkKvbdIHGzZYXg
+DncLKvbddZxpXxpb
+DnbjjvbdhlFDnUcZ
+EPCjjvbdSKxfUfjs
+DoCkKvbdbAvFGPpX
+EOcLKvbdVhXuwfxz
+EPCkKvbddoEsKtTr
+DncKjvbdhkeEOVDZ
+EObjjvbdNUrqjmAX
+EPDLKvbdUWLojTaR
+DoDLKvbdWIYVwfxz
+DnbkKvbdUtMsekvK
+EOcKjvbdRpUHJecw
+DoDKjvbdCJKbKiFj
+EObjjvbdEuxoomJe
+EPCjjvbdLrWlytpz
+EObjjvbdMgDPlotk
+DncLKvbdNrtWHFVQ
+DoCjjvbdZeYGzgiC
+EPCkKvbdKaKfmCYR
+DoCjjvbdjlakzEfo
+EPDKjvbdpeceTvBI
+DnbkKvbdKDKCqJcY
+DoDKjvbdMowqWNgT
+EPDKjvbdRMxCYmtz
+EObjjvbdrXQLbiYq
+DncLKvbdZnmheFZj
+EOcLKvbdiLeENtcZ
+DncKjvbdzaAPGfal
+EPCkKvbdeATqNYKG
+EObjjvbdSCDdlIyL
+DoCkKvbdVZHtZjnn
+EPCjjvbdZtIhxdTO
+EPDKjvbdTlVoAuoJ
+EObjjvbdZRNFIleR
+DoDLKvbdEPDLKwCd
+DnbjjvbdfRaWzkbo
+EPDLKvbddneSjstS
+EObkKvbduCbtwWOo
+EPCkKvbdmoyyWKyC
+EPCjjvbdehLVrORH
+DoDLKvbduCcUvuno
+EObkKvbddZxowxqC
+EObkKvbdKQydoFme
+EPCkKvbdqqtkOKaN
+DoDKjvbduaEYsOeI
+EObkKvbdePEsLUTr
+DoDLKvbdbsDLTcia
+DncLKvbdDwwlTtUM
+EOcKjvbdOEdUIhkE
+DoDLKvbdtvOXjRTA
+EObkKvbdeFPSCXCj
+EPCkKvbdqlzJxlIJ
+EOcKjvbdUMVoBVni
+EPCkKvbdqqtkNkBN
+DoDLKvbdiVZeWquC
+DncKjvbdZLrDsmlN
+EPCkKvbdzitopESt
+EOcKjvbdnBjXYPOV
+EObkKvbdehKurOQg
+DoCjjvbdmJDsptrB
+DnbkKvbdaNKbTVNH
+DncLKvbdGQASvfey
+EOcLKvbdtbcUwVno
+EOcKjvbdqUUHSSLU
+EOcLKvbdvwLaWBWV
+EPCkKvbdRacdlIxk
+DnbkKvbdxZgfGXeS
+EOcLKvbdVAapsQqy
+EOcLKvbdQvnECkhD
+EPDKjvbdCWzchdpW
+DoCjjvbdpedFUWBI
+EPDKjvbdqvpMCiYq
+EPDLKvbdEPDKjwCd
+DncLKvbdGckWJaij
+EObjjvbdgPazwEXh
+DoCkKvbdUVlPitBR
+DoCjjvbdMSXMzVQz
+DnbkKvbdliEUQuRa
+DoCkKvbdOStVgFUp
+EPCjjvbdUtMtGMVj
+DoCkKvbdKWVFdFHJ
+EPCkKvbdUxhUZkOn
+DnbkKvbdLBKflbYR
+EPCkKvbdFkEsCglu
+DnbkKvbdKCibpjCx
+DnbkKvbdGLEsChNV
+DoCjjvbdLGFhCApu
+DncLKvbdeXzTsqez
+DoCkKvbdxrmhlqbH
+EPDLKvbdYlRdTmlN
+EPCjjvbdqYnhHRDx
+EPDKjvbdWfYzUAOs
+EPCkKvbdMJCLpxAS
+EObkKvbduCbtwVoP
+DoCkKvbdmfdwlmfy
+EPCjjvbdVBBprpqy
+DoDLKvbdEKHivXjA
+DoDLKvbdkWWnECYX
+EOcKjvbdqUUHSRkU
+DncKjvbdYlRcsnLm
+EOcKjvbdelfWfmJk
+EPDLKvbdZtIhxcsO
+EOcLKvbdGKdrcINV
+EPDLKvbdOAIsUKSA
+DoCjjvbdXFxytAOs
+EPCjjvbdUQpntuIN
+EPDLKvbdTvLpJtBR
+EPDKjvbdRyihSbvA
+DnbjjvbdhyuFlROG
+EObkKvbdZxcinClS
+EOcKjvbdptTfqrKt
+DoDLKvbdURRPUtgm
+EObkKvbdaNKbTVNH
+EOcLKvbdiZuFlQmf
+EPDKjvbdePEsLUTr
+EPCjjvbdFxuUaEYC
+EPDLKvbdliETpuRa
+EObjjvbdjKFhKNYS
+DoCkKvbdwzHefXeS
+DoDLKvbdFfJqmiUR
+EObjjvbdcJMjKewY
+EObjjvbdqdFIomua
+DnbkKvbdFejRnJTq
+DnbjjvbdEzsqFMCi
+EPDLKvbdhzUelROG
+EPDKjvbdLKaIWAKZ
+DoCkKvbdGGJrOIsq
+EOcKjvbdVUMtGMWK
+EObkKvbdmpZyVkZC
+DoDLKvbdJTYaSmXl
+EObjjvbdmSZUyrci
+EObkKvbdxnSgwsIc
+EOcLKvbdhgJcYujV
+DoDKjvbdUQpoVVHm
+EPDKjvbdKWVFdEgJ
+DoCkKvbdWXJXudEg
+EObkKvbddxZtURez
+DnbkKvbdZRMeJNEq
+EOcKjvbdpxoIHRDx
+EObkKvbdGGKSOJTq
+EOcKjvbdkIHMFenL
+EPDLKvbdTqQoUtgm
+DnbjjvbdtvNxJpsA
+DnbkKvbdFyUtaDxC
+DnbkKvbdSLYeuHKs
+DncLKvbdxrmhlrBg
+DncLKvbdGdLWJajK
+EPCkKvbdSPtHJfEX
+EPCkKvbdeKJrVtzn
+DoCjjvbdWRnXadlD
+DncKjvbdhkdcmtby
+DoDLKvbdVviYWEFH
+EOcKjvbdTAFJICPE
+EPCjjvbdCJKbLIej
+DoDLKvbdyYJJaoyk
+EPDKjvbdNsUVgFUp
+EPCjjvbdrDdhomua
+DoDKjvbdySnJNRag
+EPCjjvbdyNrgxShc
+DnbjjvbdADRxKZhp
+DnbkKvbdaMkCStmH
+EPDKjvbdfIKvRnRH
+DnbkKvbdoAKztIEO
+DnbjjvbdDjHjVwjA
+EObkKvbdjuwODbYX
+DoDLKvbdbhmKKfWx
+EPDLKvbdKaLGlaxR
+DoDLKvbdwzIGFxFS
+EPCkKvbdGBOpxizm
+EPDKjvbdRXODcMHc
+EOcLKvbdYqNFJMdq
+EOcKjvbdxUleQxkn
+EPDKjvbdZirgpHCG
+DncLKvbderAvzkbo
+EPCkKvbdTvMPisaR
+EPCkKvbdZtJIxdTO
+EOcKjvbddePRavcK
+DncLKvbdCDpAuimG
+EPDLKvbdQdCaPqES
+EObjjvbdZyEJmbkr
+DoDLKvbdOEcsiIkE
+EOcKjvbdrbFlkgLZ
+EOcKjvbdRacdlJZL
+EPCkKvbdKDKCqKCx
+EPDKjvbdrDeIonVa
+DncKjvbdOFEThhjd
+DncLKvbdLAkHMbXq
+EObkKvbdhytekpnG
+DncLKvbdrSUkOLAm
+DncLKvbdiCOcFWpq
+DoCjjvbdrylPsAhO
+EOcKjvbdxVNEpyLn
+DnbkKvbdmbJvwnnV
+DnbkKvbdVAbQsQrZ
+EPCkKvbdCTBCtGXS
+DncKjvbdTAEiHbPE
+EObjjvbdFeiqnJTq
+EPDLKvbdDxYMTtTl
+DncLKvbdHDkVibKK
+DnbkKvbddePSBvcK
+DoCjjvbdauCGwkTh
+EPDLKvbdWIYWYGxz
+DoDLKvbdjcLjqHVH
+DoDLKvbdTfznMXWF
+DnbkKvbdkVwNcaww
+EObjjvbdlYrrSxgU
+DncKjvbdaNLCTUmH
+EOcKjvbdznoqEblY
+DncLKvbdjuwOEBww
+DncKjvbdGQATXHGZ
+EOcKjvbdiZuFkpmf
+EPCjjvbdajlGOnDA
+EPDKjvbdJcJbpjCx
+DncKjvbdauBgXjtI
+EPCkKvbdsZkpTAhO
+EPCkKvbdOEdUIhjd
+EOcKjvbdNsUWGduQ
+DnbkKvbdVTltFlVj
+EObjjvbdaNKasVNH
+DnbjjvbdhancEvpq
+EPDLKvbdZtIiZETO
+DoDKjvbdFxuUaEYC
+DoDLKvbdLGGHbAqV
+DoDKjvbdqceIpOWB
+DoDKjvbdvBEZTPEh
+DoDKjvbdKefHbBQu
+EPDLKvbdlZTSSyHU
+DncKjvbdnPyyWKyC
+EObjjvbdsZkpTBHn
+DoCjjvbdaaVdepPw
+EPDKjvbdtkwvaUAw
+EObjjvbdEPCkKvbd
+EPCjjvbdtkwvaUBX
+DncKjvbdRbDeMIyL
+EOcKjvbdxwhjBoyk
+DoDLKvbdFxuVAcxC
+DnbkKvbdxZgfFxFS
+EOcKjvbdjhGkefNk
+EOcKjvbdEPDKkWcE
+EPDLKvbdQvnEDMID
+EOcLKvbdqquKmjaN
+DoCkKvbdZtJJZESn
+EPDLKvbdTkvOaWPJ
+DnbjjvbdcSbkUEJa
+EObjjvbdQlxBxmtz
+EOcLKvbdehKuqmpg
+EObjjvbdpyOggQcx
+DncLKvbdnVVZjjSG
+EPCjjvbdyqOmIiwA
+EPDLKvbddZxpXyRC
+EObkKvbdRXODcMID
+EOcKjvbdnHFXlmfy
+EPDKjvbdznpQdcLx
+EOcLKvbdqGDdtWBI
+EPCjjvbdZoNhddzK
+EOcKjvbdqTsgSSLU
+EOcLKvbdRzJhTCvA
+EOcKjvbdCIjbLIfK
+DncKjvbdKQzEoGNe
+EOcKjvbdACrXizJQ
+EObjjvbdEzspdkcJ
+EObkKvbdsZlQTAhO
+EPDKjvbdfoazwEYI
+DoDLKvbdjAQGaQGj
+DoDLKvbdEzsqFMCi
+EPDKjvbdyYJJapZk
+DnbkKvbdIxUBglRQ
+DoCjjvbdtTRsYyeD
+EPDKjvbdGKdsDIMu
+EOcLKvbdFyVVAcxC
+DnbkKvbdZLrDtNkm
+EPDLKvbdsrqrxydc
+EPDKjvbdrpVnjCvG
+DoDLKvbdmSYtzTEJ
+EPDKjvbdajkfOmcA
+EPDLKvbdssSSxzEc
+EObjjvbdDxYMTssl
+DnbkKvbdiMFEOVDZ
+EOcLKvbdULvOaVni
+EPDLKvbdlqyUzSdJ
+EObjjvbdZoNheFZj
+DncKjvbdcScLTdKB
+EObkKvbdGLFTDINV
+DncKjvbdcyyQYZRC
+EOcKjvbdYqMeIldq
+DoCkKvbdOEcshhkE
+EObkKvbdirzhrjiz
+EOcLKvbdxUmFRYlO
+DoDKjvbdkyTRsZGt
+DncKjvbdIryAsNYM
+EObkKvbduWNxJpsA
+DncKjvbdYkqcsnLm
+DoDLKvbddZxpXyQb
+DncKjvbdRotGiedX
+DnbkKvbdKVtedEgJ
+EOcKjvbdjvWnEBww
+EObkKvbdFyVVAdXb
+DoCkKvbdYlSEUNkm
+EOcKjvbdcTDLTcia
+EPCkKvbdzjUpQESt
+DnbkKvbdqUTfqrLU
+EPDKjvbdSQUHJfEX
+DnbjjvbdiGjDYvKV
+EObkKvbdhkdcnVCy
+EPCjjvbdJuuFdFHJ
+EObjjvbdYkqdTnMN
+DoCkKvbdpssgSRkU
+EObkKvbdUWLpKUBR
+DoDKjvbdZsiJZESn
+DnbkKvbdYqMdhmEq
+DoCkKvbdjcLkRHVH
+DnbkKvbdSPsgKGDw
+DoDLKvbdKVtfEEfi
+EPCjjvbdiGibyWKV
+EPCjjvbdEYYLtUTl
+EPCjjvbdFejSOIsq
+DncLKvbdRECaQRES
+EPCkKvbdEuyQQNKF
+EObkKvbdxwhjCPzL
+DncLKvbdiLeDnUby
+EOcKjvbdEuxpQMie
+EOcKjvbdIidAJogE
+DoDKjvbdxsNhlqag
+EOcKjvbdEzsqFLcJ
+EObjjvbdYTMAmToY
+DoDLKvbdwuNFQyLn
+DoCkKvbdzitpQDrt
+EOcLKvbdZtJIxdSn
+DncLKvbdqZPHgRDx
+EPDLKvbdMoxQvNfs
+DncKjvbdmIctQuSB
+DoCkKvbdFfKSNiUR
+EPDLKvbdhtydvqtb
+EObjjvbdxrnJNRag
+DnbjjvbddoFTKssr
+EPDKjvbdqlyjZLgi
+DnbkKvbdyNsHwsJD
+EOcLKvbdxnTHwsJD
+EObjjvbdUQqOtuIN
+DnbkKvbdwtleQyMO
+DoDLKvbdrovPKDVf
+EOcLKvbdFaPQxizm
+EObjjvbdVAapsQqy
+EOcKjvbdJvVFdFGi
+DnbkKvbduDDVXVno
+EObkKvbdZjTHpGbG
+EObjjvbdZirgofaf
+DncKjvbdAMgySvzY
+DoDKjvbdGdLVibKK
+DoDKjvbdWRmwbEkc
+DncKjvbdXsMAlsnx
+DoDLKvbdtcCuXVoP
+DoDLKvbdqlyjYlIJ
+EPCjjvbdHELVjCKK
+DncLKvbdBdQAuilf
+DoCjjvbdeFOrCXDK
+DoCjjvbdRpTgJfDw
+DoCkKvbdLAkHMbXq
+EOcLKvbdaRebhUGL
+DncLKvbdnQZyWLYb
+EObjjvbdXsMBNUOx
+DncKjvbdrSVKnKaN
+EPCjjvbdAMhZSwZx
+EOcLKvbdcScKtEKB
+DncKjvbdKaLGlaxR
+EOcKjvbdZRMeJNFR
+EPCkKvbdwygeewdr
+DnbkKvbdhancFXRR
+EOcKjvbdOTUVfdtp
+EPDLKvbdmbKXYOnV
+DoDKjvbdGLFSbhNV
+EPDLKvbdMfbomPtk
+DnbkKvbdmIcsqVRa
+DoDKjvbdwtmFRZLn
+DoCkKvbddtAUATMv
+DncKjvbdiBoDEvqR
+EObkKvbdiHJcYujV
+DnbjjvbdiCPDFWqR
+EOcKjvbdyTNhlrCH
+DoDKjvbdNQYRVmfs
+EOcLKvbdFjdrbhMu
+DoCjjvbdsrrSyZeD
+EPCkKvbdXsMBMsoY
+DoDKjvbdjhHLfFmk
+EPCkKvbdyOTIYTIc
+EOcLKvbdbhmKLGWx
+DnbjjvbdxnTHwsIc
+EOcLKvbdZoOJEeZj
+EOcKjvbdjmBkzEfo
+EPDKjvbdYORAXuWU
+EPDKjvbdtkxXAsaX
+DoDLKvbduaEYsPFI
+EPCjjvbdypoNIiwA
+DoDKjvbdVBCRTQrZ
+DnbjjvbdlrYtyrdJ
+DoCjjvbdhzUekpnG
+EOcKjvbdcTCjsdJa
+EObkKvbdbhlijfWx
+EOcLKvbdYTLaMsoY
+DnbjjvbdKVtedFGi
+EOcLKvbdsPvPJbuf
+DncLKvbdNrsvHEuQ
+EObkKvbdmfeYMmfy
+EPCjjvbdZjTHpHCG
+DoDLKvbdpyOhGqDx
+DoDKjvbdRkZGVGjs
+DnbjjvbdRWnEDMHc
+EPCkKvbdjlbMZdfo
+DoCkKvbdyqOmIiwA
+DoCkKvbddxZstSFz
+DnbjjvbdKCibqJbx
+DoCjjvbdqqtjnLBN
+DnbjjvbdBhjbLJGK
+DoDLKvbdrWokbhxq
+EOcLKvbdJzpGXdAN
+EPDKjvbdRMxCZNtz
+DncKjvbdkClLRGuH
+DncLKvbdIHHZxxXg
+EPDKjvbdZshiYdSn
+EPCkKvbdqcdhomvB
+DoDKjvbdVTmUFkvK
+EObkKvbdZisHogBf
+DoCjjvbdRbDdkiYk
+DnbkKvbdGGJrOJTq
+DncLKvbdeFPRavcK
+DnbjjvbdSPtHKGDw
+DoDLKvbdJmADyfuB
+EPCjjvbdKCibpicY
+DoDLKvbdiGicZVjV
+DoCkKvbdZLqdUNkm
+EPDKjvbdVUNUFkvK
+EPCjjvbdemFvflik
+EPCkKvbdkxrqrxft
+DnbkKvbdRbEElIxk
+EPCjjvbdaaVdfQQX
+DoDLKvbdySmhlqag
+EPCjjvbdrRuKnKaN
+DncLKvbdezuyEhtX
+DnbkKvbdtbbuWuoP
+DnbkKvbdZtIhxcrn
+EObkKvbdcyxoxZQb
+EOcKjvbdDxYLtTtM
+EObjjvbdjggMFfOL
+EPCkKvbdGckWJbKK
+DnbjjvbdddnqavcK
+EPDKjvbdYgWdAPTJ
+DnbjjvbdbhlikGXY
+DncKjvbdNPxRVmgT
+EObkKvbdRpUHKGDw
+EObkKvbdmfdwlmgZ
+DoDLKvbdBvzdJFPv
+DnbjjvbdZHXEAPSi
+EPDKjvbdbQHGdLzd
+EOcKjvbdCIjbLIej
+DnbjjvbdOXnuzdNt
+EObkKvbdrSUkNkBN
+DoDLKvbdNeDsiJLE
+EPCkKvbdiUyeXRtb
+EObkKvbdbsDKsdJa
+DncLKvbdbrcLTdJa
+DncLKvbdSPsgJecw
+EObjjvbdKNADzGta
+EPDLKvbdFWZPomKF
+EPCjjvbdRzKISbvA
+EOcKjvbdvmWAMcdm
+DncKjvbdwyhGGYEr
+EPDLKvbdfHjuqnRH
+EPCjjvbdRXOEDLhD
+EPCkKvbdyOSgwsJD
+DoDLKvbdnCKXYOmu
+DnbjjvbdjmCLyeGo
+DnbjjvbdTYKlNzjx
+DoCjjvbdZisHpGbG
+EObjjvbdUWMPisaR
+EObjjvbdqFcdtWAh
+EOcLKvbdYqNEhleR
+DnbjjvbdlZSrSyGt
+EPDLKvbdePEsLTsr
+DncKjvbdSBcdlJYk
+EPDKjvbdePEsLTsr
+EPDKjvbdypnmIjXA
+DnbjjvbdsQWPKCuf
+EOcKjvbdZRNEhldq
+EPCjjvbdYpmFImEq
+EPCkKvbdKfFhBaRV
+DncLKvbdezvZEhtX
+DncKjvbdiCObdvpq
+DnbjjvbdmJETqUrB
+EOcLKvbdfpBzvcxI
+DncKjvbdRbDdkhxk
+EPCkKvbdmpZyVkZC
+EPDLKvbdyNsIXrhc
+DnbkKvbdyYJJaoyk
+DncKjvbdwWlBVaWV
+DoDKjvbdqwPlCiYq
+DncLKvbdvvkaVaWV
+DncKjvbdcJMjKewY
+EObkKvbdbBWFFpPw
+EPCjjvbdpyOhGqEY
+EPDKjvbdCDpAujNG
+EPDLKvbdCSaCtFvr
+DoCjjvbdwygfFxEr
+EOcLKvbdLFehBaQu
+EPCjjvbdssSSxydc
+EPCjjvbdHfgZyYYH
+DnbkKvbdnBjWxOmu
+DnbkKvbdcJNJjewY
+EObjjvbdrzLoraIO
+EOcKjvbdADRwjZiQ
+EPCkKvbdOAJStJrA
+DncLKvbdajkennDA
+DoCjjvbdmbKWxPNu
+EObkKvbdmbKXYPOV
+DoCkKvbdKCjCpjDY
+EPCkKvbdIjEAJogE
+DoCkKvbdkHgLfGOL
+DoCkKvbdJcJbqKCx
+EPCkKvbdVUMtGMWK
+DoDKjvbdNxOuzcmt
+EPDLKvbdNQYRVnGs
+DnbkKvbdzjUoocrt
+DoDKjvbdDnbjjvcE
+DoCkKvbdGBPRZJzm
+DoCjjvbdtvNwjRTA
+EPDLKvbdZQldhleR
+DoDLKvbdUtMsfMWK
+DnbkKvbdDxYLtTsl
+DoCjjvbdmbJwYPOV
+DoCjjvbdaNLCTVMg
+DoCjjvbdWXIwvEFH
+DoDKjvbddZxoxYpb
+DncLKvbdijGHimXr
+EPDKjvbdZQmEiMdq
+DncKjvbdTulPisaR
+DncLKvbdnGdxMnGy
+EPCkKvbdlYsSSyHU
+DoDKjvbdKRZePFme
+DoCkKvbdZRNFJNEq
+DncLKvbdkMbMZeGo
+DoCkKvbdBiLBkIej
+EObjjvbdWXIwvEFH
+EOcLKvbdGGJqnJTq
+DoDLKvbdRWmcblID
+EObjjvbdxUleQxlO
+DnbkKvbdREDBPpdS
+DnbjjvbdiifHjMwr
+EObjjvbdZLqctOMN
+EPCjjvbdmRxtyrci
+DoDLKvbdDxXlTtUM
+DoDKjvbdxrmiNSBg
+DoDKjvbdTppntthN
+EObjjvbdnUtykKRf
+DoCkKvbdRNYBxmtz
+EOcLKvbdQYmAHTSK
+EPCjjvbdZtIhxcsO
+DoCjjvbdbsCjsdJa
+EPDKjvbdsZkoraIO
+DoDKjvbdEJhJvYKA
+EOcLKvbdJSxaTMwl
+DoDLKvbdANHxrvzY
+EObkKvbdcTDKtDia
+EPDKjvbdrWolDJZR
+DoDKjvbdsQVnicVf
+EPCjjvbdYSlAlsoY
+EPCkKvbdJYUBhMRQ
+DncLKvbdtlXwBUBX
+EObjjvbdVrOYBeMD
+EPCjjvbdcJNJkGWx
+DncLKvbdjKGHjNXr
+DncKjvbdRMwayOUz
+EObjjvbdzdzOzdyp
+DnbjjvbdNHColpVL
+DoDLKvbdNddThiLE
+EPDKjvbdFjdsCgmV
+DnbjjvbdTJZjRABM
+DncKjvbdOTTugFVQ
+DncLKvbdVYgszLPO
+DncKjvbdEARhlzWw
+EPDLKvbdUGzmkvvF
+DoDLKvbdmRyVZsEJ
+EObjjvbdptUHRqjt
+EOcKjvbdJpzFOeme
+DnbkKvbdMgDPmPtk
+EOcKjvbdhzUfMRNf
+DoDLKvbdpyPHgQdY
+DoCjjvbdZjShQHCG
+EOcKjvbdOTTvGeVQ
+EPCjjvbdRacdkiZL
+DnbjjvbdzitoodTU
+EOcKjvbdxxIjCPyk
+EObjjvbdunszqLPU
+EObjjvbdwjwDgzzG
+DnbkKvbdUyHtZkOn
+DnbjjvbdqvpMChyR
+DnbjjvbdmIctRUrB
+EObkKvbdNHCpMpUk
+DoDKjvbdeFPSCXCj
+EOcKjvbdtvOXjRTA
+DncLKvbdZGvdAPSi
+DoCjjvbdQcbaPpcr
+DoDLKvbdVUMselVj
+DnbjjvbdVgxWXgYz
+DoDLKvbdjAQHBQHK
+EOcKjvbdxxJKCPyk
+DnbkKvbdQdDApQcr
+DnbjjvbdqrUjmjaN
+EOcKjvbdJzofYEAN
+DoDLKvbdJvVGEFHJ
+EObkKvbdJcJbpjDY
+EPDLKvbdhanbdwRR
+EObkKvbdiZtfLqOG
+DoCjjvbdeOdsLTsr
+DoCjjvbdSLZFuGjs
+DoCjjvbdqTsfrRjt
+EObjjvbdACqxKZhp
+EPCjjvbdxZhFexEr
+EPDKjvbdiBoCeXRR
+DoDKjvbdqFcdtVaI
+DnbkKvbdkClLQgVH
+DnbkKvbdZQmEhldq
+DnbjjvbdQYmAGrqj
+DnbjjvbdiLddNuDZ
+DoDLKvbdsQWOjDWG
+EPDKjvbdVqnXaeLc
+DnbjjvbdwNWANEFN
+EPCkKvbdsBfNMHKy
+EOcLKvbdKQzFOfOF
+DoDKjvbdHELVibJj
+EPDKjvbdcImJkFwY
+DncKjvbdIwtBgkqQ
+EObkKvbdANHySvyx
+DoDLKvbdpxnhGqEY
+EPCjjvbdrafNMHKy
+DoDLKvbdSQTfiecw
+DnbkKvbdiMEdOUcZ
+EObjjvbdQmYCYnUz
+EPDLKvbdWIYWXfxz
+EPCjjvbdNeEThiLE
+EObjjvbdHDkWJaij
+DncKjvbdMgDQNPuL
+DncKjvbdKWUedFGi
+EPDLKvbdJYUCIMRQ
+EOcLKvbdRacdkhyL
+EPCkKvbdSBdEkhyL
+EPCkKvbdMRwMzUpz
+EPDLKvbdkxrqsYft
+EObkKvbdRkYetgLT
+EPCkKvbdNrsvHFVQ
+DoCjjvbdqiAKFNOe
+DoDKjvbddwystRez
+EOcKjvbdrylQTBHn
+EPDKjvbdDjHjWXjA
+EObjjvbdCIkCLJGK
+DnbjjvbdqwPlDJYq
+EPCjjvbdnVUzLKRf
+EOcLKvbdUxhUZjnn
+DnbjjvbdRpUHJecw
+DnbjjvbdjhGlFfNk
+EObkKvbdJKEAKPgE
+DoDLKvbdIidAKPgE
+DncKjvbdCSaCtGXS
+DoCjjvbdIidAKQHE
+DnbkKvbdFjdsCgmV
+DoCkKvbdGKeTCglu
+EOcKjvbdEzspeMDJ
+EOcLKvbdqUTgSSKt
+DoCkKvbdnBivwnmu
+DncLKvbdJcJcRKCx
+EPCjjvbdVwJXucdg
+DnbjjvbdKVuGEFHJ
+DncLKvbdnVUzKjSG
+DoCkKvbdqGDeTuaI
+DnbkKvbdLFfICBQu
+DnbkKvbdZjTIQGbG
+DoDLKvbddBrlrATm
+DncKjvbdYNqAXtut
+DnbjjvbdURROtuHm
+EObjjvbdxmrgxSiD
+DoCkKvbdjJfHjMwr
+DncLKvbdNwoVzdOU
+EPDLKvbdyTNhlqbH
+EObkKvbdiMEcnUby
+DoDKjvbdJcKCqJbx
+EPDLKvbdNrtVgEtp
+DncKjvbdjEkGtoAO
+DoDKjvbdNVSrKmAX
+EOcLKvbdxmsIYTIc
+EObkKvbdcTDKtDjB
+EPDLKvbdxsOIlrCH
+DnbkKvbdbrbjsdKB
+DoCjjvbdpfEEtWAh
+DoCkKvbdMowqVmfs
+EPCkKvbdeATqMxJf
+EObkKvbdjJehJmYS
+EPDKjvbdxmrhYSiD
+EObjjvbdjbkkQgUg
+DoCjjvbdYlRdUNlN
+DoDLKvbdiHKDZWJu
+DoDKjvbdpedEsvAh
+DoCkKvbdEuyPomJe
+EPCkKvbdhtyeWrVC
+DncLKvbdbAvEfQQX
+DnbjjvbdTkvPBWPJ
+DncKjvbdYlRdUOLm
+DncLKvbdCIjajiGK
+EPDKjvbdUtNTfLuj
+DnbkKvbdKVuFdEgJ
+DoDKjvbdfVzwoizs
+EPCjjvbdySmiMrBg
+EPCkKvbdrpWPJcVf
+DoDKjvbdcImJjewY
+DoCkKvbdkVvnECYX
+DncKjvbdWRnYCEkc
+DoDKjvbdCIkBjhfK
+EObkKvbdmIdURVSB
+DoCkKvbdTppoUuHm
+EPDLKvbdUQqOtuHm
+DnbkKvbdhgKDYvJu
+DnbkKvbdkHgLfFmk
+EPDLKvbdCDoaVjMf
+EPCkKvbdehKvSNqH
+DncKjvbdNeEUJJLE
+DncKjvbdlhdTqVSB
+EOcKjvbdEuxpPmJe
+DncLKvbdqceIpNua
+DnbjjvbdnVVZjjRf
+DnbkKvbdKDJcRJbx
+EObkKvbdnHEwlmgZ
+EOcLKvbdFWZQQMjF
+DoDKjvbdKWUedEgJ
+DoDLKvbdmozZVkZC
+DoCkKvbdZdxGzhJC
+EObkKvbdGQATWffZ
+EPCkKvbdJuuGDeHJ
+DoCkKvbdiGibxvJu
+DnbkKvbdBraDUGXS
+EPDLKvbdiHKDYvKV
+DnbjjvbdZxcjODMS
+DnbkKvbdnGdwlmgZ
+DoDKjvbdkxsRrxgU
+EOcKjvbdrzMQTAgn
+DncLKvbdjhHLfGOL
+DnbjjvbdQvnEClID
+DoDKjvbdqdEhomvB
+DoDLKvbdGdKvKCJj
+DnbjjvbdqvpLbiYq
+EObjjvbdsPvOjCuf
+DoDLKvbdVqnXbElD
+EPDLKvbdeEoRbXCj
+DoCkKvbdyYJKBoyk
+DoDLKvbdlhdURUqa
+EPDLKvbdYkqdTnMN
+DoCkKvbdnGdwmNgZ
+EObkKvbdGGKSOIsq
+EObjjvbdLLAgvAJy
+DnbjjvbdajlFnmcA
+DoDLKvbdiifHimYS
+EPCjjvbdnPzYukYb
+EPDLKvbdVYhTyjnn
+EOcLKvbdfNFwHNJk
+DoCjjvbdbrbkTcia
+DncLKvbdRkZGVHLT
+EObkKvbdSQUHKFdX
+EOcKjvbdSKxeuHKs
+DncKjvbdFxuUaDwb
+DoCkKvbdaSGDHtFk
+EPDKjvbdZyDimcLr
+EObjjvbdiGibxvJu
+EPCkKvbdDwwktTsl
+EPDKjvbdRadEkiZL
+EPDKjvbdmgEwlmfy
+DncLKvbdaogHDkzd
+EOcLKvbdjuvmdCXw
+EPDKjvbdqwPlCiYq
+DoDKjvbdLBLHNBxR
+EObjjvbdeFOrBvbj
+EPDKjvbdFyVVAdYC
+EPDLKvbdKNADygUa
+DncKjvbdbVCGxLUI
+DoCkKvbdJSyArmXl
+EObkKvbdQvnDbkgc
+EObjjvbdrEEiQOWB
+EOcKjvbdZMSDtOLm
+DoDKjvbdQvmccLhD
+EPCkKvbdrzMQTBHn
+EPDKjvbdMgCpNQUk
+DoDKjvbdmbJwYPOV
+EOcKjvbdgGLymgHA
+EObjjvbdsrqsYzFD
+EPDLKvbdrNZiyLgi
+DnbkKvbdiiegimYS
+DoDKjvbdqwQLcJYq
+EObkKvbdaNLCSuNH
+EPCkKvbdnUuZkJqf
+EPCjjvbdSCEEkiZL
+DncLKvbdVZHszKnn
+DnbjjvbdUtMsfLuj
+DoDKjvbdxmrgwriD
+DoCkKvbdxxJKBpZk
+EObkKvbdZMRdUNlN
+EObkKvbdbPgHDkzd
+EObkKvbdqqtjnLAm
+EPDKjvbdURROuUhN
+DoDKjvbdCWzdJFPv
+DoDLKvbdMSXMytpz
+DnbjjvbdqlyjZMHi
+DoDKjvbdbsDLUDia
+EOcLKvbduVnXiqTA
+DoCjjvbdDxYLsssl
+DoDLKvbdyqPMiJwA
+EObkKvbdeOdsLUUS
+EOcKjvbdEuyQQMjF
+DoDKjvbdEztQeMDJ
+EPCkKvbdGZVVBDxC
+DnbkKvbdnGdxNNgZ
+DoCkKvbdcIljLFvx
+DoCjjvbdYqMdhmEq
+EPDLKvbdgKfzbfAE
+EPCjjvbdJcKDRJcY
+EOcKjvbdOFDtJJLE
+DncKjvbdiLdcmuDZ
+EObkKvbdrWpLcJZR
+DnbkKvbdVAaqTQrZ
+DnbjjvbdFkFTChMu
+DncKjvbdaaWEepQX
+EPCkKvbdpedEsvAh
+DncKjvbdjAQGaPfj
+DoDKjvbdbUbHXkTh
+DoDKjvbdRjyFtfkT
+EOcLKvbdOTTvHEtp
+DoCjjvbdRkYfVGjs
+DncLKvbdzoQRFCkx
+DncKjvbdrMzJyMHi
+EOcKjvbdULvPBWOi
+EOcLKvbdzdynzdzQ
+EPCjjvbdtumxJpsA
+DoDLKvbdwMvAMcdm
+EOcLKvbdqceIonVa
+EObjjvbdOEdUIiKd
+EObjjvbdHELVjBij
+EObjjvbdqcdiPmvB
+DoCjjvbdJvVFdFGi
+EPDKjvbdWRmwaeLc
+EPDKjvbdZxdJnDMS
+DoDKjvbdZxdJnDMS
+EObjjvbdxUldpxkn
+DnbkKvbdSLYetfjs
+EPDLKvbdYqMeIldq
+DoCjjvbdrMyjYlIJ
+EObkKvbddxZtTqez
+EPCkKvbdWSNxCElD
+DoDKjvbdWWiYVcdg
+DoDLKvbdqGDdsvAh
+EOcLKvbdhzVFlRNf
+EOcKjvbdaNLCSuNH
+DnbkKvbdkHgMFfNk
+DnbkKvbddePRbXDK
+DncKjvbdNVTSKmAX
+EObkKvbdhzUfLpmf
+EOcKjvbdZMSDtNkm
+EPDKjvbdTqROtuHm
+DoCkKvbdddnqbXCj
+DoDKjvbdliEURVSB
+DncKjvbdtvNxKQsA
+DnbjjvbdqceJQOVa
+EPDKjvbdpyOggQcx
+EOcKjvbdtcDUvuoP
+EObjjvbdrWpMChxq
+EPDKjvbdGYttaEYC
+EObjjvbdiifIKNYS
+DoCjjvbdZyEJmcMS
+EPDLKvbdKQzFOfNe
+DoCkKvbdqYoIGpdY
+EPDLKvbdxwhibPzL
+EPDKjvbdRadElJYk
+DoDLKvbdtkwwAtAw
+EPCjjvbdDjHjVxKA
+EPDKjvbdrzLosBIO
+EPCkKvbdBdPaVimG
+DoCjjvbdrafMkfjy
+EPDKjvbdNGcPmQVL
+DoDLKvbdVviYVdFH
+EPCjjvbdkVwODaxX
+DncKjvbdkMbMZeGo
+EOcLKvbdfkGzbfAE
+DnbkKvbdpyOhHQdY
+DoDKjvbdQdCaPqES
+EObjjvbdEKHiuxKA
+DnbjjvbdpxnhGpcx
+DnbkKvbdkxsSSxgU
+DnbjjvbdURQnuUgm
+DoDLKvbdTukpJtBR
+EPCkKvbdqAiFAWgd
+DnbjjvbdgGLymfgA
+EOcLKvbdyYIibQZk
+DoDLKvbdWHxVxGxz
+EPDLKvbdFyVVAdXb
+DnbkKvbdrRuKnKaN
+DoDLKvbdTpqOttgm
+EPDKjvbdLhbLqYAS
+DoCjjvbdHELVjCKK
+DncLKvbdfSBWzlDP
+DoCkKvbdRDcBPpdS
+DoDLKvbdsQWPJcVf
+EPCkKvbdySmiMrCH
+EPCkKvbdbUbHXjtI
+DoDLKvbdUtMsfLuj
+EPCjjvbdEvZQPmKF
+EObjjvbddeOqbXDK
+EPDKjvbdkClKqGtg
+DncKjvbdqiAJdmPF
+EOcLKvbdlrZUyrci
+EOcKjvbdbBVeFpPw
+EOcLKvbdULvPBWOi
+EPCkKvbdcJMjLFwY
+DnbjjvbdZtIhxcsO
+EPDLKvbdSPtHJfDw
+EObkKvbdaNLBsUlg
+DoDLKvbdqvpLcIxq
+DoCkKvbdpxoIHQcx
+EPCkKvbdlZTRsZGt
+DoCjjvbderBWzkcP
+EPDLKvbdZtJIxdSn
+EOcLKvbdmoyyWKxb
+DoDLKvbduaDxroEh
+EPDLKvbddoErkTtS
+DncKjvbdnPzYvKxb
+EObjjvbdsZlPsAhO
+EPDLKvbdjJfHjMxS
+EOcLKvbdbsDLUDia
+DncLKvbdMuTSLNAX
+EPDLKvbdemGWfmKL
+EObkKvbdKefHbBQu
+EOcLKvbduVnXjRTA
+DnbjjvbdGZVUaEYC
+EOcKjvbdkNCMZeGo
+EPCkKvbdGKeSbgmV
+DoDKjvbdqrVLNjaN
+DnbjjvbdEASIlzWw
+DnbjjvbdeOdrkUUS
+DncKjvbdDjIJvXjA
+DoCjjvbdqGEFUWAh
+EPCjjvbdQcbaQRES
+DnbkKvbdhtydwSUb
+DoCkKvbdMuTRjmAX
+DnbjjvbdJutfEEfi
+EPCjjvbdzGxlAMeX
+DncLKvbdIHGyyYYH
+DoDLKvbdxUmEqZLn
+DnbkKvbdNHCpMotk
+DnbjjvbdFyVVAcwb
+EPCjjvbdShzJqABM
+DnbjjvbdcyxoxZRC
+EPCjjvbdqquKnLBN
+DncLKvbdcIlikFwY
+DoCkKvbdeOeSkTsr
+EOcLKvbdYpldhldq
+EPDLKvbdQYmAGsRj
+DoCkKvbdzGyMAMeX
+EPCkKvbdqrVKnLBN
+EObkKvbdxUldpxlO
+EPCjjvbdfIKuqnRH
+EPDKjvbdFWYpQMjF
+EPDLKvbdOFEUJJKd
+EOcLKvbdHEKvKBij
+DoDKjvbdjcMLRHUg
+EPCkKvbdWXIwudEg
+DncLKvbdgPazvcwh
+DnbjjvbdnVUykJrG
+EPCjjvbdxxJJbPyk
+DncLKvbdjJehKMxS
+DncKjvbdEzspdkbi
+EPDKjvbdrpVnjDWG
+DnbjjvbdVrOYCFLc
+DoDLKvbdMfbpMotk
+DncKjvbdbhljLGWx
+DncKjvbdxrmhlrBg
+EOcKjvbdbKlGPODA
+DoDKjvbdJvUfEFHJ
+EPCkKvbdySnIlqag
+EPDKjvbdVAbQrpqy
+DnbjjvbdrykosAhO
+DnbkKvbdKfFhCBQu
+DnbjjvbdEXwktTsl
+DoDKjvbdDoDLLXCd
+EObkKvbdvwMAvAvV
+EObkKvbdXsLaNUOx
+DnbkKvbdRDcBQRES
+EOcLKvbdZisIPgCG
+DoDKjvbdpfEEtWBI
+DoDKjvbdfoazwDwh
+EPCkKvbdFpASvffZ
+EObjjvbdRWnDblHc
+DoCkKvbdNxOuzdOU
+DncLKvbdYlSDtOLm
+EPCjjvbdjbkjqHVH
+EPCkKvbdrMzJxkgi
+EPDKjvbdCIkBjhfK
+EPCkKvbdUslsekvK
+EOcKjvbdFejRnJUR
+EPDLKvbdNHColotk
+EPCjjvbdUxgtZjnn
+DoDKjvbdEOcLLXCd
+EPCkKvbdkHflGFnL
+EPCjjvbdwygfFxEr
+DncKjvbdeOdrjtTr
+DoDLKvbdqTtHRqjt
+EPDLKvbdQwNdCkgc
+EPCkKvbdhzVGLpnG
+DoDKjvbdxwiKCPzL
+EPCkKvbdZirhQGbG
+DoCjjvbdqrUkOKaN
+DoDLKvbdlrZUysEJ
+DoCjjvbdqFdFUWAh
+DnbjjvbdyYJKCPzL
+DncKjvbdxUldpyMO
+EPCjjvbdvAcyTOeI
+EObjjvbdLFegaaRV
+DncKjvbdemFvgNKL
+EOcLKvbdjcLjqHVH
+DoDKjvbdRMxCYnUz
+EPDLKvbdRjxfUfkT
+DoDLKvbdiMEdNuDZ
+DoDLKvbdZRMdhmEq
+DoDLKvbdqlyiyLgi
+EObjjvbdiiehJmYS
+DoCjjvbdwuMeRYlO
+EPDKjvbdqquKmkAm
+EOcKjvbdlrYtysDi
+EPDLKvbdliETqUrB
+EObjjvbdePErkTsr
+DoDLKvbdfHjvRnQg
+EObjjvbdRXOECkgc
+EObkKvbdMpXqWOGs
+DncKjvbdEJhJvYKA
+DoCkKvbdVrOYBeMD
+EPDKjvbdTkvPBWOi
+EOcLKvbdjuvmcbYX
+DncKjvbdMfcQMouL
+EOcLKvbdMpXpvOHT
+DoCjjvbdiLdcmtcZ
+DnbkKvbdiHJcZWJu
+EPDLKvbdTqQnuUgm
+DncKjvbdLGFgbBQu
+EPDKjvbdNdctIiLE
+EPDKjvbdZxdKODLr
+DoDKjvbdSZjITCvA
+EPCjjvbdDwxMUTsl
+EPCkKvbdySmhmRag
+EOcLKvbdSPtHKGDw
+DoDKjvbdmIctRUqa
+DoDKjvbdaRfChTek
+DncLKvbdyNrhXsIc
+DncLKvbdJTZBSlxM
+DoDKjvbdFeirOIsq
+DnbjjvbdJutedFHJ
+DnbkKvbdUsltGMWK
+DnbkKvbdbhljLGWx
+EPCjjvbdirziTLJz
+EOcKjvbdnPzYvKyC
+DoDKjvbdkDMLRGtg
+DncLKvbdyzeNqhIh
+EPCjjvbdYTMAmUPY
+DoCkKvbdgGMZnHHA
+DncLKvbdlZSqsYft
+EOcLKvbdZjShQHCG
+DnbjjvbdjhGlGGNk
+DoDLKvbdkxsRryGt
+DoCjjvbdZyDjNbkr
+DnbkKvbdNeEUJIjd
+EOcKjvbdxxJJbPyk
+DoDLKvbdRbDeMIxk
+EObjjvbdrDeJPnWB
+EPCkKvbdrXPkbiYq
+EPCjjvbdeFPRbWbj
+DncLKvbdHffyxxYH
+EPDKjvbdcyyQYZQb
+DoCkKvbdNsTvGeUp
+EPCkKvbdfpBzwDxI
+EPCjjvbdqTtHRrLU
+EPCkKvbdhgJbxvJu
+EOcKjvbdkxsRryGt
+EPCkKvbdZshhyETO
+DnbkKvbdrWpLbiZR
+EObkKvbdnHExMmfy
+DnbkKvbdbUbGwkTh
+DnbkKvbdnHExMnHZ
+EObjjvbdZnmiFEyj
+EObkKvbdSQUGjGDw
+EPCkKvbdqTtGrRkU
+EObjjvbdcImKLGXY
+EObkKvbdShzJqAAl
+DncLKvbdGGJqnIsq
+DnbkKvbdehKuqmpg
+DncLKvbddeOrCXDK
+EOcLKvbdRMwbYmtz
+DnbjjvbdgFlZmgHA
+DnbkKvbdyOSgxTJD
+EOcLKvbdQZNAGsSK
+DoCkKvbdRMwayNtz
+DncLKvbdezvYeItX
+EOcLKvbdVAapsQrZ
+DoCjjvbdcImKLFwY
+DoDKjvbdTqQnttgm
+DnbjjvbdOEdUJIkE
+DoDKjvbdeYZssqez
+DnbjjvbdZjSgpHCG
+DoCkKvbdTvMPisaR
+EOcKjvbdZjSgofaf
+EPDLKvbdfVzwoizs
+DnbjjvbdCSaCsewS
+EPDLKvbdFVyPpMjF
+EObkKvbddjJrVtzn
+DnbjjvbdyOSgxTIc
+EOcLKvbdrovPKDVf
+DnbjjvbdxZhGGXeS
+DncLKvbdbLLeoNcA
+EOcKjvbdMfbomQUk
+EPDLKvbdaRebhTfL
+DoDLKvbdoAKztHcn
+EOcLKvbdGckWJbJj
+DncLKvbdqmZjYlHi
+DncKjvbdZyDinDLr
+DoCkKvbdxwhibPzL
+DnbkKvbdZoOJFFZj
+EPDLKvbdYpmEiMdq
+DoCkKvbdiUzFWquC
+DnbjjvbdsPvPJcVf
+DncKjvbdDwxMTssl
+EObkKvbdZQleJNEq
+DoDLKvbdWSNxBdkc
+DoCjjvbdcSbkTcia
+EOcKjvbdqvolChyR
+DnbjjvbdqlzJxlHi
+DoCjjvbdlrZUzTEJ
+EPCkKvbdGdLWJbJj
+EObkKvbdzoPqFDLx
+DncLKvbdANIYrwZx
+EObjjvbdSPsgJfEX
+DoCjjvbdbiNJjfWx
+DnbkKvbdMfbpNQVL
+EObkKvbddePRbXCj
+EPDKjvbdShzKRAAl
+DoDKjvbdnPyxukYb
+EObjjvbdVZITzKoO
+EPDLKvbdZyDinDMS
+EPCjjvbdYpldhmFR
+DoCkKvbdZjTIPfaf
+EObjjvbdqdEiPmua
+DnbkKvbdRadEkhxk
+EPDLKvbdzjVPpDrt
+DnbkKvbdaMkBsUlg
+DncLKvbdMpXpunGs
+DoDKjvbdUxgszLPO
+EPCkKvbdiiegilxS
+DoCjjvbdEOcKkWbd
+EOcLKvbdcTDLUEJa
+EPDLKvbdZtIiYcrn
+DoDLKvbdmttyjirG
+EPDLKvbdGdLVjBjK
+DncLKvbdDigjVxKA
+EPCkKvbdelfWflik
+DoDKjvbdOTUVfdtp
+DncKjvbdTlWOaVni
+EPDKjvbdrpWOibvG
+EPDKjvbdfRaWzlCo
+DncKjvbdlrYuZrdJ
+DoDKjvbdIsZBSlwl
+EPDLKvbdqquLOKaN
+DnbjjvbdJmAEZgUa
+EPCkKvbdcImJkFvx
+DncLKvbdkxrqsYft
+EPCkKvbdUWLojTaR
+DoDKjvbdnGeXlmfy
+DoCkKvbdiMFDmuCy
+EPDKjvbdauCHXjtI
+DoCjjvbdBsAcUGXS
+DoDKjvbdACrYJyhp
+DoDKjvbdsZlPsBHn
+DoDLKvbdjJegimXr
+DoDKjvbdWXIwvDdg
+DncKjvbdelewHNJk
+EObkKvbdyTOJMrCH
+DoCkKvbdNddUIiKd
+DoCkKvbdRyjHrbvA
+DoCjjvbdiGjCyWKV
+DoDLKvbdhlFEOVDZ
+EPCkKvbdQdDAoqDr
+DoDKjvbdBiLBjhej
+EOcKjvbdqlyjZLgi
+DncLKvbdtSrTYzFD
+DoCkKvbdrMyjYlHi
+EObjjvbdhficYuiu
+DoDKjvbdfekymgHA
+EOcLKvbdiifHjNXr
+EObjjvbdIwsaglQp
+DoCjjvbdCIkBkIfK
+EPDKjvbdaSFcHsfL
+DoDLKvbdMgDPlpUk
+EPDKjvbdqYnggQdY
+DoDKjvbdaSFbgsek
+DoCjjvbdiZtekqNf
+EPDLKvbdkClKpftg
+DoCkKvbduMYWaUAw
+EObkKvbdtTSTYydc
+DnbjjvbdptUGqrKt
+EObjjvbdYlRctNlN
+DncKjvbdMgDQNPtk
+DncLKvbdILaznXQk
+DoDLKvbdiCPDFWpq
+DoCkKvbdiGicZWKV
+DncKjvbdFjdrbglu
+DncLKvbdKWUfDeGi
+DoCjjvbdVhXuwgYz
+DoDKjvbdhtzFWquC
+EPCjjvbdRpTfiedX
+DoCkKvbdKVuFdEfi
+DoDLKvbdbBWEfPow
+DoCkKvbdZyDjODLr
+DncLKvbdeAUQmXif
+DoCkKvbdIidAKQHE
+EPCkKvbdTqROuVIN
+DncKjvbdRXODcMID
+DoDKjvbdkyTRsZHU
+EPCjjvbdxnTIXrhc
+EObjjvbdJzofXdAN
+EOcKjvbdiBncFWpq
+EObkKvbdYORAXuVt
+DnbjjvbdiMEdNtby
+EPDKjvbdVrOXbFMD
+EPCkKvbdAMgxrwZx
+DoCkKvbdtbbuXVoP
+EPCjjvbdDoCkKwCd
+DncLKvbdVBBpsRRy
+DoDKjvbdemGWgMik
+EObkKvbdeEnqbXDK
+EPCjjvbdhanbdvqR
+DnbkKvbdmaiwYOnV
+DoCjjvbdcJMjLGXY
+DnbkKvbdIryArlxM
+EPCjjvbdtkwvaUAw
+DnbkKvbdxZgefYFS
+EPCkKvbderBWzlDP
+EPCjjvbdNxPVzdOU
+EPDKjvbdaSGDHsek
+EOcKjvbdqcdhpOVa
+EPCkKvbdxmsHxShc
+DoDKjvbdDncKjwDE
+DoCjjvbdYpmEhmFR
+DncKjvbdaRfCgsfL
+EObjjvbdegjurNpg
+DnbkKvbdjhHMFenL
+EPCjjvbdMfcPmQUk
+EOcLKvbdACrYKZhp
+DoDKjvbdffMZmgHA
+DoCjjvbdaaVeGQQX
+EOcKjvbdSCDdkiZL
+EOcKjvbdqwPlCiYq
+DoDKjvbdajlGPODA
+DncLKvbdJYTbHkpp
+DncLKvbdtcDVXWOo
+EPCjjvbdEXxLtTsl
+EPCjjvbdJuteceGi
+DnbjjvbdDoCkLWbd
+DoCkKvbduCbtwWOo
+EPDLKvbdauBgYLTh
+EPCjjvbdOXoVzcmt
+DoCkKvbdRMxByOUz
+DoCjjvbdqYoIGqDx
+EPCjjvbdNGbpMpVL
+DoCjjvbdJpzFOfNe
+EOcKjvbdVAapsQrZ
+DncKjvbdpxoIHQcx
+EOcKjvbdRaceLiZL
+DncLKvbdtcCuWvOo
+EObjjvbdbBVeGPow
+DnbjjvbdKyRKSzuG
+EOcLKvbdFyVUaEYC
+EPDKjvbdkCkkRHUg
+EObkKvbdKaKfmBxR
+DoDLKvbdbUbGwjsh
+DnbjjvbdrovOjDVf
+EPCjjvbdZsiIyDsO
+EObjjvbdRDbaPqDr
+EOcKjvbdnBivwnmu
+EPCjjvbdYTMBMsoY
+DoDLKvbdxKwEHzzG
+EPCkKvbdqTsgRqkU
+EPDKjvbdfMfWgNKL
+DnbkKvbdznpREbkx
+DncKjvbdJXtCHlRQ
+EPDLKvbdGYuVBEXb
+EPDKjvbdZLrEUOMN
+EPDKjvbdtcCtvuoP
+EObjjvbdXsLaNUPY
+EPDLKvbdyOTIYSiD
+EObjjvbdsrrTYyeD
+EObjjvbdZisHpGaf
+DoDLKvbdvOszqLOt
+DncLKvbdaMjbSuNH
+DncLKvbdYTMBMsoY
+EPDKjvbdwzIGFxFS
+EPDLKvbdmRyUyrci
+DncLKvbdTkvPBWOi
+EPCjjvbdNdcsiIjd
+EPCkKvbdEzspdkbi
+EObkKvbdrovOicVf
+DoDKjvbdhbObeXQq
+DncKjvbdZnnIeFZj
+EObkKvbdRECaPpdS
+EOcKjvbdnGeXlnHZ
+EPCjjvbdauCGwjsh
+EPCjjvbdczYpXyRC
+EOcLKvbdDihJuxKA
+EOcKjvbdkVwNcbXw
+EObjjvbdbsCkTcia
+DoCkKvbdfMewHNKL
+DoCjjvbdxZgeexEr
+EOcLKvbdiBoDEwQq
+DnbkKvbdpstHSSKt
+EOcKjvbdQvmdClHc
+EPDKjvbdIxUBhLqQ
+EObkKvbdZtJIyESn
+EPCjjvbdtumwjQsA
+DoCjjvbdNPxQunHT
+EOcLKvbddndrkUTr
+EObjjvbdCTBCsevr
+EOcKjvbdiUzEwRuC
+EPDKjvbdRyigrbvA
+DoCjjvbdezvYeJTw
+EOcLKvbdVgxVxGxz
+DnbjjvbdZeXfzhIb
+DncKjvbdxZgfFweS
+DoCkKvbdKxqKSztf
+DncLKvbdpyOggREY
+EPDLKvbdXrlBNUOx
+EPCkKvbdqwPkbiZR
+EPDLKvbdbsCjscia
+DoDKjvbdnGeYMmgZ
+EOcLKvbdUsmTfLvK
+DnbkKvbdjuwOEBxX
+DnbjjvbdTAFJICPE
+DncKjvbdEuxoomKF
+EPDKjvbdeOdsLTsr
+EObkKvbdZshiYdSn
+DncKjvbdcTDKscjB
+DncLKvbdvwMBWAvV
+EOcKjvbdVwIwudFH
+EPDLKvbdlZTSSxgU
+EOcKjvbdMgColotk
+EOcLKvbdZdxGzgiC
+DnbjjvbdULuoBWOi
+EObjjvbdiCObeXQq
+EPDKjvbdNUsRkNAX
+DoCjjvbdZxcjOClS
+DncLKvbdiUzEwSVC
+DoDLKvbdvlvAMceN
+DoDLKvbdqcdhpOWB
+EObkKvbdCSaDUGWr
+DoCkKvbdssSTYydc
+DoCkKvbdnGdxMmgZ
+DoCkKvbdHELWJbKK
+DoDKjvbdKefHbApu
+EObkKvbdVqmwbFLc
+DoCkKvbdUtNTekuj
+EPDLKvbdTlWOaVni
+DoCjjvbdDxXkstUM
+EPCkKvbdpxoHfqEY
+EPDKjvbdmSYtzTEJ
+DoCjjvbdddnrCXDK
+EPCkKvbdZjTHpGbG
+DncLKvbdhzVGLqOG
+EPCjjvbdZjSgogBf
+EPDLKvbdkDLjqGuH
+DncLKvbdxUmFRZLn
+EPDLKvbdjhHMFfNk
+EPCkKvbdZjTHpHBf
+EObkKvbdegkVqnQg
+EPDLKvbdGYttaEXb
+EObjjvbdZdwfzhJC
+DoCkKvbdGQASwHFy
+EPDKjvbdkVvnDbXw
+EObkKvbdJYTagkqQ
+DoCjjvbdMSWlzVQz
+DoCjjvbdnGeYMmfy
+DoDLKvbdADRxKZiQ
+EObkKvbdZLqdTmkm
+EPCkKvbdFeirOItR
+EPCkKvbdRjyGVGjs
+DncLKvbdiMFDnUcZ
+EObkKvbdVAaqSpqy
+EPCkKvbdULunaVni
+DnbkKvbdcImKKevx
+DoCjjvbduaDyTPFI
+EPDKjvbdKQydoFnF
+EPCjjvbdozmcjwoA
+DoDLKvbdZLqdUNlN
+DoDKjvbdJXsbHkpp
+DoCkKvbdelfXHNJk
+EObjjvbdeFOqavcK
+EPDLKvbdqlyjZMIJ
+DoCjjvbdUtMsekvK
+DoCkKvbdIxUBhMQp
+EOcKjvbdemGWgMjL
+DoCkKvbdwuMeQyLn
+DncKjvbdkClKpgVH
+DoDKjvbdfNFvflik
+DncKjvbdhkdcmuCy
+DoDLKvbdCJKakIfK
+DnbkKvbdSQTgJfEX
+DnbkKvbdkIGlGFmk
+DoDKjvbdySmhlqbH
+DoCjjvbdGdLVibJj
+EPCjjvbdSLZGUfkT
+EPDLKvbdSKxfVHKs
+DoDKjvbdGLFSbhMu
+DoCkKvbdqFcdtWAh
+EOcLKvbdbVBfxLUI
+DoDKjvbdcScKsdKB
+DnbkKvbdVwJYWEFH
+EPCjjvbdGQASwHFy
+DnbjjvbdqUTfrRjt
+EPDLKvbdEYYMTtUM
+DoDLKvbdfNFwHNKL
+EObkKvbdsQWPJbvG
+EOcKjvbdIsYaSmYM
+EPDKjvbdBdQAuilf
+DnbkKvbdrounibvG
+EObkKvbdiCPCdvqR
+EOcLKvbdBsAbsfXS
+DoCjjvbduDDVWuoP
+EPCkKvbdbsCjtEJa
+EOcKjvbdcTDLTdKB
+DoCjjvbdXGYytAPT
+DnbjjvbdePFTLTsr
+EObkKvbddoErjssr
+EPCkKvbdcTDKsdJa
+EPDKjvbdjgflGFnL
+EObjjvbddeOqbWcK
+EObkKvbdACqwizJQ
+EObjjvbdHgGyyXxH
+DoCjjvbdqlzKZMHi
+DnbjjvbdhfibxvJu
+DoDKjvbdSCEFLiZL
+EPCjjvbdSCEFLiYk
+EObkKvbdiLdcmuDZ
+EObkKvbdzGyMAMeX
+EPDKjvbdVYhTzKoO
+EPCkKvbdxrmiNRag
+DoDLKvbdjKGHilxS
+EOcKjvbdhWyAzzAJ
+EPDLKvbdMfcQNQVL
+DncKjvbdYkqdTmlN
+DoDLKvbdjJfIJlwr
+EOcLKvbdZeYGzghb
+DncLKvbdJuuFceGi
+EPCkKvbdhzUelRNf
+DnbkKvbdBhkCKhej
+DoDLKvbdhbObeXRR
+DnbkKvbdzHZMAMdw
+DoDKjvbdZxcjNblS
+DoCjjvbdDwwksstM
+DoCkKvbdUVkpJtAq
+DoDLKvbdaaWEepPw
+DncLKvbdGdKvJbKK
+DoDLKvbdTulQJtBR
+DoDKjvbdqceJPnVa
+DnbkKvbdvAdZTOeI
+EOcKjvbdVAbRSqRy
+EPCkKvbdTqQnuVHm
+DoCjjvbdwNWANDeN
+DnbkKvbdZtIiYdSn
+EPCjjvbdPIAXyAZB
+EPCjjvbdZoOIeEzK
+DoDLKvbdmJETqUrB
+DoCjjvbdOFDtIiKd
+DnbkKvbdqvolDIxq
+DnbjjvbdmgFYNNfy
+DncLKvbdieLHUoAO
+EPCkKvbdDnbkLWcE
+DoCjjvbdmJETpuSB
+DncLKvbdiiegjNXr
+EPDKjvbdZQldiMeR
+EOcKjvbdZHXEAPTJ
+EObkKvbdWHwvXfxz
+DnbkKvbdxUleRZLn
+DnbkKvbdtvNxKQsA
+DoDKjvbdOStWHEuQ
+DnbkKvbdsBellHLZ
+DoDKjvbdsCFllGkZ
+EPDKjvbdjhGlGGOL
+DncKjvbdxxJKBoyk
+DncKjvbdrXPkcJYq
+DoCkKvbduVnXipsA
+DoDKjvbdjKGHjMwr
+DoDKjvbdbBWEfPpX
+EOcKjvbdznoqEcMY
+DoCkKvbdySnJMqbH
+DoCjjvbdlrZVZsDi
+EPDLKvbdKfFgbApu
+DoDLKvbdZRMdiNFR
+EObjjvbdpeceUWAh
+EObkKvbdRotHKFcw
+DncKjvbdiZuFkpmf
+DoDKjvbdnGdwmNgZ
+DoDKjvbdMoxRVnGs
+DoDLKvbdiVZeXRtb
+EOcKjvbdGAoRYizm
+DoDKjvbdJJdAJpGd
+DoDKjvbdwMvANEFN
+DnbjjvbdaaWFFpQX
+DnbjjvbdqlzKZMIJ
+EPDLKvbdxnShXsJD
+DncLKvbdMfcPlotk
+DncLKvbdURRPVUhN
+DnbkKvbdHgGzZXxH
+EOcLKvbdYlRctOMN
+DncKjvbdnHEwlnGy
+DoDKjvbdlYsSTZGt
+EOcKjvbdZxcjNcLr
+EObjjvbdmttyjjSG
+EObkKvbdffLynHHA
+DnbkKvbdmpZxvLZC
+DncLKvbdBhjakJGK
+DoCkKvbdpstHSRkU
+EPDLKvbdiLddOVCy
+EOcKjvbdxUleQyLn
+EPCkKvbdTukpKTaR
+EOcLKvbdjvXOECYX
+EObjjvbdRWnEDLgc
+EObkKvbdbhljLGWx
+EPCkKvbdZoOJEdyj
+DnbkKvbdqrVKnLAm
+DoDKjvbdVAbRTRRy
+DnbkKvbdhfjDZWKV
+EOcLKvbdkWXOECYX
+DnbkKvbdYTLaMsnx
+EObjjvbdZRNFImFR
+DncLKvbdCWzdIdpW
+EOcLKvbdpyPIGqDx
+DoDLKvbdiCOcFWpq
+EPCjjvbdhtzFXSUb
+Dnbjjvbdlqxtyrci
+DoCkKvbdiZtelROG
+EPCkKvbdVUNUFkvK
+DnbkKvbdNddUJJLE
+DoCkKvbdNdctIhjd
+DnbkKvbdcyyQYZQb
+EObkKvbdQmYByNtz
+DoDLKvbdVrNxBeMD
+EPCjjvbdCTBCsevr
+DncLKvbdtSrTYyeD
+DnbjjvbdRyigsDWA
+DncLKvbdJYUBglQp
+DoDKjvbdSPsfiedX
+DoCkKvbdADRxKZiQ
+EPDLKvbdrEFJPmvB
+DnbjjvbdvAcyTOdh
+EOcKjvbdaMjasUmH
+DoDKjvbdZjSgogBf
+DnbkKvbdnGeXmOGy
+DnbjjvbdMgComPuL
+EPCkKvbdxKvcgzzG
+DncKjvbdwtldpyMO
+DoDKjvbdbhlikGXY
+EPCkKvbdpyPIHREY
+DoDLKvbdkClLRHUg
+EPDKjvbdqFdFUWBI
+EOcLKvbdkxrqrxgU
+DoDLKvbdTvLoitAq
+DoCjjvbdJuuFcdfi
+EPCjjvbdrykpTAhO
+EPCjjvbdiZuFkqNf
+EObjjvbdEuxpQNKF
+EPCjjvbdGGKSOJUR
+EPCkKvbdcyxowxqC
+DnbjjvbdjhGkeemk
+EPDKjvbdijGIJmYS
+DnbkKvbdypnliKXA
+EOcKjvbdRadFLhyL
+EPCjjvbdxwiKCPyk
+DoCkKvbdfILVqnQg
+DoDLKvbdkNCLzEgP
+DoCkKvbdGKdrbglu
+DnbkKvbdJcJcRJcY
+DoDLKvbdIwsahMRQ
+DnbkKvbdNddUIhjd
+EPCkKvbdJuuGDdgJ
+EPDLKvbdjKGHjMwr
+EObkKvbdGdKvKCJj
+DncKjvbdNUrqkNAX
+DoDLKvbdTqQoVVHm
+DoDKjvbdNddTiIkE
+EPCkKvbduaEZTPFI
+DnbjjvbdFWYopMie
+EObjjvbdyXhiaozL
+EPCjjvbdhaoDFWpq
+DncKjvbdJJdAKQHE
+DoDKjvbdegkVrOQg
+DnbjjvbdwuMdqYlO
+EPCkKvbdLKaHvAJy
+DoDKjvbdRbEFLiYk
+DoDKjvbdSxLMNzjx
+DnbkKvbdGKdsChMu
+DncKjvbdACrYJzJQ
+DoCjjvbdbUafwkUI
+DncKjvbdzjVPpDrt
+DnbjjvbdFfKSOJTq
+EPDKjvbdHffyyXxH
+EOcLKvbdRkZFtgLT
+EOcKjvbdXsMAmToY
+EOcLKvbdNPwqWNfs
+DoCjjvbdEuxpPljF
+DncLKvbdjJfIJlxS
+DoCjjvbdhgJbxuiu
+EPCkKvbdrDdhpOWB
+DnbkKvbdwWlBWAuu
+EObjjvbdySmiMrCH
+EPCjjvbduWOXjRTA
+DncLKvbdRDbaPqES
+EPCkKvbdjEkHVPAO
+EPDLKvbddiiqvUzn
+EPDKjvbdyYJKCPyk
+DncKjvbdNeEThiKd
+DncKjvbdrbGMlGkZ
+EOcKjvbdOTTvHEuQ
+EObjjvbdFyVUaEYC
+EPCkKvbdbiMikFwY
+EPDKjvbduaDxsPFI
+DncLKvbdozmckYPA
+DoDLKvbdVYgsykPO
+DoCjjvbdQvnDbkgc
+DncKjvbdZLrDtNkm
+DoDKjvbdHfgZyYXg
+DoDKjvbdauCGwkUI
+DoDKjvbdmJDsqVSB
+EOcKjvbdhgJbyWKV
+EPCjjvbdrouoKDWG
+DoDKjvbdQmYCYnUz
+DoDLKvbdfHkVqmpg
+DoCjjvbdZjShPfaf
+DoCkKvbdIGfzYxYH
+EPDKjvbdZRMeJNFR
+EPCjjvbdRpTgKFdX
+EPCkKvbdEYYMUUUM
+DncLKvbdwuMdqZLn
+EOcKjvbdmuVZkJqf
+DncKjvbdhgJbyWJu
+DnbjjvbdKVuFcdfi
+EPCkKvbdRadElIxk
+EPCkKvbdYlSDsmkm
+DoDKjvbdhlFEOVDZ
+DoCjjvbdIsZBSlwl
+DoDKjvbdLAkGmCXq
+DoDLKvbdqwQMCiYq
+EPDKjvbdURROtuIN
+DoCjjvbdpxoHgREY
+DncKjvbdwXLaWAuu
+EObjjvbdrpWPJcWG
+EPDLKvbdmozYvLYb
+EPCkKvbdMowpunGs
+DnbkKvbdANHySvzY
+DncLKvbdZyDinDLr
+DoCjjvbdziuPpESt
+EPDKjvbdiVZeXRuC
+EPDLKvbdDncKkWbd
+EOcLKvbdFVxopNJe
+DncLKvbdACqxJzIp
+DncKjvbdaMkCTUlg
+DoCkKvbdhyuGMQnG
+EObjjvbdbBWFFpPw
+EObkKvbdTAEiICPE
+DoDKjvbdbUagXjtI
+DoDLKvbdGZUuAcwb
+DoDKjvbdnGdwlmgZ
+DoDLKvbdVBCRSpqy
+DnbjjvbdfIKvRnRH
+EObkKvbdaRebgsek
+DnbjjvbdNVSrLNAX
+EPDKjvbdrJAKEmPF
+DnbkKvbdBdQBWKNG
+DoCjjvbdePFTLUUS
+EPCkKvbdRDcAoqDr
+DncLKvbdrNZiyLhJ
+DoCkKvbdLqwNZtpz
+EPDLKvbdlqxtzTEJ
+DnbkKvbdrRtjmkBN
+EPCkKvbdZRMeJNEq
+DnbkKvbdZsiJYdTO
+EObjjvbdUtMtGLvK
+EOcLKvbdnCJwYOnV
+DncLKvbdUMWPAuni
+EOcKjvbdJcJbpjDY
+DoCkKvbdcImKLGXY
+EObkKvbdYSlAmTnx
+DncLKvbdCTBCtFvr
+EObjjvbdqlyjYlIJ
+DoCkKvbdmSZUzSci
+DoDKjvbdjEjfuPAO
+EPCjjvbdWfYzUAPT
+DnbjjvbdzROmJJwA
+EObjjvbdnQZyVjyC
+DncKjvbdjAQGaPgK
+EObkKvbdtTSTZZeD
+DoDLKvbdZLrETnLm
+DncKjvbdCDpAujNG
+DncKjvbdUyHsykOn
+EPDLKvbdeXystRez
+EPCjjvbdlrZUyrci
+EPDKjvbdwjvcgzzG
+EPDKjvbdnHExNOGy
+EOcKjvbdZLqdTmlN
+EPCkKvbdEuxopMjF
+EObjjvbdJYTaglRQ
+EPCjjvbdrWpLbiZR
+EPCjjvbdNxOuzcnU
+DoDLKvbdijFhKNXr
+DnbkKvbdKWVGEFHJ
+DnbkKvbdKCicQjCx
+DoCkKvbdcScLTdKB
+EOcKjvbdKWUecdfi
+DoCjjvbdiLeDmuDZ
+DncKjvbdySnJNSCH
+EPDLKvbdZshhyDrn
+DnbkKvbdssSSxydc
+EOcLKvbdqrUjnLBN
+EPDKjvbdGdLWKCKK
+EObjjvbdsQWPJbuf
+DoDLKvbdJcKDRJcY
+DoCjjvbdZoNiEeZj
+DnbkKvbdGFjSOJTq
+EPDLKvbdxxJKBozL
+DoDKjvbdBraDUGXS
+EPDKjvbdJbjCpicY
+DoCjjvbdVqmwbEkc
+EPDKjvbdijFhKMwr
+EPDLKvbdrSVLNkBN
+DoCkKvbdiUzEvquC
+EPCjjvbdWIYVxGxz
+DnbkKvbdZoOIdeZj
+DncLKvbdZRMeJNEq
+EObjjvbdZMSDtOMN
+DnbjjvbdRWnDcLgc
+DoDLKvbdmRxtzTDi
+EOcKjvbdJmADygUa
+EOcKjvbdxUmFQyMO
+EOcLKvbdOTUWHEtp
+DoDLKvbdZRNFJMeR
+EOcLKvbdxmsHxShc
+EPCkKvbdUxhTykPO
+DoCkKvbdelfWfljL
+EPDLKvbdFejSOJTq
+EPCkKvbdKefIBaRV
+DncKjvbddeOqbXDK
+EOcKjvbdhlEcnUcZ
+DoCkKvbdZtJJZETO
+DnbjjvbdSPtHJfDw
+DncLKvbdOFDtIhkE
+EPDLKvbdFyVVAcwb
+DoCjjvbdqTtGqqjt
+EOcLKvbdyTOIlrCH
+DnbjjvbdACrYKZiQ
+DoDLKvbdvmWAMceN
+DoDKjvbdLBLHNCYR
+EPCkKvbdIxUCHlQp
+EPDLKvbdQmXayNtz
+DoCjjvbdKRZdoFme
+DncLKvbdZoNiEdyj
+DoDKjvbdqqtkOLBN
+EPCkKvbdiZuFkpmf
+DncKjvbdEPCjkXCd
+DoDKjvbdbVBgXjsh
+DoCjjvbdmRyUzSdJ
+EObjjvbdMJCLpxAS
+DoCjjvbdwWlBWAvV
+EPDKjvbdNHCpMouL
+DncKjvbdEOcLKwDE
+DoCjjvbdwjvcgzzG
+DnbkKvbdNGbpNPtk
+DoDLKvbdZGwEAOri
+EObjjvbdaRfDITfL
+DoDKjvbdVvhwudEg
+EPCjjvbdHgGyxwwg
+DncKjvbdcJMikFwY
+EObjjvbdwMvAMdEm
+EOcKjvbduMYXBUAw
+EPDLKvbdpfDeTuaI
+DoDKjvbdssSSxzEc
+DnbjjvbdjblLRHUg
+EOcLKvbdVwIxWDeH
+EPCkKvbdLGFgaaQu
+EPDKjvbdBiKakIfK
+DoDLKvbdEOcKjwDE
+EOcKjvbddijRvUzn
+DoCjjvbdmaivxPOV
+DnbkKvbdMfcQNPuL
+DncLKvbdZtIiZDsO
+DoDLKvbdhlEcmuDZ
+EOcKjvbdIGfzYxYH
+DncLKvbdICLydzAD
+EPDLKvbdMfcPmPuL
+DnbjjvbdrRuKmjaN
+DnbkKvbdbsDKscjB
+DoCkKvbdhkddNtcZ
+EOcLKvbdNQXqVnGs
+DoDLKvbdrEFIonVa
+DoCjjvbdQvnDcMID
+EPCjjvbdjlalZeGo
+EPCkKvbdjJfIKNYS
+EObjjvbdREDBPqES
+EPCjjvbdiZtfMRNf
+DoDKjvbdADRxJyiQ
+DncLKvbdYkqcsnMN
+DncLKvbdZshiZDsO
+DoDLKvbdRNXayNtz
+DncLKvbdqcdiPmvB
+EPCkKvbdrNZixlHi
+EPCjjvbdwtmFRYlO
+EObkKvbdJTZBTNXl
+EOcLKvbdWRnXadkc
+DoDLKvbdvwMBVaVu
+DoDKjvbdlZSrTYgU
+EPDLKvbdQcbaQRDr
+DoCjjvbdhuZdvrUb
+DnbkKvbdZxdKOClS
+DncKjvbdJzoexEAN
+EOcLKvbdQvmdDLhD
+DncLKvbdunszpkPU
+EOcKjvbdiZuGMQnG
+DncKjvbdVZIUZkOn
+DoDLKvbdkxsRsYgU
+EPCjjvbdGQASwGey
+DncKjvbdnBivwoNu
+EPDLKvbdsBelkfjy
+DoDLKvbdddoRbWbj
+EPCjjvbdhancFXQq
+EObkKvbdJvUfEEfi
+EPDLKvbdIidAKPfd
+DoDLKvbdxVMdpxkn
+DoCjjvbdaNLCTVNH
+DnbkKvbdZyDinDMS
+DoDLKvbdrMzJyLhJ
+EPDLKvbdyXhiaozL
+DoCjjvbdGKeTDHlu
+DncKjvbdwzIGFxFS
+EObjjvbdJvUedEfi
+DncLKvbdIjEAJpGd
+DncKjvbdyTNiNRbH
+EOcKjvbdidkGuPAO
+DoDLKvbdkVvmcbXw
+DoCjjvbdJYTbHkpp
+DoDLKvbdFyVVBEYC
+EPDLKvbdmoyyVjyC
+EOcKjvbdcTDKtDjB
+EPCjjvbdEvYpPmJe
+DoCjjvbdCJLCKhej
+DoCjjvbdSKxfUgLT
+DoDLKvbdFjeTDINV
+DncLKvbdEXxMUTtM
+EOcKjvbdWRnXaeMD
+DoCjjvbdrMzJyLgi
+DoCkKvbdcSbkUEKB
+DnbkKvbdyzeOSIIh
+DncLKvbdpstGqrKt
+EPDKjvbdCJLBkJGK
+EOcLKvbdJcJcQjDY
+EPDLKvbdbLLfPNcA
+DnbjjvbdEASImZwX
+DnbjjvbdtumwiqTA
+DnbkKvbdxKvdHzyf
+DoCjjvbdVwIxWDeH
+DncLKvbdYzcFqjVy
+EPDKjvbdqiAJeMoF
+DoDLKvbdNQXqVmfs
+EPDLKvbdFjdsChNV
+DoCkKvbdOTUWGdtp
+EOcKjvbdOEdUIiKd
+EOcLKvbduaEZSoFI
+EOcLKvbdxsNhlrBg
+EObkKvbdcIlijfXY
+DoDLKvbdLqvlytpz
+DoDKjvbdIryBTNXl
+EObjjvbdQwOECkhD
+DoCjjvbdLFegaaQu
+EObkKvbdFkFTChNV
+DnbjjvbdyzeOSHiI
+EObjjvbdLAkHNCYR
+DnbkKvbdZyDimcMS
+DncKjvbdkMbLzEgP
+DnbjjvbdRbEEkhyL
+EOcKjvbdLrXMzVQz
+EOcKjvbdVBBqTRRy
+EObjjvbdyNsHxTIc
+EPCjjvbdMuTRkNAX
+DoCkKvbdUaCQrprZ
+EPCjjvbdjmCLydfo
+DoCjjvbdFyVVAcxC
+EPCjjvbdQvnDblID
+DnbjjvbdLhbLqYAS
+DncLKvbdFxuVBEYC
+DncKjvbdGLFScIMu
+DncKjvbdBvzcheQW
+EPDLKvbdSPsfjFcw
+DnbkKvbdsQWOibvG
+DnbkKvbdaSGChTfL
+EPDLKvbdjmBkzFGo
+DoDLKvbdqAiFAWhE
+EPDLKvbdkVwNcaww
+DoCkKvbdKRZePGOF
+EOcLKvbdJXtCIMRQ
+EPCkKvbdaNLCTUmH
+EPDLKvbdliDtRUrB
+EOcLKvbdKfGHbApu
+EObkKvbdDwwlTstM
+DoDLKvbdmgExMmfy
+EOcLKvbdKWUfEFHJ
+EPCjjvbdkxrqrxft
+DncLKvbdkClKqHUg
+DoDKjvbdVqnXadlD
+DoDLKvbdULvPBWPJ
+DoDKjvbdUslsfMWK
+EOcLKvbdJvVFdFGi
+DncKjvbdiifHilxS
+EPCkKvbdRaceMJYk
+DoCkKvbddwytTrFz
+EPDLKvbdYkrETnLm
+DoCjjvbdiMEdOUby
+DoCkKvbdxVMeQyLn
+EPCkKvbdwuMdpxlO
+EPDLKvbdNPxQumfs
+DncKjvbdYpleJNEq
+DncKjvbdTAEhhCPE
+EOcLKvbdUGznLwVe
+EOcKjvbdNPwpunHT
+EPDLKvbdKaLHNBwq
+EOcLKvbdFfKRmhtR
+EObkKvbdYlRcsmlN
+DoDLKvbdWSOXadlD
+EOcLKvbdWWiXucdg
+DoCkKvbdZsiIxcsO
+DoDLKvbdbhlikFvx
+EOcKjvbdtlYXAsaX
+EOcLKvbdUtNTelVj
+DoDKjvbdhaoDFXRR
+DoDLKvbdEuxoomJe
+DoDLKvbdEYYLtTsl
+DncLKvbdbhmJkGWx
+EPDLKvbdqwPkbhxq
+DnbjjvbdlrYuZsEJ
+DncLKvbdeKKSWUzn
+DnbkKvbdyTNiNSCH
+DncKjvbddwzTsqez
+DncLKvbdTXkMNzjx
+DoDKjvbdJmAEZgUa
+DncKjvbdeEnqavbj
+EPDLKvbdcJNJjfWx
+DncLKvbdPyNAGsRj
+DoCjjvbdLGGHbAqV
+DncKjvbdddoRbWcK
+DoDLKvbdZjTHogBf
+EPDLKvbdRkZFuHKs
+EOcLKvbdEuyPoljF
+EPDKjvbdEYYMTtUM
+DncKjvbdDxXlTssl
+DnbkKvbdQvmcblID
+EObkKvbdjmBkydgP
+DoCkKvbdOAJTUKSA
+DncKjvbdhgJbxvJu
+DoDKjvbdVvhxVceH
+DoCkKvbdjvXODaww
+EPDKjvbdemFvflik
+DoDKjvbdkCkkRGtg
+DoCjjvbdDigjVxKA
+DncLKvbdLAjgNCYR
+EPDKjvbdbUbGwkTh
+EObjjvbdmuUzLJrG
+DnbjjvbdmgFXlnGy
+DoCkKvbdFxttaDwb
+EPCjjvbdJcKDRKCx
+DoCkKvbdpfDeUWAh
+EPDLKvbdADSYJyhp
+DoCjjvbdHkazmvqL
+DnbkKvbduLxWaUBX
+EPCkKvbdQdCaPpdS
+EOcLKvbdZdwfzhIb
+EPDKjvbdKWUeceGi
+EPDKjvbdSCDeMJZL
+DoDKjvbdyOShYShc
+EObjjvbdliEURVSB
+DncLKvbdmgEwlnGy
+DnbkKvbdsBemMHKy
+DoDKjvbdYzcGSJvZ
+EObkKvbdGcjvKBjK
+EOcLKvbdJuuGDdgJ
+EPCjjvbdOStWGeUp
+EOcLKvbdGLEsChMu
+EOcLKvbdeATqNYJf
+DncLKvbdxxIjCQZk
+EObkKvbddZyQXyQb
+DoDKjvbdVBCRTRRy
+EPCjjvbduDDVWuoP
+EOcKjvbdVZHtZkOn
+EPCjjvbdZQmEhmFR
+DnbkKvbdZyDimcLr
+EPDLKvbdjblKqHVH
+EOcLKvbdZtIiZDsO
+DnbkKvbdRWmcbkhD
+EPCjjvbddneSjtTr
+DoCkKvbdZQmFJMdq
+DoDLKvbdLFegbBRV
+EOcKjvbdSwkMNzjx
+DoCjjvbdFjeTDHlu
+EPCjjvbdtSqrxydc
+DncLKvbdSPtHKFcw
+DncLKvbdyYJJapZk
+EOcKjvbddxZssrFz
+EObjjvbdfekzOGgA
+EPDKjvbdrylQSaHn
+DnbjjvbdZisHofbG
+EObjjvbdrbGNMHKy
+DnbkKvbdLBKfmBxR
+DncKjvbdACqxJyhp
+DncLKvbddijRutzn
+EPDLKvbdMpYRVmfs
+DncLKvbdmttzKiqf
+DnbkKvbdZnmhdeZj
+EPCkKvbdjKFgjNYS
+DnbjjvbdxnTHxShc
+EPCjjvbdlZTSTYgU
+DoCjjvbdqlyjYkgi
+EObkKvbdxVMeQyMO
+EPDLKvbdSPtHJecw
+EPDLKvbdrpWOibvG
+EObkKvbdRbEFLhyL
+DoCkKvbdYNqAYUvU
+DoCkKvbdnCKXXnnV
+EObkKvbdddoSBvbj
+DncKjvbdNGcPlpUk
+DnbkKvbdmajXXnmu
+DoCjjvbdJXsbHlQp
+DncLKvbdNGcPlouL
+DoCkKvbdTAFJHaoE
+EPCjjvbdnPyxvKyC
+EPCkKvbdRyihTDWA
+DncLKvbdQlxCZNtz
+EObkKvbdJSyAsMwl
+DoCjjvbdmttykJrG
+EPCkKvbdfpBzwEXh
+DoCjjvbdrzMQTBIO
+EPDKjvbddZxowyRC
+DncKjvbdaNKaruNH
+DnbjjvbdaNKasVMg
+DncKjvbdcbTNSATm
+EPCkKvbdiLdcnVDZ
+EObjjvbdYTLaMtOx
+EOcKjvbdEASIlzWw
+DnbjjvbdziuPodTU
+EOcLKvbdqUUHRqkU
+DnbkKvbdyNsHxSiD
+EObjjvbdhkeDnUcZ
+EOcKjvbdNHCpNQUk
+EPDLKvbdIryBSmYM
+DnbkKvbdfekynGgA
+EOcLKvbdiHKCyWJu
+EObkKvbdrMzKYlIJ
+DoCjjvbdsZkoraIO
+EOcKjvbdQccAoqES
+DoCjjvbdtTRrxzFD
+EPCjjvbdJXtBhMRQ
+DnbjjvbdsBfNMHKy
+DnbkKvbdeEnrBwCj
+DoDLKvbdTfzmkvvF
+DoCjjvbdCJLCLIej
+DnbjjvbdNUrrLNAX
+DoCkKvbdxsNiNRag
+EPCjjvbdtbcUwVoP
+DoDKjvbdaogHDkzd
+DncKjvbdpedFTuaI
+DnbjjvbdqYngfpdY
+DncKjvbdbiNJkGWx
+DoCjjvbdGckVjBij
+EObkKvbdqceIomvB
+EPDLKvbdFWZQQNJe
+EObkKvbdrRtkOLAm
+DncKjvbdDwwktUTl
+EObkKvbdwNWAMceN
+DncKjvbdZMSDtOLm
+EObjjvbdTkvPAuni
+DoDLKvbdUxhTykPO
+EOcLKvbdVBCQsQqy
+EPDKjvbdZshhxcrn
+DnbjjvbdqdEiQOWB
+DoDKjvbdkWWmdBww
+DoDLKvbdzQoMhiwA
+DnbjjvbdUGzmlXWF
+DncKjvbdJTYaTMwl
+DoDKjvbdGLFScHmV
+DoDKjvbdrWpLcJZR
+EOcKjvbdwNWAMcdm
+EObkKvbdmfeYNOGy
+EObkKvbdtcDUwVoP
+DnbjjvbdiZuGMQmf
+EObjjvbdfMewGmJk
+DnbjjvbdANIZTWyx
+DncKjvbdtTSSxydc
+DnbkKvbdsBfMkfjy
+DoDKjvbdSLYfUgKs
+DoDLKvbdZisHogCG
+EObkKvbdVTlsfMVj
+DncKjvbddZyPwxpb
+DncLKvbdAMhYsXZx
+DncLKvbdxwhjCPzL
+EOcKjvbdKRZeOeme
+DoCkKvbdunszqLOt
+EPDKjvbdZRMdiMdq
+DnbjjvbdEuxpPljF
+EPDLKvbdGGJrOJUR
+EPDKjvbdVviXudEg
+DnbjjvbdpfDeTvBI
+DncLKvbdRadElJYk
+EPDKjvbdaMjbSuMg
+EPDLKvbdTAEhhCOd
+DncLKvbdTIyiqABM
+EPCkKvbdBsBDUFvr
+DoCjjvbdcSbkUEJa
+EObjjvbdCIjbKhfK
+DoDKjvbdauCHXjsh
+DoCkKvbdpyPHfqEY
+EOcLKvbdDwxMUUUM
+DnbjjvbdGFjRmiUR
+DoDLKvbdbQGgELzd
+EOcKjvbdGGJqnItR
+EPCjjvbdxrnJNRag
+DoDLKvbdbhmJkFwY
+EPDKjvbddoFSkTtS
+DncKjvbdNUsSKmAX
+EPCjjvbdfelZmfgA
+DoCkKvbdjKGIJlwr
+EPDLKvbdJYTaglQp
+EPCkKvbdVrOXbFMD
+EPDKjvbdTpqPUuIN
+EPCjjvbdGckViaij
+DnbjjvbdczZQYYqC
+DoDKjvbdMtrqkNAX
+EObkKvbdaNKartmH
+EPDKjvbdmSZUysDi
+EOcLKvbdlhdURVSB
+DncKjvbdWRnXbEkc
+DncLKvbdLBKfmBwq
+EPDKjvbdZdwfzhIb
+EPCkKvbdhancFXRR
+EObkKvbdaSFbgtGL
+DncLKvbdJXsaglQp
+DncLKvbdUsltFlVj
+DoDKjvbdLBKfmBwq
+EPCkKvbdnVVZjirG
+EObjjvbdiZuFlROG
+EObkKvbdwygeeweS
+EPCkKvbdwjvcgzyf
+DnbkKvbdssRsYzFD
+DnbjjvbdxwiJaoyk
+EPCjjvbdVhYWYHYz
+DncKjvbdhzVFkpnG
+DncLKvbdeJjSVtzn
+DncLKvbdyYIjCPyk
+EPDLKvbdJpzEoGNe
+DncKjvbdnBiwXoNu
+EOcKjvbdVrOYCElD
+EObkKvbdLBKgNCXq
+EPDKjvbdTlWPBVni
+EPDKjvbdFxuVBDxC
+DncKjvbdnHFXlnGy
+EPCjjvbdYkrDtOMN
+DoCkKvbdUWMPjTaR
+DoCjjvbdjSziSjiz
+DnbjjvbdeOdsKtUS
+EPCkKvbdmfdwmOHZ
+EObjjvbdtSrTYydc
+DnbkKvbdRjxeuGkT
+EObkKvbdKeehCApu
+EOcLKvbdpxoIGqEY
+DncKjvbdbLMGOnDA
+EPCkKvbdEXwktUUM
+EObkKvbdiUzFWqtb
+DoCjjvbdiHKCyViu
+EObkKvbdvwLaWAuu
+DoDLKvbdiCPDEvqR
+EOcKjvbdWXJXvEEg
+DoCkKvbdqTtGrSLU
+DnbkKvbdtbbuXWOo
+EObjjvbdgGLzOGgA
+DncKjvbdTlVoBWPJ
+DoCkKvbdeEoRbWcK
+DoCkKvbdkWWmdCXw
+DncKjvbdehLWRmpg
+EPCkKvbdjFLGtoAO
+DoDKjvbdGLFScIMu
+EObjjvbdrRtkOKaN
+EPCkKvbdczZQYYqC
+DnbjjvbdfHkVqnRH
+EOcLKvbdtvNxKRTA
+EPCkKvbdADSYJyiQ
+EOcKjvbdmJETptrB
+EOcLKvbdURQoUtgm
+DoDLKvbdZMSDtOMN
+EPCjjvbdFfJqnIsq
+EOcKjvbdcJNKKfWx
+DnbjjvbdkySqrxft
+DncLKvbdJpyePFme
+DncKjvbduCcVXWPP
+EOcLKvbdxKvcgzzG
+DoDLKvbdpfEEsvAh
+EObkKvbdZyDjNblS
+EPCjjvbdhbPDEwRR
+EPDLKvbdTqQoUthN
+DoDKjvbdxnSgxShc
+DoCkKvbdcTCjscjB
+DoCkKvbdOTUVfeVQ
+DncKjvbdkMbMZeHP
+DncLKvbdEvYpPmKF
+DncLKvbdJTZBTNYM
+EObjjvbdIHGyxxYH
+EOcKjvbdraemLfkZ
+EOcKjvbdMpYRVmgT
+DncKjvbdxZgfFxEr
+DnbkKvbdpxoIGpcx
+EPCkKvbdkIGlGFnL
+DoDKjvbdUslselVj
+DnbjjvbdZnnJEdzK
+DncLKvbdehLVrORH
+DoCjjvbdySmhlqbH
+DoDLKvbdADSXiyhp
+DoDKjvbdZtJJZDrn
+DoCjjvbdezvZEiUX
+EOcLKvbdqTtHSRkU
+EPDKjvbdVgxWXgYz
+DoCjjvbdGZUuBDwb
+DncLKvbdhzUekpnG
+EPCjjvbdZxcinDMS
+EPCkKvbdOFEThiLE
+DoDLKvbdhzVGLqOG
+EObjjvbdkySqryGt
+DoDKjvbdmpZyVkYb
+DoCjjvbdnHFYMnGy
+EObkKvbdRotGjFcw
+EPDKjvbdjblKpgUg
+EOcLKvbdWWiYVdFH
+DoDLKvbdtbcVXVoP
+EPDLKvbdqqtkOLAm
+EPDLKvbdmRyUysEJ
+DnbkKvbdxnShYTJD
+DoDLKvbdGKeSbhMu
+DoCkKvbdjuwODbXw
+DncLKvbdaMkCSuMg
+DncKjvbdtbcUvuno
+DnbjjvbdiVZeWqtb
+DoCjjvbdLBKgNBxR
+EObkKvbdlZSqrxgU
+EPCkKvbdULunaWOi
+DoCkKvbdwzIGGYEr
+EPCkKvbdnHExNOHZ
+EObjjvbdpyOgfqEY
+DnbjjvbdpedFUWAh
+DoCkKvbdhaoDFXQq
+DnbkKvbdYqMdhleR
+DnbjjvbdsZkpSaIO
+EPDKjvbdJcJbqJbx
+EObjjvbdehKvRmqH
+EOcLKvbdmIdURVSB
+EPDLKvbdvOszqKoU
+EOcLKvbdZisIQGbG
+DnbjjvbdFyVUaDwb
+EPCjjvbdTAEiIBoE
+DncLKvbdRkZFtgKs
+EOcLKvbdzdynzdyp
+EOcLKvbdnUtykKSG
+DoDKjvbdZQmEhldq
+EOcKjvbdnBjWxOnV
+EPCkKvbdqvpLbiZR
+DoDKjvbdrykosBIO
+EOcLKvbdBiKbLJGK
+EPDLKvbdBvzciFPv
+DoCjjvbdemFwGlik
+EPDLKvbdqTsfqqjt
+DncLKvbdptUHRrLU
+EObkKvbdbUbGwjsh
+DoCkKvbdHffyyXwg
+EPCjjvbdgGMZnHHA
+EPDKjvbdFejRmhsq
+DoCkKvbdQvmdCkgc
+DncLKvbdyNsHxShc
+DoCkKvbdrDeIpOWB
+EObkKvbdYzcGRiuy
+DncKjvbdMowqWNfs
+DoDLKvbdbsDLTcjB
+EPCkKvbdZQmEiNEq
+EObjjvbdNPwqWNfs
+DoDLKvbddeOrBwDK
+EObkKvbdrNZixkgi
+DoDKjvbdtlXvaUBX
+DncKjvbdtunYKRTA
+EOcLKvbdfSBWzkcP
+EObjjvbdVAbRTQrZ
+DnbjjvbdcJNKLFvx
+DncKjvbdssRsYyeD
+DoDLKvbdqTsgSSLU
+EPCkKvbdMowqVmgT
+DoCjjvbdDnbjjvbd
+EPCkKvbdlhdURUqa
+DncKjvbdqrVLOLAm
+DoDKjvbdNHDQNQUk
+EPCkKvbdXsLaMtOx
+EPCkKvbdRosgJfDw
+DncLKvbdKVuFcdgJ
+DoCjjvbdGGKRnItR
+DnbkKvbdeEnrCWcK
+EPDLKvbdlZSrTYgU
+EPCjjvbdtSrTYyeD
+DoCkKvbdZisHpHCG
+DnbjjvbdbrbkUDia
+DnbkKvbdhficYvKV
+EOcKjvbdsBfMlHLZ
+DoDKjvbdBdQBVjNG
+DnbkKvbdTvLpKUAq
+DoCjjvbdzaAPGgCM
+EObjjvbdiVZeWrVC
+EPCjjvbdZshiYcrn
+EObjjvbdRNXbYnUz
+EObkKvbdBcpBWJlf
+DncKjvbdtbcUvuoP
+DoCkKvbdmfeXmNgZ
+DncLKvbdbPfgELzd
+DncKjvbdZshiYdSn
+EObkKvbdDjHiuwjA
+DoDLKvbdfIKvRnRH
+DnbjjvbdiLeDmtcZ
+DoDLKvbdQwNcblID
+EObkKvbdmRyUzSdJ
+DnbkKvbdnHFYMnHZ
+EOcLKvbdfHjvSORH
+DncLKvbdlZSrSyHU
+EObkKvbdtSrSxzFD
+EObjjvbdZyEKNcLr
+EObkKvbdRkYeuHLT
+EOcKjvbdTkuoAuoJ
+DnbjjvbdEPDKkXCd
+EPCkKvbdnCJwXoOV
+EObjjvbdxrmiMqbH
+DoDLKvbdRaceMIyL
+EPDKjvbdRosgKFdX
+DoCjjvbdzoQQeDMY
+DncKjvbdZyEJmcMS
+DoDLKvbdOFDshiLE
+EPDKjvbdSQUGiedX
+EPCkKvbdTIyjRAAl
+EObjjvbdxUmFRYkn
+DncKjvbdmpZyWLYb
+DoCkKvbdygZMANEw
+DoDLKvbdhuZeWquC
+EObkKvbdFyUuAcxC
+DoCkKvbdiCPCeXQq
+DncKjvbdsCFlkfkZ
+EPCjjvbdNPwpvOHT
+DoCjjvbdSPtGjGDw
+DncLKvbdAMhZSvyx
+EPCkKvbdWXJYWDdg
+EPDKjvbdaogHDkzd
+DoDLKvbdRosgKFcw
+EPDLKvbdrRtjnKaN
+DncKjvbdvBEZSoEh
+DoDLKvbdmajXYOmu
+DnbjjvbdfNFwHMjL
+EPCkKvbdezuyEhtX
+DoCkKvbdHffzZYYH
+EPCkKvbdvAdYsOdh
+EPCjjvbdhlFDnVDZ
+DncKjvbdbiNKLFvx
+DoDLKvbdMIalQxAS
+EPDLKvbdGckWKBjK
+EOcKjvbdvOszqKnt
+DoCkKvbdraelkgKy
+EOcKjvbdMgComPtk
+DoDKjvbdOSsugFVQ
+DoCkKvbdyNrhYTJD
+EPCjjvbduDDVXWOo
+DncLKvbdiCPDFXRR
+DncLKvbdiGibyWKV
+EOcLKvbdfNGXHNJk
+EObkKvbdBhjakIej
+EPCjjvbdxmrhXriD
+DnbkKvbdJbibqKDY
+DnbkKvbdSCDdkhyL
+EPCjjvbdGFirOIsq
+DnbkKvbdKVtfDeHJ
+DoDKjvbdGKdrbhMu
+DncLKvbdZLrETmlN
+EObjjvbdjuvmcbXw
+DncKjvbdQdDApRDr
+EObkKvbdeATplwjG
+DoCjjvbdZMRdUNkm
+DoDKjvbdTqQoVVIN
+EPCkKvbdOTTufeVQ
+EPDKjvbdWRnXadlD
+DncKjvbdZsiJYdSn
+DoCkKvbdZLrDsnMN
+DoDKjvbdEKHiuwjA
+EPDLKvbdnBivxPOV
+EPCjjvbdddnrCWbj
+EOcLKvbdpssgSRkU
+EPCjjvbdzdzOzdyp
+EPCjjvbdZxcinClS
+DoDKjvbdvAcySoEh
+DnbjjvbdWHxWXfxz
+DoDLKvbdCWzdJEpW
+DoCjjvbdehLVqnRH
+EObjjvbdEXxLstTl
+EObjjvbdkMakzEfo
+EPCkKvbdKaKflbXq
+EPDLKvbdijFgjNYS
+DoCjjvbdZsiIxdSn
+DncKjvbdeATqNXif
+DncLKvbdzoPqEblY
+EObkKvbdLAjgNBwq
+DncKjvbdUxgsykPO
+DoDKjvbdaogGckzd
+DncKjvbdFVxpPmJe
+EOcLKvbdZLrDtNlN
+EObjjvbdYNqAXuWU
+DoCkKvbdEYYLstUM
+EObjjvbdeFPSBwDK
+DncKjvbdePEsKssr
+DncKjvbdZjTHogCG
+EPCkKvbdjKGHjNXr
+DoCkKvbdNrtVgFVQ
+DncLKvbdaMjaruNH
+DoDLKvbdwjwEHzzG
+EOcLKvbdTIzJqABM
+DoDLKvbdliETqVSB
+DoDLKvbdNrtVfdtp
+DnbjjvbdZxdKNcMS
+EPDLKvbdbUafxKsh
+DoCkKvbdVrNxCFMD
+DoCkKvbdxZgefYEr
+DoDKjvbdYTLaMsoY
+DncKjvbdeAURMwif
+EOcLKvbdNGcPmQVL
+EPDKjvbdqceJQOVa
+DncKjvbdRotHKGEX
+DoCjjvbdwNWAMdFN
+EPCkKvbdFyVVAcwb
+DoDKjvbdmozYvKyC
+DncKjvbdSPsgJecw
+EPDKjvbdZtJJYcrn
+EOcLKvbdGckWKCJj
+DoDKjvbdkxrrSxft
+DnbjjvbdRbDdlIxk
+DncKjvbdyYJJbPyk
+DnbjjvbdhgJcYvKV
+EObkKvbdjcLjqHUg
+EObkKvbdhgJbyWKV
+EObjjvbdrovPKCvG
+DoCkKvbdbBVdepQX
+DnbjjvbdUVkojTaR
+EPCkKvbdbUagYLUI
+DoDLKvbdptUGqqkU
+DoCjjvbdyTNhlqag
+DncKjvbdEYXlTssl
+EPCkKvbdXFxytAOs
+EOcLKvbdNdctIhkE
+EPDLKvbdkDMLRGuH
+EPDLKvbdDihJuxKA
+EOcLKvbdrafNMHLZ
+EPDLKvbdbKlFoODA
+DncLKvbdZLqcsnMN
+DnbjjvbdznpRFDLx
+DncLKvbdziuQPdSt
+EPCkKvbdbrcKsdKB
+DncLKvbdaMkCTUmH
+EPDLKvbdYkqdUOLm
+DoDKjvbdjhHLfGNk
+DoDLKvbdZMSDtNlN
+DnbjjvbdZjTHpHCG
+DoCkKvbdemFvgNKL
+DncKjvbdrRtkOLAm
+EPCjjvbdyNrhXsIc
+EObjjvbdgPazwDwh
+DoDKjvbdRDcAoqDr
+DoDKjvbdvvkaWBWV
+EOcKjvbdZRMdiNFR
+EPCkKvbddePRawCj
+DoCkKvbdHDjvKBij
+DnbkKvbdZirgpGbG
+EOcKjvbdhbPCeWqR
+DnbkKvbdNPwpvNfs
+EPCjjvbdZirhPfbG
+EOcLKvbdIGgZxwxH
+EPCkKvbdrykosBHn
+DoDKjvbdxnTIYShc
+DnbjjvbdNsTvGduQ
+DncLKvbdBcpAvJlf
+DnbjjvbdlqxtysDi
+DoCkKvbdOEdTiIjd
+DncKjvbdfHkVrOQg
+DoCkKvbdiHKDYvKV
+DoDKjvbdOTUVgFUp
+EObkKvbdaaVdfPow
+DncLKvbdZHXEAPTJ
+DnbkKvbdkIHLefNk
+DnbkKvbdjEjfuPAO
+EObjjvbdhtzFWqtb
+DoDLKvbdSQTfjFdX
+DncLKvbdHEKvKBjK
+DncLKvbdHDkVjBij
+EPDKjvbdRpTfiecw
+DnbkKvbdiBncEwQq
+EObkKvbdRadEkhyL
+EPCkKvbdezvYdiTw
+EOcKjvbdaMjasUlg
+EObkKvbdczZPwyQb
+EPCjjvbdTvMQJtAq
+EPCjjvbdJXtCIMRQ
+DoDLKvbdkDMKpftg
+EPCjjvbdiVZdvqtb
+DnbkKvbdtunXipsA
+DoCjjvbdjJehKNYS
+DnbjjvbdJvUeceHJ
+DoDKjvbdKRZdoFme
+DncLKvbdJcKCpjCx
+EPDKjvbdmbKXYPNu
+DnbjjvbdkIHLeenL
+EPDLKvbdNPxQunHT
+DnbjjvbdUtMtFkvK
+EPDLKvbdsPvPJcWG
+EObjjvbdMRvlzVQz
+DoCkKvbdsQWOjDWG
+DnbjjvbdXGZZtAPT
+DnbjjvbdunszpkOt
+DncKjvbdxZhFfXdr
+DnbjjvbdRzJgsCvA
+EPCkKvbdSCDdlIxk
+EPDKjvbdREDBPqES
+DnbjjvbdBvzdIdov
+DoDLKvbdSLYetfkT
+EObjjvbdKWVGDeHJ
+DoCjjvbduDDUvuoP
+EOcLKvbdWIYWXgYz
+DoCjjvbdbhmJjfWx
+EPDKjvbdIxUCILpp
+EOcLKvbdeXzTsrFz
+EPDLKvbdsBemLgKy
+EPCkKvbdzjVPpDrt
+DncLKvbdZyDimbkr
+DnbjjvbdRNYBxmtz
+EPCkKvbdvOszpkPU
+EObkKvbdSQTfiedX
+DncKjvbdZRNFIldq
+DoDKjvbdbhlijfXY
+EObkKvbdEzspeLcJ
+EPCjjvbdKCicRJbx
+EOcLKvbdOYOuzcnU
+DoCkKvbdhkddOVDZ
+DncKjvbdIxTahMQp
+EOcLKvbdwygeexFS
+EPCjjvbdKRZeOeme
+EPDLKvbdgPazvcxI
+DncKjvbdfNFwHMik
+EOcLKvbdtkwvaTaX
+EObjjvbdURQnuVIN
+DnbkKvbdiBncFWqR
+DncLKvbdaMkCStmH
+EPCjjvbdZjSgogBf
+DoDKjvbdMowpvOGs
+EPCkKvbdsrqsZZdc
+DnbkKvbdRpTfjFdX
+EOcKjvbdaMjbTVMg
+EOcLKvbdmgExMmfy
+DncKjvbdCJLCLJGK
+DoCkKvbdNeDshiKd
+DnbkKvbdGLFSbgmV
+EObjjvbdMtrrLNAX
+EOcKjvbdpedEsvAh
+DoDKjvbdcyxpXyQb
+EObkKvbdxZhGGXdr
+DoCkKvbdEztQdlCi
+EObkKvbdijFgilxS
+EPDLKvbdkHgMFenL
+EOcLKvbdlrYtysDi
+DncLKvbdjcLjpgVH
+DoCjjvbdnVVZkKRf
+EPDKjvbdFeirNhsq
+DnbkKvbdjblLRGuH
+EPDLKvbdtTSTZZeD
+DoDKjvbdVBCRTRSZ
+DncKjvbdTYLMNzjx
+DoCkKvbdEztQdkcJ
+EObjjvbdpfEFTuaI
+DncLKvbdYSlAmUPY
+DncKjvbdYpldiNFR
+DncLKvbdWXIwvDdg
+DoDLKvbdeXyssrFz
+DncLKvbdqdEhonVa
+EOcLKvbdNQYRVnGs
+EObjjvbdRpTgKGDw
+DoDKjvbdauCHXkUI
+DoDLKvbdhficZViu
+DnbjjvbdzoPpeCkx
+DoCkKvbdJYTaglQp
+DoDKjvbdnBiwYPNu
+EOcLKvbdMJCLqYAS
+EPCjjvbdYkrDsnMN
+EPCkKvbdehKvRmqH
+EObkKvbdVqmxCFMD
+DncKjvbdrDeJPmvB
+EPDLKvbdzaAOgHCM
+EOcLKvbdNPxQvNfs
+DncLKvbdFVxopMie
+EPDKjvbdgQBzwDwh
+EObjjvbdTfzmkvvF
+EPDLKvbdUaBprpqy
+DoCkKvbdnGdxNOGy
+DncLKvbdfIKurOQg
+EPCkKvbdKDJcRKCx
+EPCjjvbdmJEUQuSB
+DncLKvbdrafNMGjy
+EOcKjvbdZxdKNbkr
+DnbkKvbdJmADzGuB
+EPCjjvbdQvmdDMID
+DnbkKvbdemGWgNJk
+DncKjvbdyfxlAMdw
+EPCkKvbddtAUATNW
+DncKjvbdcasMrATm
+DoDKjvbdVhYVxHYz
+EPCjjvbdhyuFkpmf
+DoDLKvbdcbTMrATm
+EPCkKvbdILaznXRL
+DoDKjvbdRDbaQQcr
+DncKjvbdijFgjNYS
+EObkKvbdIMBznXRL
+EPCjjvbdxVNEpyLn
+DncLKvbdYkqctOMN
+EOcKjvbdxrmiNSBg
+EPDLKvbdtTRsYzFD
+EOcKjvbdzjVQQDsU
+EPCjjvbdZMRctNlN
+DncKjvbdXrlAmTnx
+EOcLKvbdbPgGdLzd
+EPDLKvbdFfJqmhsq
+EOcLKvbdyzdmqgiI
+DoCjjvbduCbtvuoP
+DncLKvbdNGcPlpVL
+EPCjjvbdGBOpyJzm
+EPCkKvbdRDcBPpcr
+EOcLKvbdRbEFLhyL
+EOcLKvbdePFTLTsr
+EObkKvbdcTCkUDjB
+DnbkKvbdrWokbhxq
+DncLKvbdqUTfrRjt
+EOcLKvbdRyihTDWA
+EObkKvbdpxnhHQdY
+DnbkKvbdrSUkOKaN
+DoCjjvbdIGgZyYXg
+DoDLKvbdMowqWNfs
+DoDKjvbdUxgtZkOn
+EObjjvbdUtNTelVj
+EObjjvbdlqxtyrdJ
+DncKjvbdkVvnDbYX
+EObjjvbdePFTKssr
+DoCkKvbdMuSrLNAX
+EOcLKvbdnQZyWLZC
+DoDKjvbdhgJcYujV
+DoDLKvbdaMjasVMg
+EPCjjvbdcScLUDia
+DnbjjvbdbKkeoNcA
+DnbkKvbdfpBzwEYI
+DoCkKvbdBhkBjhej
+DnbjjvbdkDMLRGtg
+EObkKvbdeATqNXjG
+EOcKjvbdFkFSbglu
+DnbjjvbdznpQdcMY
+DncLKvbdIidAJpHE
+DoCjjvbdLZQirzuG
+DnbjjvbdzjUopDrt
+EOcLKvbdnUuZjiqf
+DoDLKvbdwyhFeweS
+DoCkKvbdaoffckzd
+EObkKvbdzaAPGgCM
+EObkKvbdEzspdkcJ
+DnbjjvbdDjHiuxKA
+DnbkKvbdVqmxBdlD
+EOcLKvbdrJAKFMne
+EOcKjvbdZjSgofbG
+EPCjjvbdfMfWgNJk
+DoCkKvbdTukpJsaR
+DoCjjvbdySmiNSBg
+DnbkKvbdzGyMANFX
+EObkKvbduWNxKQsA
+DoDKjvbdRkZFuHLT
+DncLKvbdbKlGOmcA
+DncLKvbdyNsIXsJD
+DnbkKvbdMpXqWNfs
+DoCkKvbdHEKujBjK
+DncLKvbdDxXktTsl
+EPCkKvbdACrYJyiQ
+EOcKjvbdqUUHSRjt
+DoDLKvbdOFDsiJLE
+EObkKvbdrbGMlGjy
+DoCjjvbdjblKpgUg
+EPCkKvbdiHJcYujV
+EPDKjvbdrDeJQNvB
+EPDLKvbdbrbkTdJa
+DnbkKvbdNeDtIhkE
+DnbkKvbdcJNKKevx
+EPCjjvbdxVNFQxkn
+EObjjvbdhyuGLqOG
+EOcKjvbdrafMkfkZ
+EObkKvbdRkYetgKs
+DnbjjvbdUWLoitBR
+DoCjjvbdQvmcblID
+EOcLKvbdDoDLLXCd
+DncLKvbdzRPMiJwA
+DoCkKvbdsZkoraHn
+DoDKjvbdkHgMGFnL
+EObkKvbdrbFmMGjy
+DnbkKvbdRWnDbkhD
+EPDKjvbdJbicRJbx
+DncKjvbdGZUuAcwb
+DoCjjvbdmfdwmNfy
+DoDKjvbdBdQAujNG
+EPDLKvbdwWlAuaVu
+DncLKvbdxmrgxSiD
+DoCkKvbdUsmUFkuj
+EOcKjvbdcTDKsdKB
+DnbjjvbdjcLkRHVH
+DoDKjvbdbiMijewY
+EPCjjvbdPyNAHSrK
+DnbjjvbdFkErcINV
+EPDKjvbdZQldhmFR
+EPDKjvbdTJZjRABM
+EOcKjvbdKaKgMaxR
+DoCjjvbdwzHefYEr
+DoDLKvbdDwxLtUUM
+DoCkKvbdfILWRmpg
+DoCkKvbdRyihTCvA
+DoDKjvbdSQUGjFcw
+DoCjjvbdEYXktUTl
+EPCjjvbdoznEKxPA
+EPDLKvbdSiZiqABM
+EObkKvbdVUNUFkuj
+DncKjvbdMfbpNQUk
+DncLKvbdEvYopMie
+DnbjjvbdMowpvNgT
+DncLKvbdKjaHvAKZ
+DoDKjvbdqmZjZMIJ
+EObjjvbdGcjuibJj
+DoDLKvbduLwvaTaX
+DoCkKvbdHgHZyYYH
+EObjjvbdEOcKjwCd
+EPCjjvbdGckWKCKK
+EObkKvbdEuyQQMie
+DnbjjvbdHgGzZYYH
+EObjjvbdVUMsekuj
+EObkKvbdWWiXucdg
+EPDKjvbdRWnECkgc
+EPDKjvbdxZgefYFS
+DnbkKvbdEuyPomKF
+EPCjjvbddePSCXCj
+DoDKjvbdUsltFlWK
+DnbkKvbdbsDKtEJa
+EObkKvbdmoyyWLZC
+DoDKjvbdSCDeMJZL
+DnbkKvbdwtleRYkn
+EPDLKvbdJpzEnfNe
+DncKjvbdZisIQGbG
+DoCjjvbdiUzEwRtb
+DncKjvbdrounicVf
+DncLKvbdmIdURVRa
+DoDKjvbdYSlBNUPY
+DnbjjvbdKDKDQibx
+DoDLKvbdnCJvwoOV
+EPDKjvbdgFlZmfgA
+DoDKjvbdTukojTaR
+DnbjjvbdVAbQsQqy
+EOcLKvbdtAHRIABS
+DnbjjvbdmbJvwnnV
+EOcKjvbdvBDxrneI
+DnbjjvbdeJirWUzn
+DnbjjvbdKeegaaQu
+DnbjjvbdzQoMiKXA
+DnbjjvbdxwiJbPyk
+EPDLKvbdKNADzHUa
+DoCkKvbdANHyTXZx
+EObkKvbdxLXDgzyf
+EOcKjvbdpxoHgQcx
+DncKjvbdLBKflawq
+EPDKjvbdhanbdwQq
+DnbkKvbdEASIlyvw
+EPCkKvbdwzHfGYEr
+EOcLKvbdqZPHgQdY
+EPDKjvbdqTtGqqjt
+DoCjjvbdDxXksssl
+DoDKjvbdQlwayNtz
+EOcKjvbdTvLoitAq
+DnbkKvbdirzhsKiz
+EPDKjvbdyzeORghh
+DncLKvbdmJDsqVRa
+DncLKvbdKefICAqV
+EOcLKvbdZnmheFZj
+DoDKjvbdIxUCILpp
+DncLKvbdxsOIlrBg
+DoCkKvbdiVZdvqtb
+EPDLKvbdbBWEfQPw
+EObkKvbdsCFllGkZ
+EObkKvbdNdctIiKd
+EObjjvbdozmcjwoA
+EPDLKvbdlhdTqUqa
+EOcKjvbdbUagYKsh
+DnbkKvbdJpydoGOF
+DnbkKvbdnGeYMmfy
+DncKjvbdtlXwBUAw
+DncKjvbdqiAJdlne
+EPCkKvbdMIakqYAS
+DnbkKvbdCWzchdov
+EObkKvbdelewHNJk
+EPCjjvbdFpASvgFy
+DoDLKvbdVrNxCFMD
+DnbkKvbdMpYQvNfs
+EPCkKvbdEObkKwDE
+EPDLKvbdHDjuibJj
+EPCjjvbdKaLHMaxR
+DoDKjvbdakLfOmcA
+EPDLKvbdMgDQNQVL
+DoCjjvbdEvYpQNKF
+EPDKjvbdrEEhpOVa
+EOcLKvbdOFDsiIjd
+DncKjvbdtTSTYyeD
+EObjjvbdQvnDblHc
+DoDKjvbdVrNwbElD
+EPCjjvbdZMRdUNkm
+DoCjjvbdhfibxujV
+DnbjjvbdYpmFJMeR
+DncLKvbdDihKVxKA
+DoCjjvbdrNZjYkgi
+EOcLKvbdYqNFImEq
+DoDLKvbdJbjDQjCx
+DoDKjvbdwygefXeS
+DncLKvbdUyHsykPO
+DncLKvbdJSyBTMxM
+EPDKjvbdcImKKfXY
+EPCjjvbddndsLTtS
+DoDLKvbdEASIlzWw
+EObjjvbdrylQTAgn
+DoDKjvbdFkFTChMu
+DncLKvbdUaCQrprZ
+DnbjjvbdOFEThhjd
+EObjjvbdlYsRrxgU
+EPCkKvbdnGeYNOGy
+DoDKjvbdwygefYEr
+DoCjjvbdGckViajK
+DoDKjvbdSZjITDWA
+EObjjvbdkWXNdCXw
+EPCkKvbdKjaIWAJy
+EObkKvbdKkBIWAKZ
+DoDLKvbdptTfqrLU
+DoDKjvbdPxmAGsRj
+EObkKvbdTvMPitBR
+EPCkKvbdegjvSOQg
+DoDKjvbdwNWANEEm
+EOcLKvbdRNXbYmtz
+DoDKjvbdEOcKjwDE
+EPDLKvbdfMfXHMik
+DoCkKvbdWHwvXfxz
+EPCjjvbdelfWgNKL
+EPCjjvbdqcdiQOVa
+DncKjvbdkyTSTZGt
+DoCkKvbdbAueFpPw
+EOcKjvbdQwNdClHc
+DnbjjvbdxmsIYSiD
+EPDKjvbdCTAbtFwS
+DncLKvbdJpzFOeme
+EOcKjvbdiZuGLqOG
+DncKjvbdKaLHMaxR
+EPDLKvbdbiMjLFvx
+EPCkKvbdjvXODaxX
+EOcLKvbdOAJSsirA
+EPDKjvbdqYnhHQdY
+DoCkKvbdDwwlTtUM
+DnbkKvbdRjxfVHKs
+EObjjvbdzjUpPcrt
+EOcLKvbdeUAUATNW
+EObkKvbdQlwaxmtz
+EObkKvbdEXxLtUUM
+EObkKvbdYkrETmkm
+DoCkKvbdxmsHwsIc
+DoDKjvbdzjUoocrt
+EPDKjvbdqGEFTuaI
+EPCjjvbdbiMjLGXY
+EPDKjvbdfpBzwEXh
+DncKjvbdZeYGzhJC
+DoCjjvbdFkEsCglu
+DncKjvbdOFDshhjd
+DncKjvbdZMRcsnMN
+EPCkKvbdrEFJPnVa
+DoCkKvbdcyyPxYpb
+EPDLKvbdijGIKMwr
+DoCjjvbdbAudepQX
+DncLKvbdFejSOItR
+EOcKjvbdSLZGVHLT
+EPDKjvbdMJBkpxAS
+DncKjvbdJXsaglQp
+DnbkKvbdjcMLRHVH
+DoCkKvbdFjeTCgmV
+DnbjjvbdqUTfrRkU
+DnbjjvbdznoqFCkx
+EObkKvbdVqnYBeLc
+DoDLKvbdaMjbTVMg
+DoCkKvbdSQUHKFdX
+DoCjjvbdrDdhomua
+DncLKvbdcTCjsdJa
+DoCkKvbdsCFlkgKy
+EPCkKvbdmbKWwnmu
+DoCjjvbdZQmFImEq
+EPCkKvbdyXiKCPzL
+EOcLKvbdKQzEnenF
+EPCjjvbdrbGNMGjy
+EPDKjvbdgGMZnHHA
+EOcLKvbdfHjuqnRH
+EOcLKvbdFeirNiUR
+DoCjjvbduaEZSoFI
+DncKjvbdbAudfPow
+DoCkKvbdbiMikFwY
+DoDLKvbdcyxpYYqC
+DnbjjvbdpxoHfpdY
+DncKjvbdqUTgRqjt
+DoDKjvbdcImKKfWx
+DnbjjvbdmfeYNNfy
+EPCjjvbdIjEAJofd
+EObjjvbdLBKgNCXq
+EObjjvbduLxWaUAw
+DnbjjvbdJTZBTNXl
+DoCkKvbduaDyTOeI
+EOcLKvbdUyIUZkPO
+EOcLKvbddePRawCj
+EPDKjvbdhbObeWqR
+EOcKjvbdBdQAvJmG
+EOcKjvbdkVwODaww
+DnbkKvbdUVkoisaR
+DnbkKvbdMoxQvNfs
+EObjjvbdCJKbLIfK
+DncKjvbdYpmFJNEq
+DoCjjvbdjKFhKMxS
+DnbjjvbdZLrEUNlN
+EPDKjvbdwuNFRZMO
+EObjjvbdjuvnECXw
+EPCkKvbdlZTSTZGt
+DoCjjvbdsQVoJcWG
+DncLKvbdmJETqVSB
+DnbjjvbdjggLfGOL
+EObjjvbdxwiKBpZk
+DoDLKvbdKDKCpjDY
+EPCjjvbdzRPNIjXA
+DoCkKvbdkaMoNALA
+EPCkKvbdjvWnDaww
+EPCkKvbdSBcdkiZL
+DnbkKvbdbUbHXkUI
+EOcKjvbdURROtuHm
+DncLKvbdJmAEZgVB
+DoDLKvbdDxYLsssl
+DncKjvbdWRnXadlD
+EPCjjvbdADSXiyhp
+DnbkKvbdNGcPlouL
+DnbjjvbdBsAcTevr
+EObjjvbdWWhwvDeH
+EOcLKvbdbUafxKsh
+DoCkKvbdtcCuXWOo
+EOcKjvbdbKkennDA
+EPDLKvbdGcjujBjK
+DoDKjvbdRWmdDMHc
+EPCkKvbdmSZUyrdJ
+DoCkKvbdLZRKSztf
+DncKjvbdZQmFJNFR
+EPDLKvbdjhGkefNk
+DncKjvbdeATpmYJf
+EPCkKvbdDjHivXjA
+EObjjvbdFyVVBEXb
+DncKjvbdIHHZxxXg
+DnbjjvbdMoxQvNfs
+EObjjvbdlYsRsZGt
+EOcLKvbdZHWdAPTJ
+DoCkKvbdoznDjwoA
+EOcLKvbdYpmEiNEq
+EOcLKvbdfMfWgNJk
+DnbjjvbdjlalZeGo
+EPDLKvbdVgxVxGxz
+DoDKjvbdZRMdiMeR
+DnbkKvbdNsUVgFUp
+EObjjvbdNGcPmPuL
+EPDLKvbdrSUjnKaN
+DncKjvbdMgDPmQUk
+DoDLKvbdRkZGUfkT
+EOcLKvbdpxoIGqDx
+DoCkKvbdVwIxVcdg
+DoDKjvbdZQmFIleR
+EPDKjvbdZshiZDrn
+EPCkKvbdFWZPpNJe
+DnbkKvbdcImKKfXY
+DoCkKvbdiVZeWqtb
+EPCkKvbdkxsSSyHU
+EObkKvbdcSbkTdKB
+EOcKjvbdFxttaEYC
+EPCkKvbdhtzEwSVC
+EOcKjvbdLAjgNBwq
+DoCkKvbdZisHofbG
+DoDLKvbdIsYaTNYM
+EPDLKvbdADRxJzIp
+DoDKjvbdTkuoAvOi
+EOcLKvbdZRMeJMdq
+EPDLKvbdWWiXvDdg
+DnbjjvbdbsDKscjB
+DnbkKvbdtlXwBUBX
+EPCjjvbdmgFXlmgZ
+EObkKvbdjmBlZeGo
+EObkKvbdmgEwmOGy
+DoCjjvbdtlXwBTaX
+EPDKjvbdSiZiqABM
+EPDLKvbdEXxMTssl
+EPCkKvbdRWmccLhD
+DncLKvbdrWpMDJZR
+EPDLKvbdelfXGlik
+EOcLKvbdFjdsChNV
+EPCkKvbdVUMtFkuj
+DoDLKvbdtkxXBUBX
+DncLKvbdMgDQNPtk
+DnbkKvbdMJCMQxAS
+EOcLKvbduWOYJpsA
+EPCjjvbdZxcimcMS
+DoDKjvbdqrUjmkAm
+EObjjvbdRzJgsCvA
+EOcLKvbdiBoDFXRR
+EPCjjvbdSPtHKFcw
+DncKjvbdbBVeGPpX
+DnbjjvbdRotGiedX
+DoDKjvbdIHGzZYXg
+DnbjjvbdiGjCyViu
+EPCjjvbdSxKkmzjx
+EPCjjvbdmajWwoOV
+DnbjjvbdmbKWxPNu
+EObkKvbdCTBCsfXS
+DoCjjvbdKQzEnfOF
+EPCkKvbddijRutzn
+EObkKvbdFjeTCgmV
+DnbjjvbdURQnuUhN
+DnbkKvbdiCOcFXRR
+EObkKvbdJutfEEfi
+DncLKvbdhtydwRuC
+DoCjjvbdcTCjsdJa
+DnbjjvbdzoPqEcMY
+DoDLKvbdSCDdlJZL
+EOcKjvbdlhctQuSB
+EPDKjvbdOFETiJKd
+EObkKvbddZyQYZQb
+EOcLKvbdrMyjYlHi
+DoDLKvbdqrVLOLBN
+DncKjvbdyNsHwriD
+EObkKvbdQvnECkgc
+DnbkKvbdznopeClY
+DoCkKvbdCJLBjiGK
+EOcLKvbdauCGxKtI
+EPCjjvbdeFOrCWcK
+DncLKvbdcSbjtDia
+DnbkKvbdKWVGDdgJ
+EPDKjvbdrDdiQNua
+DncLKvbdqTtGqrKt
+DoDKjvbdjJfIKMwr
+DoCkKvbdkxsSTZHU
+EObkKvbdFejSNhtR
+DoDKjvbdnCKWxOmu
+DoDLKvbdvBDySneI
+DncKjvbddZxpXyRC
+EPDKjvbddwzTsqez
+DoDLKvbdLFfIBaQu
+DncLKvbdwzHeewdr
+DncLKvbdOFEUJJKd
+DoDLKvbdEvZQQMie
+EPDLKvbdWHxVwgYz
+DoCjjvbdiGjCxujV
+EPDKjvbdrovPJcWG
+DoDLKvbdZxcjOCkr
+DnbjjvbdRzJgsDWA
+DoDLKvbdiZuGLpnG
+DncLKvbdTukoitBR
+DnbkKvbdnBiwXnnV
+DoDKjvbdBvzdIdov
+EObkKvbdRWnECkhD
+DoCkKvbdRbDeMJZL
+DncKjvbdiGjDYujV
+EPCkKvbdNdctIiLE
+EPCjjvbdKWUfDdfi
+EOcKjvbdkIGlGGNk
+EPDKjvbdGZVVBDxC
+EObkKvbdXsMBNUOx
+EObjjvbdANHxrvyx
+EPDKjvbdZtIhyDrn
+DoCkKvbdRWmdCkgc
+EObkKvbdffLynGgA
+DoDKjvbdIxTahMQp
+DncKjvbdKQzFPGOF
+DoDKjvbduDCtwWOo
+EOcKjvbdnCJvxOmu
+DoCjjvbdEJgivXjA
+DncKjvbdemGWgMjL
+DncKjvbdCDpBVjMf
+DncLKvbdmoyxukZC
+EOcLKvbdtkwwBTaX
+DoCkKvbdLqwMzUpz
+DncLKvbdqFdFUWBI
+EPDLKvbdZyEJmblS
+EOcKjvbdEzsqFMCi
+DoCkKvbdcarmSATm
+DncLKvbdFfJqmiTq
+DncLKvbdKQzEoGNe
+DoCjjvbdUaCRTRSZ
+EOcLKvbdqZOhGqEY
+DoCkKvbdZisIQGaf
+DoCkKvbdeFOrBwCj
+DoDLKvbdmIctQtqa
+EObkKvbdxVMdqYkn
+DncKjvbdwygfFxFS
+DoCkKvbdRWnEDLhD
+EOcKjvbdmRyUyrci
+DoCkKvbdWXIwvDeH
+EPDLKvbdRXODcLgc
+DoDLKvbdBsBDUGWr
+EOcKjvbdEvYopNJe
+DoCjjvbdBvzdIdov
+DoCkKvbdyzeNrIJI
+EObkKvbdCJKbKhej
+EObjjvbdQccBQQcr
+DnbkKvbdxZgeewdr
+DoDKjvbdqcdhpNua
+DoCjjvbdeJjSVtzn
+DncKjvbddneTKssr
+DnbjjvbdZxcjNbkr
+EPCjjvbdZisIPfaf
+EPCkKvbdkyTRrxft
+DncKjvbdVwIxVcdg
+DncLKvbdIxTagkpp
+EPCjjvbdbrbjtEJa
+DncKjvbdkCkjqHUg
+DoCkKvbdUxgsyjnn
+EObjjvbdUaCRSprZ
+DnbjjvbdMJCLpxAS
+DncLKvbdliEUQuRa
+EPCkKvbdANHxrvzY
+EPCjjvbdeAURMwjG
+EPDKjvbdZoOIeEzK
+DoDKjvbdmuVZkJqf
+DncLKvbdaNLCTUlg
+DoCkKvbdnQZxvLYb
+DncLKvbdhficZWJu
+DncKjvbdatbHYLUI
+DoCjjvbddndrjtUS
+EOcLKvbdsBfMkgKy
+DnbjjvbdBiKakIfK
+DnbjjvbdSQTfjFcw
+DoCjjvbdmoyxvKyC
+DoCkKvbdGcjuibKK
+DnbkKvbdZQldiMeR
+EObkKvbdqquKnKaN
+DoCjjvbdZRNEhldq
+EPCjjvbdBiKbLJFj
+EPCjjvbdyXhjCPyk
+DncLKvbdtTSSxzEc
+EPCjjvbdnCJwXnmu
+DoDLKvbdbBWEfQPw
+EOcLKvbdemGXHNKL
+DoDLKvbdmfdxMnGy
+EOcLKvbdTqQntthN
+EOcLKvbdrMyixlIJ
+EOcLKvbdVUMselWK
+EOcLKvbdBvzchePv
+DoCjjvbdbVCHXjsh
+EPCjjvbdZRMdhleR
+EOcLKvbdhbObeXRR
+EPCkKvbdFWZPpMie
+DncLKvbdXFyZtAOs
+DnbkKvbdTqQoUuHm
+EPCjjvbdCSaDUFvr
+DoDKjvbdQZNAHTSK
+EOcLKvbdmoyyVkZC
+DoCkKvbdGLErbhMu
+EOcLKvbdtvNwjRTA
+EObkKvbdFjdsDINV
+EOcKjvbdeOdsLUUS
+DncKjvbdMtrrKmAX
+EObkKvbdBsBCtGWr
+EOcLKvbdVBCRTRSZ
+DoDKjvbdKQydoFme
+DncLKvbdnHFXmOGy
+DnbkKvbdGAnqYizm
+EOcLKvbdjlakzEfo
+EOcKjvbdegkWSOQg
+DoCjjvbdtkwwAsaX
+EPCkKvbdeKKSWUzn
+EObjjvbdrRtjnLBN
+EPCkKvbdeATqMxKG
+DnbkKvbdZMRdTmlN
+DoDKjvbdNsUWGeVQ
+EObjjvbdyXiKBpZk
+EOcLKvbdJKEAJpHE
+DoDKjvbdzQoNJJwA
+DoCkKvbdwygeewdr
+EObkKvbdsCGNMHKy
+EOcLKvbdlhdUQuRa
+EObjjvbdyNsHwsIc
+DoDLKvbdWRnXbFLc
+EObjjvbduCcUvvPP
+EOcLKvbdrEEhonWB
+EPCjjvbdRjyFtgKs
+EPCjjvbdkNCLzFGo
+DoCkKvbdRDbaPpcr
+DoDKjvbdQdCaQQdS
+DncKjvbdwyhFexFS
+EPDLKvbdBhjakJGK
+EPDKjvbdaNKaruMg
+EObkKvbdzQnliJwA
+DnbjjvbdptTfrSLU
+DoDKjvbdFWZPpNJe
+EObkKvbdZxcjOCkr
+DoDKjvbdehLWRnQg
+EOcLKvbdcSbkUEKB
+EObjjvbdbUafxLTh
+EObkKvbdBcpAvKNG
+DoDLKvbdySmiNSBg
+DncLKvbdmIdUQuRa
+EPCkKvbduDDUvuoP
+DoDLKvbdMtrqjmAX
+DoDLKvbdVZHtZkOn
+EOcLKvbdiZuGLpnG
+EOcKjvbdxmrgxShc
+DoCjjvbdMpYQvNfs
+EOcKjvbdCIkCKiFj
+EPDLKvbdaaVdepPw
+EObkKvbdXFyZtAOs
+EPDLKvbdbKlFnnDA
+DncLKvbdqGEFTuaI
+EOcKjvbdqFcdsvAh
+EPCkKvbdcSbkUDjB
+DncKjvbdrJAJeMoF
+EObjjvbdZMRdUNkm
+DncKjvbdCEPaVjNG
+DnbjjvbdptUHSSLU
+EPCkKvbdUtNTekuj
+DoCkKvbdVqmwadlD
+EObjjvbdCIkBjiFj
+EOcLKvbdbVCGwkUI
+EObjjvbdFfKSNiTq
+EPDKjvbdJXtCHlRQ
+EPDKjvbdTvMQJtBR
+EPCjjvbdZMRdTnLm
+EPCjjvbdemGXGljL
+EPDKjvbdxmsHxTJD
+EOcKjvbdiVZdvrVC
+DnbkKvbdmSZUzSdJ
+EPCkKvbdUaCRTRSZ
+DncLKvbdoAKztIDn
+EObjjvbdHffyyXxH
+EPCkKvbdaMjbStmH
+EObjjvbdZyDinDMS
+DoDKjvbdjlbMZdgP
+DncKjvbdQwOEDMHc
+DncLKvbdGLFSbgmV
+EPCkKvbdjvXOECXw
+DoCkKvbdSBceLhyL
+DoDLKvbdEvYpPmKF
+EOcKjvbdrbFlkfkZ
+EPDKjvbdTvMQJsaR
+DncLKvbdjvXNcaxX
+DnbkKvbdijGIKNXr
+EOcLKvbdiHJcZViu
+DoCjjvbdlqxuZsDi
+DnbkKvbdhuZeXRtb
+DncLKvbdACqxJzJQ
+EObjjvbdjlbLydgP
+EPDKjvbdxZgefXdr
+EOcKjvbdSCEFLiYk
+EObjjvbdKefICApu
+EPDKjvbdjlbLyeGo
+DncLKvbdbAvEepQX
+EPCkKvbdrSVKnLAm
+DncLKvbdZjTHpHBf
+DnbkKvbdCWzdIdov
+DoDLKvbdxUmFQyLn
+DnbkKvbdxVNFRYkn
+DoCkKvbdZisHpHCG
+DoDKjvbdwkXEHzzG
+DoCjjvbdSPtHJedX
+EOcLKvbdBiLBkIej
+DoCkKvbdiLdcnVCy
+DnbkKvbdlhcsqUqa
+EPCjjvbdwzIGFxEr
+EPCkKvbdySmiNRag
+DncLKvbdHEKujCKK
+EPDLKvbddeOrCXDK
+DoDLKvbdNGbolpUk
+EOcLKvbdtlYXBTaX
+EOcLKvbdqwQLcIyR
+EObjjvbdIrxaSlxM
+EObjjvbdbrcKtEKB
+EOcKjvbdpxngfqDx
+DoDLKvbdKfFhCApu
+DoDLKvbdJvUfEEfi
+DncKjvbdsQWOibuf
+DoCjjvbdHgGyxxXg
+DoCkKvbdZHWdAPTJ
+DncKjvbdauBgYLTh
+DoDLKvbdJYUCIMRQ
+DncKjvbdbrbjtEJa
+DnbjjvbdemFwHNJk
+DnbkKvbdBvzcheQW
+EPCkKvbdJqZePGNe
+EPCkKvbdSKxeuGkT
+EPDLKvbdIryBTMxM
+EPCjjvbdwWlAuaVu
+EOcLKvbdyTOJNRbH
+EPCjjvbdQvmdClID
+DnbjjvbdyTOJMqag
+DncKjvbdrXQMDJYq
+EPCkKvbdGdLVjBij
+EOcLKvbdjJehJmXr
+DnbkKvbdCJKakJGK
+DoCjjvbdLrWlzUpz
+EPCkKvbdhzVFlRNf
+DoCjjvbdRDcApRES
+EObkKvbdzROmJKXA
+DncKjvbdxUmFRYlO
+EPCkKvbdURQoVVIN
+EPDLKvbdVZHtZkPO
+DnbkKvbdatafwjsh
+EObjjvbdNrtWGdtp
+DoDLKvbdBiLCLJFj
+EOcKjvbdmgFXmOHZ
+EObjjvbdZRMeImEq
+DoCjjvbdiMEdNtcZ
+DnbjjvbdgFkzNfgA
+DnbjjvbdGKdsDHmV
+DncLKvbdIxUBhMRQ
+DoDLKvbdjSzhrjiz
+DoDLKvbdpyPHgRDx
+DoDLKvbdqYoIGpdY
+DoCkKvbdUQqPUuHm
+EPCkKvbdBraDTfXS
+DncKjvbdNrtWGeUp
+DncKjvbdJqZdnenF
+EPCjjvbdCWzdIePv
+DoDKjvbdrXPlDIxq
+EPDKjvbdauBgYLUI
+EPCjjvbdQmXbYnUz
+DoCjjvbdGGJqnJUR
+EPDLKvbdkVvnEBww
+EPCjjvbdTukoitBR
+DoCjjvbdRkZFtgLT
+DoDKjvbdEuyPpMie
+EPCkKvbdSLYfUgLT
+DnbjjvbdIwtBglQp
+DnbkKvbdznpQeDMY
+EOcKjvbdznpRFCkx
+EPDLKvbdtumwjQsA
+DoDLKvbdBhjajiGK
+DoDKjvbdhlFDmuDZ
+DnbkKvbdqquKnKaN
+DncLKvbdMowqVmfs
+EOcKjvbdqrUjnLAm
+EObjjvbdqwQMDIyR
+EPDKjvbdnCKXYPOV
+DnbkKvbdHffyyXxH
+DoCjjvbdlZSrTZGt
+DoDLKvbdznpRFDMY
+EPDKjvbdWWiXvDdg
+DoDKjvbdRWnEClID
+DnbjjvbdJcKCqKDY
+EPDKjvbdJbjDQicY
+DncLKvbdhaoDEwRR
+DncLKvbdvAdZSoEh
+DncLKvbdeEnrCWbj
+DoDKjvbdVvhwvDeH
+EOcKjvbdVAapsQqy
+EPCkKvbdxnTIYSiD
+EPCkKvbdrouoJbuf
+EObjjvbdePEsKtUS
+EPDLKvbdirziSkJz
+DnbjjvbdhaoCdvqR
+EPCkKvbdGZVVAdYC
+DncKjvbdtbbuWuoP
+DoCkKvbdLFehCBRV
+DoDKjvbdLZRJrztf
+EObkKvbdkHflGFmk
+EOcKjvbdJYUCIMQp
+EPDLKvbduCcVXWOo
+EPCkKvbdptTfqqkU
+DoDKjvbdGQATWgGZ
+DncKjvbdEztQeMCi
+EObkKvbdZtJJZETO
+DoCjjvbdZsiIyETO
+EObkKvbddndrjstS
+EOcLKvbddeOqbXDK
+DnbkKvbdCTBDUGXS
+EPDKjvbdQlwayOUz
+EPCjjvbdlqyUzTEJ
+DoDLKvbdhtydvrUb
+EOcKjvbdlZTSSyGt
+EOcKjvbdmJDtQuSB
+DnbjjvbdtSqsZZeD
+DoDLKvbdUaBpsRSZ
+EPDKjvbdLGFhBaRV
+DnbkKvbdSBcdkhxk
+DoCjjvbdDoDKkXDE
+DoDKjvbdwyhFfYFS
+EPDKjvbdOEctJIjd
+EPCjjvbdEObjkWcE
+EPDLKvbdhtzEvquC
+EObkKvbdZjShQHCG
+EPCjjvbdmIctQuRa
+EPCkKvbdVwIwucdg
+EOcLKvbdADRxJzJQ
+EOcLKvbdWWiXvEEg
+EPCjjvbdTAFIhBoE
+EPDLKvbdZLqdTnMN
+EPDLKvbdZQldhmEq
+EOcKjvbdLLBIWAJy
+DncLKvbdrMzKYlIJ
+EPCjjvbdzitoodSt
+EPDLKvbdLFehCAqV
+DoCkKvbdrMyiyMHi
+EPDKjvbdkVvmcaxX
+EOcKjvbdmpZxvKxb
+EPCkKvbdliDtRUrB
+DncLKvbdkxsRsYft
+EPDKjvbdTqROuVHm
+EPCjjvbdSQTgJedX
+EPDLKvbdHlBznXRL
+DncKjvbdQdDBQRDr
+EPDLKvbdliDsqVRa
+DoDKjvbdjgflFfOL
+EPDKjvbdeEoSCWbj
+DnbkKvbdfSBWzkcP
+EObkKvbdmIcspuSB
+EPCjjvbdvAdZTPEh
+DoCkKvbdIGfyxwxH
+DnbjjvbdWWiYWDeH
+EObkKvbdZQleImFR
+DncLKvbdQwNdCkgc
+EOcLKvbdQdDBPqES
+DnbjjvbdrpWPJbuf
+DoCkKvbdTulQKTaR
+DoDLKvbdeUAUASlv
+EPCjjvbdZQmFJNEq
+DncLKvbdVBBqSqSZ
+EOcKjvbdqceJPmvB
+DncLKvbdZtIiYcrn
+EOcLKvbdJSxaSmYM
+DoCkKvbdqqtkOLBN
+EObkKvbdgFkymfgA
+DnbjjvbdVqmwadlD
+DncLKvbdsBfNMGkZ
+EPDKjvbdEPDKjwCd
+EObjjvbdHDjvKBjK
+DncLKvbdCTAbsevr
+EObkKvbdFxuUaEXb
+DoCjjvbdcyyQYZQb
+EObjjvbdZsiIxdSn
+EPDLKvbdZQmEhmEq
+DnbkKvbdxnTIXriD
+DncKjvbdfHkVrORH
+EOcKjvbdddoSCXDK
+EPCkKvbdhanbdvpq
+EOcKjvbdRyihTDWA
+DnbjjvbdajkeoODA
+EOcLKvbdlhdTpuSB
+EPDLKvbdhgJbxuiu
+EPCjjvbdnHFXmNgZ
+EPCkKvbdpecdsvAh
+DnbkKvbdVZIUZjnn
+DncKjvbdbAvFGPpX
+DnbjjvbdkMalZeHP
+EOcLKvbdYSlAmUOx
+DoCjjvbdHDkWKCKK
+EPDLKvbdaRecHsek
+EPCjjvbdJXsagkqQ
+EObjjvbdRMwbZNtz
+EPCkKvbdrbGMlHKy
+DncLKvbdKfGICApu
+EPDLKvbdUtNTfLvK
+EPCkKvbdMJCMRYAS
+EOcLKvbdCJKbLJFj
+DoDKjvbdfpBzvcxI
+EObkKvbdYpldhmFR
+EOcLKvbdSPsfiecw
+DoCjjvbdHEKvKCKK
+DnbjjvbdUGzmkwVe
+DnbjjvbdfMfXGmJk
+DnbkKvbdZoOIeEyj
+EObkKvbdZnmhdeZj
+EOcKjvbdTkuoBVoJ
+EPCjjvbdGKdsChMu
+DoDLKvbdJYTahLpp
+EPCjjvbdbhmJkFwY
+DoDLKvbdkIHMGGOL
+EPDKjvbdZsiIxdSn
+EPCjjvbdMgCpNQUk
+DncLKvbdjblKqGtg
+DncLKvbdOYOuzdNt
+DncKjvbdTvMPjTaR
+EPDLKvbdiiehKNXr
+DoCjjvbdZdxGzghb
+DoDLKvbdeOdsKssr
+DoDLKvbddBsMrAUN
+DoCkKvbdxxIjBozL
+DoDKjvbddoErkUTr
+EOcLKvbdwzIFeweS
+DoDLKvbdREDBQRES
+EObkKvbdhlEdOUby
+DoCjjvbdNPxRWNgT
+DoDLKvbdZLqctNlN
+EObjjvbdbUbHXkUI
+DnbkKvbdhtydwSVC
+EPDKjvbdeUAUASmW
+EObjjvbdhgKDYvJu
+EOcLKvbdZnmhddyj
+DoDLKvbdUVlQKUAq
+DoDKjvbdDihJvXjA
+DnbkKvbdZLrETmlN
+EPCjjvbdxxJJbQZk
+EPCkKvbdrounjDVf
+DoCjjvbddiirVtzn
+DoDLKvbdmttyjiqf
+DncKjvbdfHjvSNpg
+DoCjjvbdmRxuZsEJ
+DoCkKvbdjAQGaQGj
+DncLKvbdnVUzLJrG
+EPCjjvbdLAjgNCXq
+DoDLKvbdqmZixlHi
+EPDLKvbdVUMsekvK
+EPDKjvbdrMzKZMIJ
+EPCkKvbdKDKCpicY
+EOcLKvbdwtmEqZMO
+EPDLKvbdmgFXlnGy
+DncKjvbdyTNhlqbH
+DncKjvbdnHFXlnHZ
+DoDLKvbdTqROuUgm
+DoDKjvbdRMwbZOUz
+EPDKjvbdRMwbYmtz
+DoDKjvbdZnmheEyj
+EPCkKvbdbBWEfPow
+DoDKjvbdQwNccLgc
+DoCjjvbdhtzFWqtb
+DoDKjvbdRotHKGEX
+DncKjvbdZsiJZETO
+EObjjvbdaNKbStlg
+DoCkKvbdsZlQTAhO
+EObjjvbdjhGlGGNk
+EObkKvbdQdDBQQcr
+DoDKjvbdMtrrLNAX
+EPCjjvbdRotHKGDw
+EPCjjvbdqZPIGqDx
+EOcLKvbdiGicZViu
+DnbjjvbdJvVGEFGi
+DoCkKvbdKNAEZfuB
+EPDLKvbdLZRJrzuG
+DnbkKvbdhytfLpnG
+EPDKjvbdRbEEkiYk
+EOcLKvbdcJMjLFvx
+DncKjvbdFfKRnItR
+DoDLKvbdegjurORH
+DnbjjvbdEPDKjvcE
+EPCjjvbdkHgLeenL
+DncLKvbdZnmheEzK
+DncKjvbdZjSgpHCG
+DoCkKvbdbBVdeoow
+DoDLKvbdZQmEhleR
+EPDLKvbdpxoHfpcx
+EPCkKvbdSPtGjGEX
+DncKjvbdRbDeLhxk
+EObkKvbdrpWOibvG
+DnbjjvbdfIKurNpg
+EPDLKvbdZyEKNbkr
+DoDLKvbdwXMAvBWV
+EOcLKvbdWWiXvDdg
+EOcKjvbdelfWfljL
+DncLKvbdjuvnEBxX
+DncLKvbdliDspuRa
+EObjjvbdVTlsekuj
+DoCjjvbderAvzlDP
+EPDKjvbdNeDtIhkE
+Dnbjjvbddwyssqez
+EObkKvbdGGKRnItR
+DoCkKvbdHbLzEzAD
+EPCkKvbdTvMPjUBR
+EObjjvbdTAEiIBoE
+DoCjjvbdRjxfUgLT
+DnbkKvbdnUuZkKRf
+EPDLKvbdjmBkydgP
+EObkKvbdNeDsiIjd
+DncKjvbdrounjDWG
+DnbjjvbdrWokbhxq
+DoDLKvbdsPvPKDWG
+DncKjvbdZdwfzgiC
+EOcLKvbdZLqdUNlN
+DoCjjvbdkDMLRHVH
+EPDKjvbdirziSjiz
+EObkKvbduDDUvuno
+DoDLKvbdkHgMGGOL
+DncLKvbdhkdcmuCy
+EObkKvbdCJLCLIej
+DnbkKvbdeFPRawCj
+DncKjvbdsQVoKDVf
+EPDLKvbdRXNccLhD
+EObkKvbdFxttaDxC
+EObkKvbdqrVKnKaN
+EPCjjvbddoEsKtUS
+EObjjvbdzaAOffbM
+DoCjjvbdWSNxBdlD
+EPCjjvbdqlzKYlIJ
+EOcLKvbdQdDApRDr
+DncKjvbdczZPwyRC
+EOcLKvbdtlXwBUBX
+EOcKjvbdmgFYNOGy
+DoCjjvbdKVtfEFGi
+EObkKvbdrNZjZLgi
+EOcKjvbdliETqVSB
+EOcKjvbdbVBgXkUI
+DncLKvbdNHDPmPtk
+DnbjjvbdjlakzEfo
+EOcKjvbdVUNTfLvK
+EPDKjvbdTXjkmzjx
+DncLKvbdrylQTBIO
+EPCkKvbdJpzEoGOF
+DncKjvbdFeiqmhtR
+DncLKvbdZnnJFFZj
+EPDLKvbdlrZUzTEJ
+EPDKjvbdLFfICBRV
+EPCjjvbdcyxpXyRC
+DoDLKvbdQdCaQQcr
+DncLKvbdZsiJZDsO
+EObjjvbdzQoNIjXA
+DncLKvbdVqmxBdlD
+DoDKjvbdRjxfUgLT
+EObjjvbdWIYVxHYz
+DoCkKvbdIGfzZXxH
+DncKjvbdxsNhlqag
+DoDKjvbdFWYopNJe
+EPDKjvbdVBCRTRSZ
+EPDKjvbdwyhFfXeS
+DoCjjvbdziuPocsU
+EPDKjvbdYSkaNUPY
+EObjjvbdznopdcLx
+EOcLKvbduMYWaUBX
+EPDKjvbdnPzZWKyC
+EObkKvbdZxcimbkr
+EObkKvbdBhjbKiFj
+EOcLKvbdjuwNdBww
+EPDKjvbdmbKWxOnV
+DoCkKvbdnHFYNNgZ
+DoDLKvbdrMzKYkhJ
+EOcLKvbdqdFIpNvB
+EPDKjvbdcScKtDjB
+EOcLKvbdygZMAMdw
+EOcLKvbdsCGNLgLZ
+DoDLKvbdaMkBsUlg
+DncKjvbdlZSqsYft
+DnbkKvbdnVUzLKRf
+DoCkKvbdnHFXlmgZ
+EPDKjvbdxZgfGYFS
+DoCkKvbdxwiKCPzL
+DnbkKvbdBcpAvKMf
+DoCjjvbddZyQXxpb
+DncLKvbdzQnmIjXA
+EPDKjvbdFWZQQMjF
+DnbjjvbdMgDQMpUk
+DncLKvbdOFDtIiKd
+DoDKjvbdKNAEZfta
+EOcKjvbdhyuGMQmf
+DnbjjvbdZnmhdeZj
+DncLKvbdhbOcFXRR
+EOcLKvbdvBEZSoEh
+EOcKjvbdYkrEUOLm
+EPCkKvbdNrtWGduQ
+EPDKjvbdZjSgpHCG
+EObkKvbdyzdmrHhh
+DoDLKvbdznpQdblY
+DncLKvbdZshhyDrn
+DnbkKvbdjvWmdCYX
+EOcLKvbdAMgxsWzY
+DnbjjvbdwzIGGXdr
+EPDKjvbdrNZixlIJ
+DoDKjvbdsQWOicVf
+DoDKjvbdjuvmdBxX
+EObkKvbdzHZMANFX
+DoDLKvbddjJqutzn
+EOcKjvbdwNWAMdFN
+DnbkKvbdTqRPUtgm
+EOcKjvbdVYgtZkOn
+EPDKjvbdNGcPlotk
+DnbjjvbdJbjDRJcY
+EPDLKvbdZtJIyESn
+DoDKjvbdtcCuXVoP
+DoCjjvbdZMSETmlN
+DoCjjvbdgGLzNfgA
+EPDKjvbdxKvcgzyf
+EObjjvbdrMzKZMIJ
+DncLKvbdMoxQumfs
+EPCjjvbdbhlikFvx
+DoDLKvbdRadFMJYk
+DnbjjvbdHgGzYxYH
+EObjjvbdVZHtZkOn
+DnbkKvbdakLfPNcA
+DoCjjvbdmfeXmOGy
+DoDLKvbdrRtjmjaN
+DnbjjvbdUxgsyjoO
+DnbjjvbdbhlikFvx
+EPDLKvbdRbEFMJYk
+EOcKjvbdRXNcblHc
+DnbkKvbdqmZixlHi
+DoCjjvbdrzLpTBIO
+DoCjjvbdILaznXRL
+EPDLKvbdRjyGVGkT
+EOcLKvbdehKurOQg
+DncLKvbdYkrDsnLm
+DoDKjvbdZisHpGaf
+DncLKvbdpyPIGpcx
+EOcLKvbdijFhKNYS
+EOcKjvbdMuSqkNAX
+EObjjvbdajlFnnDA
+EOcKjvbduLxXAsaX
+DnbjjvbdiiegjMwr
+EPCkKvbdiMEdNuCy
+EPCkKvbdqTtHSRkU
+EPCkKvbdIryBTNXl
+DncLKvbdFjdrcHlu
+EPDKjvbdZoOIeFZj
+DncLKvbdcbTNSATm
+DoDKjvbddePSCWcK
+DoDKjvbdZsiJYcsO
+DoDKjvbdpeceTuaI
+EOcKjvbdjhHMGFnL
+EOcLKvbdjcLkRGtg
+DnbjjvbdCJLCKiFj
+EPDLKvbdZsiIxdSn
+EObkKvbdVTlsekvK
+EObkKvbdCTAcTewS
+DoDLKvbdOYOuzcnU
+EPCkKvbdiUydwRuC
+DncLKvbdGQATXGey
+EPDLKvbdDjIJvXjA
+DncKjvbdpxoIHQdY
+EObkKvbdZMSDsmkm
+EOcLKvbdBvzchdov
+EOcLKvbdKRZeOenF
+DnbkKvbdwzIFfYEr
+DnbkKvbdSKyFuHKs
+EPDKjvbddCSlrATm
+EObkKvbdSCDeMIyL
+EPCjjvbdsCFllGjy
+DnbjjvbdHgGyyYYH
+DncKjvbdjKFgilwr
+DncLKvbdEvYoomJe
+EObkKvbdlhdTpuSB
+DoDKjvbdWWiYVceH
+DnbjjvbdLGGHbBQu
+EObkKvbdOXoVzcnU
+DnbjjvbdbsCjtDjB
+DnbjjvbdQwOECkhD
+DnbjjvbdMgComQVL
+DoCjjvbdRotGjFcw
+DnbjjvbdmajWxOmu
+EPCkKvbdbPfgDkzd
+Dnbjjvbdpxngfpcx
+DoCkKvbdBraCtGWr
+DncKjvbduDCtwWPP
+EPDLKvbdYzcFrKVy
+EObjjvbdbVBgXkTh
+DnbkKvbdyYIibPyk
+DncLKvbdUVlPitAq
+EObkKvbdbKlGOnDA
+DnbjjvbdrJAKFNPF
+EPDLKvbdLAjgMbYR
+DoCjjvbdSxLLmzjx
+DncKjvbdeEnqawCj
+EObkKvbdFWZQPmKF
+EOcKjvbdGdKvJbJj
+DnbkKvbdjcLjqHUg
+EPCjjvbdQvnDcLgc
+EPCkKvbddoFTLTtS
+DnbkKvbdZtIhyDrn
+EPDKjvbdBvzdIdpW
+EObjjvbdEYYLstUM
+EPCkKvbdyzdnSHiI
+EObjjvbdZLqdTmlN
+EPDLKvbdIHHZyXwg
+DoCkKvbdbVBfxKtI
+DnbkKvbdMpYRWOGs
+EOcKjvbdczYoxYqC
+EPCjjvbddwytTqez
+EPCjjvbduaDySoEh
+EObkKvbdTJZiqAAl
+EObjjvbdmoyyWLYb
+EPDKjvbdnPyxukZC
+EObjjvbdrWolDJZR
+DoCkKvbduCbtvvPP
+EPDLKvbdJbicQibx
+DncLKvbdHELVibJj
+DnbjjvbdKefHbAqV
+DncLKvbdsZkpTBHn
+DoDKjvbduCcVXWOo
+DnbkKvbdidkGtoAO
+DnbjjvbdrEFIonWB
+EPCkKvbdfpBzwEYI
+DncLKvbdwuNFRZMO
+EPDLKvbdrounjCvG
+DncLKvbdxxJJaoyk
+EPCjjvbdJmADzHUa
+EPDLKvbdqGEFTvBI
+EPDLKvbdyOShYTJD
+EPCjjvbdJutecdfi
+EPDLKvbdIMBznXQk
+DncKjvbdmoyxvKyC
+EPDLKvbdrXQMChyR
+DoCkKvbddwytUSFz
+DncKjvbdZjTHofbG
+EPDKjvbdGcjujCJj
+EPCkKvbdvBEYsOeI
+DncKjvbdCTAcUGWr
+EPCkKvbdmbKWwnnV
+DnbjjvbdpxnhHREY
+EObjjvbdlZTRsYft
+DoCjjvbdhkdcmtcZ
+EObjjvbdMfcPmPtk
+EPCkKvbdJXtCHkpp
+DnbjjvbdrSUjmkBN
+EOcLKvbdYSlBMtOx
+EObjjvbdznopdbkx
+DncLKvbdddoSCXDK
+DoCjjvbdOXnuzcnU
+EPCkKvbdZGwEAOsJ
+EOcKjvbdauCGwjtI
+EPDLKvbdNHDPmPuL
+EOcLKvbdNHCpMpUk
+DoCjjvbdmSYtysDi
+DncKjvbdFjeTDINV
+DncKjvbdNrtWHFUp
+EPCjjvbdmJETqUqa
+DncKjvbdEzsqEkcJ
+EOcLKvbdmoyyVjyC
+EOcLKvbdZMSETnMN
+EOcLKvbdBsAbtFvr
+EPCjjvbdJutfEFHJ
+DoCkKvbdiBoDEwRR
+EPDLKvbdZQmFImFR
+EPDLKvbdpfDdsuaI
+DnbkKvbdmbKXYPNu
+EObjjvbdjKGHjNXr
+EOcLKvbdpssgSRjt
+DoDLKvbdKRZePGOF
+DnbkKvbdfekymgHA
+DoDLKvbdiCOcFWqR
+DnbjjvbdiHJbyWKV
+DoDKjvbdsCGNMHKy
+DoCjjvbdGKeSbgmV
+DoDLKvbdkIGkfFnL
+DncKjvbdfILWRnRH
+DoDKjvbdGLEsChNV
+EPCjjvbdVrNxBeMD
+EPDKjvbdSLZGVHKs
+EPDLKvbdQlxByOUz
+EOcLKvbdMgDQNQVL
+DoDLKvbdrRtjnLAm
+EObjjvbdCIkBjhfK
+DncKjvbdDwwlTssl
+DoDLKvbdANIYsWzY
+DnbjjvbdxVMdqYkn
+DoCkKvbdzdynzdzQ
+DnbjjvbdxsNhmRag
+EObjjvbdzjVQPcrt
+DoCkKvbdbBWFFopX
+EPDKjvbdhfibxvKV
+DnbkKvbdegjvRmqH
+EPCjjvbdkNCMZdgP
+EOcLKvbdmtuZkJqf
+EObjjvbdemFvfljL
+DncLKvbdyYIibPyk
+EObjjvbdieKftoAO
+DncKjvbdvOszqKoU
+DncLKvbdVUNTelWK
+EOcKjvbdCDoaWKMf
+EPCkKvbdbsDKtDjB
+EPDLKvbdmSYuZsDi
+DncLKvbdwWlBWBWV
+EObjjvbdkVwOEBww
+EObkKvbdWSNwbFLc
+DnbjjvbdZRNFImEq
+DoDKjvbdrounjDVf
+EPDKjvbdCJKbKhej
+DncKjvbdsrrTYyeD
+DoCjjvbdQvnEDMHc
+DoCkKvbdGQASwGfZ
+EOcLKvbdfSBWzkbo
+DoDLKvbdRkZGVGkT
+EOcKjvbdyXhjCPzL
+EPCkKvbdbrbkTdJa
+EPDLKvbdsQVnibvG
+DnbjjvbdpyOgfpdY
+DoDLKvbdtunXiqTA
+EPDKjvbdqGDdsvAh
+DncKjvbdjEkHUoAO
+EPCjjvbdGQATXGfZ
+EOcKjvbdKDJcRKCx
+DncKjvbdhyuGMQnG
+DoCkKvbdYkrDsnMN
+DoCjjvbdaNKbSuMg
+EOcLKvbdrykpTAhO
+DnbkKvbdrSUkNkAm
+EPCjjvbdwzHeeweS
+DoDLKvbdSBdFMJYk
+DnbjjvbdqUUGrRjt
+DoDKjvbdzitoocrt
+EPDKjvbdxnShXriD
+DoCkKvbdVviXvEEg
+EObkKvbdFxuUaDxC
+EObkKvbdygZMAMeX
+DnbjjvbdiifHilxS
+EPDKjvbdZxcjODMS
+DoDLKvbdWWhxWEFH
+EPCjjvbdzoQQeClY
+EOcLKvbdptUHRqjt
+DoDKjvbdVviXudEg
+EPDLKvbdUQpnuVHm
+EPCjjvbdwzHfFweS
+EOcLKvbdZxcjNbkr
+EObkKvbdZnmhddyj
+DoDLKvbdvlvANDdm
+EOcKjvbdMfbolpVL
+EObjjvbdbAvFFpQX
+EOcKjvbdBdPaWJlf
+DncKjvbdqceIonWB
+DoCkKvbdtcDVWvOo
+DoCkKvbddoFTKssr
+DoDKjvbdaMkBruMg
+EPCjjvbdEuyPolie
+DnbkKvbdOEcsiJLE
+DncKjvbdHlBznWqL
+EPDKjvbdbhlijewY
+EObjjvbdfoazwDwh
+EOcLKvbdaNKbStlg
+DoCkKvbdqdEiQOWB
+DoCkKvbdTvLpKUBR
+DncKjvbdkNBkzFHP
+EObkKvbdFkErcHlu
+DoCkKvbdZshiYcrn
+EObjjvbdEJhJvYKA
+DnbkKvbdOTUWHFUp
+DoDLKvbdVhXvXfxz
+EPDLKvbdBdPaWKMf
+EObjjvbdFejRnJTq
+EPDLKvbdULvPBVoJ
+EPDKjvbdJzpFwdAN
+EPDKjvbdqwPkbiZR
+EPDLKvbdrEFIomua
+EOcLKvbdijFhJlxS
+DnbkKvbdYkrEUOLm
+DnbkKvbdIMBznXQk
+DncKjvbdZisHpHCG
+EPDLKvbdzjUopESt
+DnbjjvbdzjUpPcrt
+EPDKjvbdqZOgfpdY
+DoDKjvbduLxXAsaX
+EObkKvbdrMyiyMHi
+EPCkKvbdqTsfqrKt
+DoDKjvbdTfznMXVe
+EObkKvbddoErkUTr
+EOcLKvbdHELWKCJj
+DncLKvbdUVkpJtAq
+EPCjjvbdRMxBxmtz
+EPDKjvbdjEjftoAO
+EOcLKvbdYkrDsmkm
+DoDLKvbdajlFoNcA
+DoCjjvbdmJDtRUqa
+EPDKjvbdTqQoUuIN
+DnbkKvbdtcDUvvPP
+DncLKvbdrbGMlHLZ
+DnbkKvbdKfGHbApu
+DncLKvbdGFjRnIsq
+EPDLKvbdJzpGYEAN
+DoCjjvbdkySrSyHU
+EObjjvbdKVtfDdfi
+EPDKjvbdNrsugFUp
+DoCkKvbdNxOuzcmt
+DoDLKvbdDihJuxKA
+DnbkKvbdzdzOzdzQ
+DncKjvbdmSYuZrci
+EOcLKvbdptTfqqkU
+EPCkKvbdVUNTfLvK
+DoCkKvbdGdKujBjK
+DoCjjvbdzitopETU
+DoDKjvbdqvokbiYq
+EPDLKvbdGFjSOJTq
+DoDKjvbdliETqUrB
+DoDKjvbdZisIQGbG
+DoCjjvbdnQZyWLZC
+EOcLKvbdGdKujCJj
+EPCkKvbdaRfDIUGL
+EOcKjvbdauCHXjtI
+DnbkKvbdbQHHDkzd
+DoCjjvbddZxpYYpb
+EObkKvbdbBWEepPw
+DncKjvbdSLYfVGkT
+EObkKvbdVgxVxHYz
+DoCjjvbdfpBzwEYI
+DoDKjvbdmfdxMmfy
+DncKjvbdhancEwRR
+DnbkKvbdEASJMzXX
+EObjjvbdmfdwmNfy
+DnbjjvbdhbOcFXQq
+DoCjjvbdVgxVxGxz
+EPCkKvbdQcbaQQdS
+EPCjjvbdhbObeXRR
+EPDKjvbdePFSkUTr
+EPDLKvbdMoxQumgT
+DoCkKvbdIBkydzAD
+EOcLKvbdcasMrAUN
+DoCkKvbdUQqOttgm
+DnbkKvbdelevfljL
+EObjjvbdZeXfzgiC
+EPCjjvbdQYmAGrrK
+EObjjvbdxZhGFxFS
+EObjjvbdJuuGEEgJ
+DoDLKvbdEARhlyvw
+EPDKjvbdZdxGzhJC
+DoCkKvbdzRPMhiwA
+DoCkKvbdZxcinClS
+EOcKjvbdFyVVBEYC
+EOcLKvbdtbcUwVoP
+DncLKvbdlZSrTYft
+EObkKvbdaaVeGPow
+DncLKvbdEKIJvXjA
+DncLKvbdbhljKfWx
+EObkKvbdVhYVxGxz
+EPDKjvbdmpZxukZC
+DoDLKvbdnBivxOnV
+EObjjvbdRbEEkiZL
+EPCkKvbdZRNFIleR
+DoDLKvbdZyEJmblS
+DncKjvbdkIGkefNk
+EPDKjvbdRkZGVGjs
+DnbkKvbdiHJbyVjV
+EPDLKvbdFjeSbglu
+DncLKvbdqFcdtVaI
+EOcKjvbdGYuVAdYC
+DoCjjvbduaEZSneI
+DnbjjvbdKWVFdFHJ
+EObjjvbdGdLVjCJj
+DnbkKvbdpssgSSKt
+DoCjjvbdssRryZdc
+EPDKjvbdZisIQHCG
+EOcKjvbdCIjajhfK
+DoDKjvbdrafNMGjy
+EObkKvbdgQBzwEXh
+DnbjjvbdgQBzwDwh
+DncKjvbdCEQAvKMf
+EPCkKvbdiCOcFWpq
+EPDLKvbdLFfHbBQu
+EPCjjvbdJTYaSmXl
+EPCjjvbdRjyFuGkT
+DoCkKvbdjFKftoAO
+DncKjvbdmaiwXoNu
+DoCjjvbdVZITyjnn
+DoDLKvbdDxYLtUTl
+DnbjjvbdqvpLcJYq
+EOcLKvbdlqxuZsDi
+DoDKjvbdZshhyDsO
+DoCjjvbdGFjSOIsq
+DnbkKvbdcScKtEKB
+EPCjjvbdMpXqVmfs
+EPCjjvbduoTzpjoU
+DoDLKvbdYkqctNkm
+EObkKvbddoErjstS
+DnbjjvbduLxWaUAw
+DoCkKvbdRXODbkgc
+DoCjjvbdwzIGFweS
+DoCkKvbdZyEKOClS
+EObjjvbdiGjCxvJu
+EObkKvbdbiMijewY
+DoDKjvbdqrVKmkBN
+DoCkKvbdFyUuBEYC
+DoDLKvbdNsTufduQ
+DoDLKvbdEPCkKvcE
+DoDLKvbdNQYRWNgT
+DnbjjvbdNrtWGeUp
+DoCjjvbdPxmAGrqj
+EPDKjvbdKNAEZgVB
+EPDKjvbdmttzKjSG
+EPDKjvbdssSSxydc
+DoCjjvbdTlWPAuni
+EObjjvbdDHLegAzc
+EObjjvbdXnRAXtvU
+EObkKvbdKfFgaaQu
+EOcKjvbdhtzFXSUb
+EPCkKvbdJTZAsMwl
+EOcKjvbdQYmAGsSK
+DoCkKvbdjhHLeemk
+EOcLKvbdiifIJmYS
+EPDKjvbdLrWlzVQz
+DoCjjvbdxsOIlrBg
+EPDLKvbdNPxQvNfs
+DnbkKvbdIGfyxwxH
+DoCjjvbdjKFhKMwr
+DnbjjvbddjKSVtzn
+DoCjjvbdZoNiFEzK
+EPCjjvbdeFOqavcK
+DoDLKvbdEuxpQMie
+EObjjvbdZjShQHCG
+DoDLKvbdZMSDsmkm
+DoDLKvbdGYtuBEYC
+EPCjjvbdUaBprqRy
+EOcLKvbdmozZWLZC
+DncLKvbdUWLpKUBR
+EPCjjvbdqYnhHQcx
+DoDLKvbdUaBprpqy
+EPDKjvbdrzMQSaHn
+DnbjjvbdGdLWKCJj
+EObkKvbdfILVrNqH
+EPCjjvbdehKvRmqH
+EPDKjvbdOSsvGeVQ
+DncLKvbdxxJJaozL
+EPCjjvbdZLqctNkm
+EOcLKvbdZxcinCkr
+DncLKvbdkWWmcbXw
+DoDLKvbduCcVXWPP
+DncLKvbdyTNhlqbH
+DncKjvbdYTMAlsoY
+DoCkKvbdRosfjFcw
+EPDLKvbdDwxLsstM
+EOcKjvbdlZTRryHU
+DoCjjvbdNGbpMpVL
+EOcLKvbdYgWdAOri
+DoCjjvbdDxYLstTl
+EObjjvbdIwtBglRQ
+EOcKjvbdvPTzpkPU
+DoCjjvbduLxXAtBX
+DoCjjvbdiLeENuCy
+DnbjjvbdUaCRSqRy
+DnbjjvbdYpmEhleR
+EObjjvbdsPvOjDWG
+DoCkKvbdLFfICApu
+DncKjvbddxZstRez
+EPCkKvbdFyVVAdXb
+DoCjjvbdFyVVBDxC
+DoDLKvbdFeirNiTq
+EPCjjvbdxnSgxTIc
+EOcKjvbdAMgySwZx
+EObkKvbdkyTRryHU
+DoCkKvbdMRwMzUpz
+DnbjjvbdCWzdJEov
+DoCkKvbdUyITzLPO
+EPCkKvbdcSbjsdKB
+DoCkKvbdqceIonVa
+DoCkKvbdjmCMZeGo
+DncKjvbdfMewGljL
+EObkKvbdpfEEtVaI
+DoDLKvbdczZQYYqC
+DoDLKvbdRNXbYmtz
+EObjjvbdTvLojUBR
+EPCkKvbdtbcVXWPP
+DncLKvbdmSYuZrdJ
+DoDLKvbdTukpKUBR
+EPDLKvbdsQVoKCvG
+EPDLKvbdBraCtFvr
+EPDLKvbdZQmEiNEq
+EPCjjvbdrzLosAgn
+EPCjjvbdssRsZZdc
+DncKjvbdbAudepQX
+DncKjvbdcTDKscia
+DncLKvbdlqyVZsEJ
+EOcLKvbdbVCHXkTh
+EObkKvbdYTMBMsnx
+DnbjjvbdULvPAuoJ
+DoCjjvbddtAUASlv
+DoDKjvbdxUmEpxkn
+DncKjvbdQwOEDLgc
+DoCkKvbdSPsgKGDw
+DncKjvbdiCOcFXQq
+EPDKjvbdRkYfUfkT
+EObkKvbdKCjDRJcY
+DoCjjvbdZLqctOMN
+EPCjjvbdUWLpKTaR
+EPCjjvbdLqwMzVQz
+DnbjjvbdnBivxPNu
+EObkKvbdRpUHKFdX
+EPCjjvbdeATqNXif
+DoCjjvbdfILVrOQg
+DoDKjvbdNrtVfeUp
+EOcLKvbdNUrrKmAX
+EPCjjvbdrbFllHLZ
+DncKjvbdkDMLQgUg
+DoCkKvbdVvhwvDeH
+DnbjjvbdKeegaaRV
+DoDKjvbdcJMjKfXY
+DnbjjvbdZtJJYcrn
+DoDLKvbdyqOliJwA
+DoDLKvbdMgDPmPuL
+DoCkKvbdHffzZXxH
+DoCjjvbdZxdKNblS
+EPDKjvbdkDLjqGtg
+EPDKjvbdYzbeqjVy
+DncLKvbdTppnttgm
+EObkKvbdVYgtZjnn
+EPCjjvbdzaAOgHCM
+EOcKjvbdcyxoxZRC
+EPDLKvbdxnSgxTJD
+EObkKvbdfMfXHNJk
+EPDKjvbdunszpjoU
+EObkKvbdFfKRmhsq
+EOcLKvbdhtydwRtb
+DoDLKvbdYkrDsnLm
+EPDLKvbdGGKSOItR
+EPCkKvbduDCuXVno
+EPDLKvbdrEFJQOVa
+EPDLKvbdIjEAKQGd
+EObjjvbdIryArmYM
+DoDLKvbdYkqctOMN
+EPCkKvbdiZtekqOG
+DncKjvbdzdzOzeZp
+DoDLKvbdbiNKLFwY
+DnbkKvbdlhcsqUrB
+DnbkKvbdKyRJrzuG
+DoDKjvbdOFDtIiKd
+DnbjjvbdvvlBWBVu
+DnbkKvbdlrZUyrdJ
+EObkKvbdxZgeewdr
+DncKjvbdegkVrNpg
+DoCjjvbdrJAJeNPF
+EObjjvbdmfeXmOHZ
+DoCjjvbdNPwqVmfs
+DnbjjvbdnPzYvLZC
+EPDKjvbdZshiYcrn
+EOcLKvbdhgJcYvJu
+DoDLKvbdXrlAmToY
+DnbkKvbdwWlAvBVu
+DnbkKvbdjvWnEBww
+DoDLKvbdTYLLmzjx
+EOcKjvbdDihJuxKA
+DncLKvbdTfznLvue
+DoCjjvbdVgwvXgYz
+EObjjvbdsBfMkgKy
+EPCjjvbdUaBqTQrZ
+DnbjjvbdbhmJkGWx
+EPCjjvbdLBLGmCYR
+DoDKjvbdwjwEHzyf
+EPDLKvbdegkVrNpg
+DoCkKvbdJpzEnfOF
+EPCkKvbdFejSOItR
+DnbjjvbdTqQnuUhN
+EOcLKvbdUMVoAvOi
+EPCkKvbdSCEFLiZL
+EPCkKvbdnCKXYPNu
+EPDLKvbdZyEKNbkr
+DncLKvbdZisIQGaf
+EObjjvbdGLEsDHmV
+DoCjjvbdBcpAujNG
+EObjjvbdZRNFIleR
+DnbjjvbdVrOXaeLc
+EPCjjvbdHELViaij
+EOcLKvbdqcdhpNvB
+EPCkKvbdiZuFkqOG
+DoCkKvbdOSsufeVQ
+DoDLKvbduoTzpjnt
+EOcLKvbdTqRPUuHm
+DoDLKvbdCDpAuilf
+EOcKjvbdZMSDsnMN
+DoDLKvbdYqNFJMeR
+DnbkKvbdbAvFFpPw
+EOcKjvbdVqmwaeMD
+EPCkKvbdUyHsyjnn
+EPCjjvbdKeehBaQu
+DoCjjvbdZshiYdTO
+EObkKvbdTvMQJsaR
+EPCjjvbdjblKqHUg
+DnbkKvbdYlSDtOMN
+EObkKvbdrWpMCiZR
+EOcKjvbdUGzmlWue
+DncKjvbdFyUuAcwb
+EPCkKvbdLZQjSztf
+EPCjjvbdfjfzbfAE
+DncKjvbdFWZQQMie
+DoCjjvbdVgxVxHYz
+EOcKjvbdWWhxWEFH
+DoDLKvbdUWLoitAq
+DoDLKvbdzaAOffbM
+EOcLKvbdrXPkbiYq
+DoCkKvbdYzberKVy
+DncLKvbdIMBznWpk
+EPCkKvbdEPCkKwDE
+DnbkKvbdWWiYVcdg
+DoCkKvbdCWzchdpW
+EOcLKvbdjvXNcbYX
+EPDLKvbdSxLMNzjx
+DnbjjvbdhficYuiu
+DncLKvbdvmWAMdEm
+EObjjvbduaDyTOdh
+DncKjvbdwWlAvBWV
+DoDKjvbdVviYWDeH
+EOcKjvbdNsUWGdtp
+DoCjjvbdzjVPodTU
+EPCkKvbdmIcsptqa
+EPDLKvbdIHHZxxYH
+EPDLKvbdUyIUZkPO
+EObkKvbdCDpBWJlf
+EPDKjvbdWSNwaeMD
+DoCjjvbdACrXjZhp
+EPDLKvbdwuMdqYlO
+DnbjjvbdHlBznWpk
+DnbjjvbduaDyTPEh
+DnbjjvbdwuNFRZLn
+EObjjvbdajkfOnDA
+DnbkKvbdWWiYWEEg
+EPDLKvbdffLymgHA
+EOcLKvbdkDMKpfuH
+EPDLKvbdMoxQvOHT
+DnbkKvbdbKkenmcA
+DoCjjvbdhytfMRNf
+DoCjjvbdIsZAsNXl
+DoDKjvbdLiBkqYAS
+DncLKvbdyzdmrHiI
+DnbjjvbdemFvfmJk
+EOcLKvbdSCEEkiYk
+DoDKjvbdbiNKKevx
+DoDLKvbdaaVdeoow
+DnbjjvbdNGcQNPuL
+DncLKvbdQYmAGrrK
+EPDKjvbdrbGMkfjy
+EPCjjvbdZjShPfbG
+DnbjjvbdJmADyfuB
+DnbjjvbdhtzFWquC
+DnbjjvbdQvmdDMID
+DncLKvbdjvWnEBww
+EPCjjvbdxZgfGXdr
+EObkKvbdDihKWXjA
+EPCkKvbdZMSETnLm
+EPDKjvbdZLqcsnMN
+EObkKvbdqwPlDJZR
+DoDKjvbdZisIQGaf
+EObjjvbdjlalZeGo
+DncKjvbdxsOJMqag
+DoDKjvbdOFEUIhkE
+DoCkKvbdzitoodSt
+DncLKvbdVrNwaeMD
+DoCjjvbdezuyEiTw
+EPDKjvbdiCOcEvpq
+DoCjjvbdvvlAvAvV
+DnbjjvbdJuuFceHJ
+DoCjjvbdlYrrSyGt
+EPCkKvbdfILVrNqH
+DoDLKvbdxsOJNRbH
+DncKjvbdIwtBgkpp
+DnbkKvbdOTUWHEtp
+EPDKjvbdFejRnIsq
+DnbjjvbdVBCRTQrZ
+EPCjjvbdiMEcnUcZ
+EObkKvbdiZuGMRNf
+EOcKjvbdatbHYLTh
+DoCkKvbdmSZVZrdJ
+DoDKjvbdqTsgRqjt
+DoDLKvbdCEQBWKNG
+DnbjjvbdZtJJZESn
+DncLKvbdIHGzZXwg
+EPDLKvbdwtmFRZMO
+DoCjjvbdKDJbqJcY
+EObkKvbdatbHXkUI
+DnbkKvbdYqNEhleR
+EObjjvbdNHColotk
+EPDKjvbdegkWSNpg
+DoDLKvbdRjyFtfjs
+DoCjjvbddoEsKtUS
+EOcLKvbdsQWOjCvG
+DoCkKvbdvAcxsOeI
+EObjjvbdbAueGQQX
+EOcLKvbdxKwEHzzG
+DoDKjvbdqTtHSRkU
+EOcKjvbdOAIsUKSA
+EPCjjvbdWSNxCElD
+EPDLKvbdnCKWwoNu
+DncLKvbdEARiMzXX
+DoCkKvbdbAvEeoow
+EOcKjvbdhgJcYvJu
+DnbjjvbdTulPisaR
+DnbjjvbdIidAKQGd
+EPDKjvbdyOTIXrhc
+EPCkKvbdrbFmLgLZ
+EPCjjvbddeOqbXDK
+DncKjvbdRacdlJZL
+EOcLKvbdbsDKtDjB
+EPCjjvbdUyHtZkOn
+EObkKvbdyTOImSBg
+DncKjvbdtbbtwWPP
+EPDKjvbdKDKDRJcY
+EObjjvbdhanbeXQq
+EOcLKvbdvvlAuaWV
+EPDLKvbdVYgsyjoO
+EPDLKvbdKaKflawq
+EOcLKvbdCIjajiFj
+EObkKvbdUsmUGMWK
+EPDLKvbdIjEAJofd
+EOcLKvbdqBJFAWhE
+EPCkKvbdEJgivXjA
+DnbkKvbdYkqdTmkm
+EPCkKvbdliDsqUrB
+EObjjvbdKVtfEEfi
+EObkKvbdmgFYMmgZ
+EObjjvbdEARhlyvw
+DncKjvbdaRecHtGL
+DnbjjvbdNQYRVmfs
+EOcLKvbdFfKRnJTq
+DncLKvbdMgDQNQUk
+EObkKvbdHgGyyXwg
+EPCkKvbdCJKbKiFj
+EPCkKvbdBraDUGXS
+EPDLKvbdiMEcnVCy
+DoDLKvbdkCkkQfuH
+EOcLKvbdwtmFRZLn
+EPDKjvbdKefHbApu
+DnbkKvbdkxrqsZGt
+EPCkKvbdfIKvRmqH
+EOcKjvbdDnbkLWbd
+EPDLKvbdaRebhTek
+DoDLKvbdjuwODaxX
+DnbjjvbdREDBPpdS
+DncLKvbdjuwNcaww
+EOcKjvbdbiMjKevx
+EPDKjvbdqvpLcIyR
+EPCjjvbdijGIKMxS
+EPDLKvbdQmYCZNtz
+EObjjvbdCDpAvKMf
+EOcLKvbdJJdAKPgE
+DoDKjvbdUxgszLOn
+DnbjjvbdOEcshhjd
+DoCjjvbdUaCRSprZ
+EPCkKvbdxmrhYTJD
+EPDKjvbdICLydzAD
+EPCjjvbdKRZdoFme
+EObkKvbdNdctJIjd
+EPCjjvbdKVuFdEgJ
+EObjjvbdrXPlDIyR
+DoCkKvbdfMewGmKL
+DnbkKvbdIwsahMQp
+EOcLKvbdRaceMIxk
+EPCkKvbdcyxoxZQb
+EObjjvbdRkYeuGkT
+DncLKvbdbVBfwkTh
+EObjjvbdTppoVUhN
+EPCjjvbdhytfMROG
+EOcKjvbdUxgszKoO
+DoCjjvbdGLEsDHlu
+EObkKvbdegkVqmqH
+DncKjvbdkMbLyeGo
+DncKjvbdyzdmqghh
+EPCkKvbdGFiqnIsq
+EPDKjvbdpstGqqjt
+EPDKjvbdYkrDsmkm
+EPCkKvbdKaLGlbXq
+DoCkKvbdxwiJbPyk
+EPCkKvbdJcKDQibx
+EPCkKvbduDCuXWPP
+DnbjjvbdiGicZWKV
+DoCkKvbdsPunicWG
+DnbjjvbdKNAEZgVB
+EPDLKvbdnPyxujyC
+EObkKvbdJXsagkpp
+EObkKvbdNddUIiKd
+DnbjjvbdQwOEClID
+DnbkKvbdFVxpQMie
+EPCkKvbdVrNxBeLc
+EPCjjvbdUsmUGLuj
+EPDLKvbdGZVVBDwb
+DoCjjvbdmRyUyrdJ
+DncKjvbddZxoxZQb
+DnbjjvbdGKdsDINV
+EObjjvbdrafNLgKy
+DoCjjvbdJbjCqJbx
+DnbjjvbdlYsSTYgU
+DoCkKvbdQvnDblID
+DoDKjvbdssSTYzFD
+DncKjvbdmozZVkZC
+EPDKjvbdjbkkRGuH
+DoDLKvbdxmrgwriD
+DoDKjvbdfHkVrORH
+EPCkKvbdJuuFceHJ
+DoDKjvbdcbSlrATm
+EPCkKvbdeATpmXif
+DncLKvbdBiKajhej
+EPCkKvbdrNZixlIJ
+EPDLKvbdKVteceGi
+EObkKvbdzjVPodTU
+DoDLKvbdWSNxCEkc
+EOcKjvbdZxcimcLr
+EOcKjvbdZnnIeEyj
+DnbkKvbdmbKWxPOV
+EPCkKvbdZLrETmkm
+EPDKjvbdnUtyjiqf
+DoCkKvbdrWpLcJZR
+DoCkKvbdaMkCStmH
+DncLKvbdFVxpQMie
+EPCjjvbdrpWOicWG
+EOcKjvbdyOTIYShc
+EObkKvbdqrVLNkBN
+EOcLKvbdQvnDbkhD
+EOcLKvbdDigiuxKA
+DncLKvbddoErkTtS
+DoDKjvbdRWmdDLgc
+EPCjjvbdiHKDZVjV
+DnbkKvbdADSYKZiQ
+DnbkKvbdsPunibuf
+DoCjjvbdSPsfiedX
+EPDKjvbdJmAEZfta
+EOcKjvbdZMRcsnLm
+DoCkKvbdiLddOUcZ
+EObkKvbdqqtkOLAm
+DoDLKvbdYpmFImFR
+EObjjvbdVhYWXfxz
+DnbjjvbdMowqWNfs
+EObkKvbdVgwuwgYz
+DoDKjvbdDxYLsssl
+DnbjjvbdZtIiYcsO
+DnbkKvbdxwiKBpZk
+DoDKjvbdEuxpPmKF
+EOcKjvbdJcKDRKCx
+EObkKvbdUtNUFlWK
+EOcKjvbdjhHLfFnL
+DoCkKvbdSQTgKGDw
+DncLKvbdQccBQRDr
+DncLKvbdILazmwRL
+DoDKjvbdYTMBNUPY
+DoDLKvbdKaKfmCXq
+EPCjjvbdkIHMGGOL
+DnbjjvbdCIjbKhfK
+DnbkKvbdVgwuwfxz
+EPCjjvbdwtmFQxkn
+EPDLKvbdcyyQYZRC
+DoDKjvbdPyNAGsRj
+EObjjvbdSLYetgLT
+DoDLKvbdMRwNZuQz
+DncKjvbdFjdrcHlu
+DoCjjvbdZyDimbkr
+DnbkKvbdRXNdClID
+EObjjvbdEYYLtUTl
+EObkKvbdVqmxBdlD
+DoDLKvbdptTgRqkU
+EOcLKvbdBdPaWKMf
+EPCjjvbdiBncEvpq
+DoDLKvbdzQoNJKXA
+DoDKjvbdUQpoUtgm
+DnbkKvbdrzLpTBHn
+DoCjjvbdunszpkPU
+EPDLKvbdSZjHsCvA
+DncKjvbdRotHJfDw
+DnbkKvbdFejSOItR
+EOcKjvbdeFOrBwCj
+DoDLKvbdkVwNdCXw
+EPCkKvbdeOdrjtTr
+EPCjjvbdhuZdwRuC
+DnbkKvbdfILVqmqH
+DncKjvbdnPzYvLYb
+DncKjvbdHgGzZYXg
+DncKjvbdkVwNcaxX
+DoDLKvbdOAJSsjSA
+DncKjvbdOFDtJIjd
+EOcLKvbdVgwvYGxz
+EObkKvbdsQVnjDWG
+DoCjjvbdZjShQHCG
+DncKjvbdzoPpeCkx
+DoDLKvbdSLZFtfjs
+DnbkKvbdBsBCtFvr
+EOcLKvbdFyUuAcwb
+DnbjjvbdqUTfqrKt
+DoCjjvbdZxdJmcLr
+DncLKvbdmbJwYPOV
+EObjjvbdEObjkXDE
+EOcKjvbdaSFcIUGL
+EPCkKvbdqYoIHQcx
+EOcKjvbdfNGWgMjL
+DoCjjvbdbrcKtEKB
+EPCkKvbdvBDxsOdh
+DnbjjvbdtcCuXVoP
+DnbjjvbdrpWPKDVf
+EOcKjvbdwyhFfYFS
+EPCjjvbdnPyyWLZC
+EPDLKvbduMYXBUAw
+DoDKjvbduaDySoFI
+DoCjjvbdyXiKCPzL
+DncLKvbdGFjSOIsq
+DoDLKvbdeEoRbXDK
+DncLKvbdcTCjtDia
+DnbjjvbdnUuZjiqf
+DnbjjvbdjlakzFHP
+EOcLKvbdwWlBWAvV
+DnbkKvbdWWiXuceH
+EObkKvbdemGWfmKL
+EObkKvbdmuUykJrG
+DoCkKvbdmozYvKxb
+DncKjvbdQZNAGsSK
+EObjjvbdjblKpgUg
+DncKjvbdSZigsDWA
+EOcLKvbdZyEJmblS
+DoCjjvbdnCJwYOmu
+EPDKjvbdtkxWaTaX
+EPDKjvbdGZUuAcwb
+DoCkKvbdyfxlANEw
+EPCkKvbdTAFJIBnd
+DncKjvbdZLqctOMN
+DncKjvbdUMWPBWPJ
+EPCkKvbdDwwksstM
+EPDKjvbdEObjjvbd
+EObjjvbdWXJYWEEg
+DnbjjvbdpaIeAXIE
+DoCjjvbdqYoIHREY
+DnbjjvbdvmWAMceN
+EObkKvbdLFfHaaQu
+EOcLKvbdpaIeAWgd
+EPDLKvbdkCkkQgUg
+DnbjjvbdePErkTtS
+DnbkKvbdNGbomQVL
+DoDLKvbdEPCjkWcE
+DoCkKvbdehLWRnRH
+EOcKjvbdyXhibQZk
+EOcLKvbdZyEKOCkr
+DoCjjvbdkDLkRGtg
+DoDLKvbdkaNPNALA
+EObkKvbdrWpLbiYq
+DoDLKvbdfHkVqmqH
+DoDLKvbdEOcLKwCd
+DoDKjvbdrykpTBHn
+DncKjvbdxZgefYFS
+DnbkKvbdJpzFPFnF
+DoCkKvbdNGcPmPtk
+EPCjjvbdhzUelRNf
+EObkKvbdVTltFlWK
+DoCkKvbduaDxrneI
+EObkKvbdSQTgJfEX
+EOcKjvbdVhYVxHYz
+EOcKjvbdkCkkQgUg
+EObkKvbdqUUHSSLU
+EOcLKvbduLwwAtAw
+EPDKjvbdZLrETnMN
+EObkKvbdmttyjjRf
+DoDKjvbdYqMdiMdq
+DoCkKvbdkNBkzEfo
+DncKjvbdiLeDnUcZ
+DoDKjvbdZLrDsnLm
+EPCkKvbduVnYKRTA
+EPCjjvbdCIkCLJFj
+EPDKjvbdssRrxyeD
+DncKjvbdQwOEClHc
+EPCkKvbdwXLaWAuu
+EPCkKvbdUyHszKoO
+EPCkKvbdJYTagkqQ
+DoCkKvbdwuNFRYlO
+EPCjjvbdfHkWRmqH
+EOcKjvbddeOqbXCj
+EObkKvbdhficYujV
+EPCkKvbdmSYtzTEJ
+EPCjjvbdtkxWaTaX
+EPDLKvbdwygfGYEr
+EPDKjvbdmpZxvKyC
+DoCjjvbdpstGrSLU
+EPDKjvbdUtMtGLuj
+EOcKjvbdjlbLzFGo
+EObkKvbdkyTSTZGt
+EOcLKvbdLYpjSzuG
+EPDLKvbdyXhibQZk
+DncKjvbdptUHSRkU
+DnbjjvbdFfKRmhtR
+DoCjjvbdtbcUwVoP
+EPDKjvbdhyuFkpnG
+EPDLKvbdFpASwHFy
+EPCjjvbdRbDeLiYk
+DncLKvbdXmqAYUut
+EObjjvbdqlyjZLgi
+DoCjjvbdssSTYydc
+DnbkKvbdTIzJqABM
+EPCkKvbdxsOJNRag
+EPCjjvbdlhcspuSB
+EObkKvbdqUTgSRjt
+EOcKjvbdOEcshhkE
+EObjjvbdzjUpPdTU
+DnbkKvbdvwLaVaWV
+EPCjjvbdmoyyVkYb
+DoCkKvbdOFETiJKd
+EPCjjvbdeEnqawCj
+EObjjvbdmuUzKjRf
+EPDLKvbdVvhxVdFH
+EPCkKvbdaSGDHsek
+EPCjjvbdkySrTZHU
+EObjjvbdtAGqIABS
+EObkKvbdZyEJmblS
+DncKjvbdyTOJMrCH
+DncLKvbdFWYoolie
+DoDLKvbdTvMPjUAq
+EObjjvbdZLqctOLm
+DnbkKvbdmIctQuSB
+DoCkKvbdZGvdAPTJ
+DoCjjvbdkDMLRGuH
+DoDLKvbdnVUykKSG
+DoDKjvbdLGFhBaRV
+DncLKvbdxwiKBozL
+DncLKvbdWIYWXgYz
+DncLKvbdFkFSbglu
+DoDKjvbdIGgZxxXg
+DnbjjvbdEztRFMDJ
+DoDLKvbdZQldiNEq
+EOcLKvbdwWkaWAvV
+DoDKjvbdLBLHMawq
+DoDLKvbdkMbLzFGo
+EPDKjvbdREDAopcr
+DoCkKvbdZoNiEdyj
+EPDLKvbddneSkUUS
+DnbkKvbdSQUHJecw
+DoCjjvbdZshhxcrn
+DnbjjvbdRkZFuHLT
+EPDKjvbdwuNEqYkn
+DoDLKvbdemGXGmJk
+EOcLKvbdKWVGDeGi
+DoCkKvbdWSOXadkc
+EObjjvbdVTmTelWK
+DncKjvbdhkeDmuDZ
+EPCkKvbdRWnEDMID
+DnbjjvbdNQYRVnGs
+DnbkKvbdTfzmlWvF
+DoCkKvbdFpASvgGZ
+DoCjjvbdqTsfqqkU
+EObkKvbdUVkpKUAq
+DoDLKvbdrRtkNjaN
+EPCkKvbdrJAKEmOe
+DncKjvbdIGfyyYXg
+DnbjjvbdZLrDtNkm
+EObjjvbdiMEcmuCy
+DncKjvbdkyTSTZHU
+DncLKvbdBsAbtFvr
+DnbkKvbdrpWPKDWG
+DncKjvbdbBWFFoow
+DoDLKvbdxmsIXsJD
+DnbkKvbdehLWRnRH
+EObkKvbdiVZeXRuC
+DnbkKvbdOTUVfduQ
+DncLKvbdZjTIQHCG
+DoDLKvbdOSsugFVQ
+DoCjjvbdrafNLgKy
+EPDLKvbdNPxRVmgT
+EPDKjvbdHlBznXQk
+EPCkKvbdCEQBWKMf
+EObjjvbdtcDUwWOo
+DoCjjvbdZMSDtNlN
+DoDLKvbdvAcxrneI
+EObjjvbdIxUCILpp
+EOcKjvbdfSBWzkbo
+EObkKvbdShzKRAAl
+DnbjjvbdGZUuBDxC
+EObkKvbdqlzKYkhJ
+EPDKjvbdZyEKNbkr
+DoDLKvbdsrrTYzFD
+DoCkKvbdfSAvzkcP
+DnbjjvbdqlzKYlHi
+EPDKjvbdYTLaNToY
+EPCjjvbdjEjgUoAO
+EOcKjvbdTJZjRABM
+EObkKvbdYORAXtvU
+DoDLKvbdGKdrcHmV
+DoDLKvbdbrcLUEJa
+DncLKvbdqvpLcJZR
+DnbkKvbdFeiqnIsq
+EPDKjvbdZnnIeEzK
+EPCjjvbdnUtzLKRf
+DoDLKvbdDxXlUUTl
+DoDKjvbdiMEcnUby
+EObkKvbdYzbeqjWZ
+DncKjvbdTvLojUAq
+EOcLKvbdjuvmdBxX
+DnbjjvbdzoPpdcMY
+DoDKjvbdrovOibuf
+DoDKjvbdFWZPomJe
+DoDKjvbdqGDeUWBI
+DoCkKvbdWWiYVdEg
+EObkKvbdtvOXiqTA
+DnbjjvbdqZPIGpdY
+EObkKvbdLBKgNCYR
+DoCjjvbdLBKgNCYR
+EObjjvbdZsiJZESn
+DoCkKvbdTqROtuIN
+EPCjjvbdyfyMAMdw
+EOcLKvbdptTgSSLU
+DncLKvbdPxmAHTSK
+DnbjjvbdRkZFtfkT
+EPDLKvbdtlXvaUAw
+EPCkKvbdqBJFAWhE
+EPCkKvbdIidAJogE
+EPDLKvbdKQydoGOF
+EObkKvbdauCGwkTh
+EPCjjvbdNddUIiKd
+DoDLKvbdFfKRmhsq
+EPCkKvbdeEnqbXCj
+EObkKvbdJvVGDdfi
+DoDKjvbdWRmwaeLc
+EObkKvbdSCDeLiZL
+EPDKjvbdDoDLLWcE
+EPDLKvbdiMEcnUby
+DnbjjvbdLBLGmBxR
+EPCjjvbdZnmiEdyj
+EObjjvbdVhXuwgYz
+DncLKvbdUtNTfMVj
+EPDLKvbdKaKgMaxR
+DncKjvbdJcJbpicY
+DnbkKvbdSKyGVHLT
+DoDKjvbdzROlhjXA
+DnbkKvbdlrZUysEJ
+DoCkKvbdnQZyWLYb
+DoCjjvbdeFOqbWbj
+EOcLKvbdjgfkfGOL
+EObkKvbdiHJbyWKV
+DnbkKvbdGdLVibJj
+DoDKjvbdGLErcINV
+EPCjjvbdNGcPlpUk
+EOcKjvbdjFLGtoAO
+EOcKjvbdsBfMlGkZ
+EObjjvbdhtydvquC
+DoCjjvbdznpRFCkx
+DncLKvbdYSkaNUOx
+DoCjjvbdVvhxVdFH
+EPDLKvbdNeETiJLE
+DoDKjvbdcScLTdJa
+EOcLKvbdQwNdDLgc
+DoDLKvbdUMWPBWPJ
+DncKjvbdqFdEtVaI
+EObjjvbdhbPCeXRR
+DoCjjvbdKeehCApu
+DncKjvbdYNqAXuVt
+DoDLKvbdjmCLzFGo
+DoCkKvbdtlXwBUAw
+EObkKvbdwtmEqYlO
+EObjjvbdrovOjCvG
+EObkKvbdqrVLOLBN
+DoCjjvbdSBcdkhxk
+DncLKvbdrEEhomua
+EObkKvbdtbbtvuno
+EPDLKvbdZjShQGaf
+EPCjjvbdTAFJHbPE
+DnbjjvbdcScLTcia
+EObkKvbdbsDLUDia
+DnbkKvbdkyTSTYgU
+DncKjvbdySmhmSCH
+DoCjjvbdnBivxPNu
+DncKjvbdEXxLtTtM
+EObjjvbdZshhyESn
+DoDKjvbdkMbLzEfo
+EObjjvbdssRrxyeD
+DoDKjvbdcSbkTdKB
+EPDLKvbdHDjvJbKK
+DncLKvbdsQVnjCvG
+DnbjjvbdJSyBTMwl
+EOcLKvbddZxpYYqC
+EPCjjvbdrXQLcJZR
+DoCkKvbdnHEwlmfy
+EOcKjvbdGZUuBDwb
+EObjjvbdvOszqKnt
+EOcLKvbdRosgKFdX
+EPCjjvbdMpXqWNfs
+EPCkKvbdJbibqJcY
+DncKjvbdJvVFdEgJ
+EObkKvbdqwPkcIyR
+DnbkKvbdDwxMUTtM
+DncKjvbdtcDVXVno
+EPDLKvbdlZSrSxft
+DoCkKvbdKeehCApu
+EPDLKvbdQlxCYmtz
+EOcLKvbdYqNFJNFR
+DoCkKvbdnCKWwoOV
+EObjjvbdwzIFfYEr
+EOcKjvbdkDMLQfuH
+EPCjjvbdrSUjnLBN
+EPCkKvbdTfznMXVe
+EPCkKvbdZxdKNcMS
+DoCjjvbdJXsaglRQ
+DoCjjvbdNPwqWNgT
+DoCjjvbdLqwMzUpz
+EOcKjvbdCDoaWJlf
+DnbjjvbdlYsRsZGt
+DncKjvbdeOdsLUUS
+EOcKjvbdEvZQPmJe
+DoCkKvbdqBJFAXHd
+DnbjjvbdtkwwBUBX
+EObjjvbdLFfHaaQu
+DoDLKvbdbLMFoNcA
+EPDLKvbdiLdcnUby
+DnbkKvbdUQqPVUgm
+EOcLKvbdEOcLLXDE
+DoDKjvbdrEEhpOWB
+DncKjvbdkCkkQftg
+DncLKvbdMfbpNQUk
+DnbjjvbdTulQKUAq
+DoDLKvbdUtNUFkvK
+DncKjvbddndsKtTr
+EPDKjvbdliDsqVSB
+EPCkKvbdhbOcEvqR
+DoCkKvbdqceJQNua
+DoCkKvbdrWpLcIyR
+DncKjvbdrSVLNkAm
+DoDLKvbdyOShYTJD
+DncKjvbdyYJKBoyk
+DnbjjvbdZQldiNFR
+EPDLKvbdePEsKstS
+EPCjjvbdcScKtDia
+DncLKvbdxsOJNRbH
+EObjjvbdEYXlUUTl
+DoCkKvbdxUldqZMO
+EOcKjvbdRjxeuGkT
+EOcLKvbdqrVLNjaN
+DoCkKvbdDwwktUUM
+EOcLKvbdZQmEiNFR
+EPCkKvbdMSXMytpz
+DnbkKvbdnUtzKiqf
+DoCjjvbdREDAoqDr
+EPCjjvbdZyDinDMS
+EPCjjvbdiCPDEwRR
+EPCkKvbdmSZUzSci
+DoDKjvbdkWWmdCXw
+DnbkKvbdmJDsqVRa
+EPDKjvbdhzVGLpnG
+DoCkKvbdsPuoKDWG
+DoDLKvbdrylPsAgn
+EPCjjvbdsPuoJbuf
+EOcKjvbdrEFJQOVa
+EPCjjvbdEPDLLXCd
+DncKjvbdkVwOEBxX
+EPCkKvbdqGEFUWAh
+DncLKvbdtbcUvuno
+EOcKjvbdWIYWYGxz
+EPDLKvbdZLqcsmkm
+DoDKjvbdmaivwnnV
+DoCkKvbdOYPVzcmt
+DoCjjvbdVwIwvDeH
+DoCjjvbdYkrETmkm
+DoDKjvbdLFfHbAqV
+EObjjvbdkIHLefOL
+EPDKjvbdZjShPfaf
+DoCjjvbdehLWSORH
+DncLKvbdKfFgbBQu
+EObkKvbdsPunjDVf
+DncKjvbdiMEdNuCy
+DncKjvbdFfKSNhtR
+EOcKjvbdFVxpQNKF
+DncLKvbdfHkVrORH
+EObjjvbdKefIBaQu
+EPDKjvbduCbtvuoP
+EPCkKvbdGdLWKCKK
+DncLKvbdLAkGmBwq
+DncLKvbdZshiZESn
+DnbjjvbdySmhmSCH
+DoDKjvbdACqxJyiQ
+DncLKvbdmajXYOmu
+DnbjjvbdxVNFRZMO
+DnbjjvbdVqmxBdlD
+DnbkKvbdIGgZyYXg
+DncKjvbdddnrBvcK
+EPCjjvbdUGzmkwVe
+DncLKvbdaNLCTVNH
+DoCkKvbdWWhwucdg
+DncKjvbdkWWmcaxX
+DoDKjvbdaRfChUGL
+EPDLKvbdOEcsiJKd
+DoDLKvbdGLFTChMu
+EObjjvbdjmBkzFHP
+DncLKvbdrWokcJYq
+EObjjvbdDHMGHAzc
+EObkKvbdRyjITCvA
+DnbjjvbdWRnXbElD
+DoCjjvbdEARiNZvw
+DnbkKvbdRjyFtfjs
+DoCkKvbdMgDQNQVL
+DoDKjvbdCEPaWJmG
+DoCkKvbdUtNTfLuj
+DoDKjvbdNGcQMpVL
+DoDKjvbdZQmFImEq
+EObjjvbdyYIibPyk
+DoDLKvbdcSbjtDjB
+EPCjjvbdPxmAGsSK
+EPCjjvbdnUuZjirG
+EPCkKvbddijSVtzn
+EOcKjvbdxUmEqYlO
+EOcKjvbdxrmiNRag
+EPCkKvbdjmBlZeHP
+EOcKjvbdvBDySndh
+EObjjvbdliDsqVSB
+EOcKjvbdTvMQKUBR
+DncLKvbdRNXbYnUz
+DnbjjvbdyYIiaozL
+DoCkKvbdhbPDEwRR
+EPDKjvbdptUGrSLU
+DoDKjvbdFjeTChMu
+DnbkKvbdFVxoomJe
+EObkKvbdlYrrSyGt
+EPDLKvbdVZHszKnn
+DncLKvbdDwwktUUM
+DncLKvbdDnbkKvcE
+EPCkKvbdjJfHjMwr
+EPDKjvbdUtNTfMWK
+EObjjvbdbhlikGWx
+DncLKvbdKfFhCBQu
+DoDKjvbdVgwvXgYz
+EPDLKvbdiBoCdwRR
+EPDLKvbdzdzOzeZp
+EObkKvbdMoxRWNgT
+EPDKjvbdjvXNdBww
+EObkKvbdUtMsfLuj
+EOcLKvbdnUuZjjRf
+DnbkKvbduCbtwVoP
+EPDLKvbdGGKRmhsq
+EObkKvbdePEsLTtS
+DoCjjvbdSKyGUgLT
+EOcLKvbdRbDdlIyL
+DoDLKvbdNxPVzcnU
+EObjjvbdkCkkRGtg
+DncKjvbdVTmUFkvK
+DncKjvbdUsltFkuj
+EPDKjvbdSCEElJZL
+EOcKjvbdZxcjNcMS
+DoCjjvbdEJgjWYKA
+DncLKvbdREDBQRDr
+DncKjvbddoErjtUS
+EPDLKvbdADSYJyiQ
+EPDKjvbdatafxKsh
+EPDLKvbdkIGkeemk
+DoDLKvbdmRxtzSci
+DnbkKvbdTlWPAvPJ
+DncKjvbdjJegjMwr
+DoCkKvbdqTtHSSKt
+EOcKjvbdkMakzFHP
+DncLKvbddZyPwxpb
+DnbkKvbdTppnuUgm
+EObkKvbdnPyxukZC
+DoDKjvbdbiNJjewY
+EPDKjvbdJSyArlwl
+EPDLKvbdvvlBVaVu
+EOcLKvbdjJfIKMxS
+EPDLKvbdliETqVRa
+DoCkKvbdWXJXvEFH
+DncLKvbdiHKDZWKV
+EObkKvbdEXwktUUM
+EOcKjvbdRWnDcMID
+EPDLKvbdbhljKfWx
+DnbkKvbdVTlsfMVj
+DnbjjvbdZoOIdeZj
+DoDKjvbdDxYLtUTl
+EObjjvbdmIdTqUqa
+EPCjjvbdiZtekqNf
+DoDLKvbdMfcPmPtk
+EPDLKvbdKxpirztf
+DnbkKvbdEARhlzWw
+EOcKjvbdqiAJeMne
+DnbjjvbdUsltGMWK
+DnbkKvbdMoxRWNfs
+EPCjjvbdTqQntuIN
+EPDKjvbdLFfHbApu
+EOcLKvbdANIZSwZx
+DoCjjvbdSLZGUfjs
+DoDLKvbdJSyArlxM
+EOcLKvbddZxoxZRC
+DoDLKvbdRpTfjFcw
+EObjjvbdKefHbBRV
+EPCkKvbdjlakyeGo
+DoDLKvbdiBncFXRR
+EObkKvbdkHfkefOL
+DnbjjvbdfILVrORH
+DnbjjvbdbsDKtDia
+DoCjjvbdqiAKElne
+EObkKvbdEXxMTtUM
+DncKjvbdHfgZxxXg
+EPDKjvbdQvnDcMID
+DoDKjvbdCSaCsewS
+DncLKvbdSZigsDWA
+DnbkKvbdiUyeXSUb
+DnbkKvbdZRNFJMeR
+EPDKjvbdDxXlTstM
+EPCjjvbdkNBlZdfo
+DnbkKvbdhuZdvqtb
+DncLKvbdHDkWJajK
+EOcKjvbdhficZWKV
+DoDLKvbdxwiKCPyk
+EPDLKvbdZQleJMeR
+DoDLKvbdLrXMytpz
+DncKjvbdcTCjtEJa
+DnbkKvbdUMVnaWPJ
+DoCjjvbdnBjXYPOV
+EObjjvbduWNwjQsA
+DoCjjvbdRpUHJecw
+DnbkKvbdJYUBglQp
+EOcLKvbduoTzqKoU
+EObjjvbdZMRctNlN
+EObkKvbdziuPpESt
+DoDLKvbduLxWaTaX
+EOcLKvbdhgKDZWKV
+DnbkKvbdZQldhmFR
+EOcLKvbdcyyPxZQb
+EOcKjvbdRWnDcLgc
+DncLKvbdxZgfFweS
+EPCkKvbdyqOliJwA
+DnbjjvbdsPvPKCuf
+DoCjjvbdMgCpNQVL
+DncLKvbdOEdTiJKd
+EPDKjvbdEARiMyvw
+EOcLKvbdJbibqKDY
+DoCkKvbdeEnrCWbj
+DoCkKvbdGKdrcIMu
+DnbkKvbdUMWOaVoJ
+DoCkKvbdKaKgNCXq
+DnbkKvbdoAKztHdO
+EPDKjvbdDxXlUUTl
+EOcLKvbdFVxoomJe
+EOcKjvbdpyPHfpdY
+EPCjjvbdxwiJaoyk
+DoCkKvbdlqxtyrci
+EOcKjvbdfHkWRmpg
+DoCjjvbdkMalZdfo
+EPCjjvbdJpyePGOF
+DncLKvbdqUUHRqjt
+DoDLKvbdziuQPdSt
+DoDKjvbdBhjajiGK
+EPDKjvbdjcLjpftg
+EPDKjvbdVwJYWEFH
+DnbjjvbdNdcsiJLE
+DoCjjvbdQwODcLgc
+EOcLKvbdtkxXAtAw
+EPDKjvbdwMvANEEm
+DoCjjvbdqFdEsuaI
+EObjjvbdrSUjmjaN
+DoDLKvbdnGeYMnGy
+EOcLKvbdPyNAHTSK
+DnbkKvbdMowpvNgT
+DoCjjvbdGdLVibKK
+DoDLKvbdtcDVXVno
+EObkKvbdtlXwBUAw
+DoCjjvbdSPsgKGEX
+EPCjjvbdURQntuHm
+DncLKvbdrMyjZLgi
+EPDKjvbdwXMAvBVu
+EOcLKvbdRjxfUfkT
+DnbkKvbdGFjRnJTq
+DoCkKvbdbUbHYLTh
+EPDKjvbdoznEKxPA
+EPCjjvbdLiBlQxAS
+DncKjvbdfVzxPizs
+DnbjjvbdSKyFtgLT
+EPDKjvbdrXPlCiZR
+DncLKvbdhzVGLpnG
+EObjjvbdVwJYVdFH
+EPDKjvbdwXLaWBVu
+EPCjjvbdjhHMGFmk
+EObkKvbdKyQjSzuG
+DoCjjvbdmfeYNOHZ
+DoDLKvbdZirgofaf
+EOcLKvbdZoOIdeZj
+EPCkKvbdLFfHbApu
+EPCkKvbdjvWnEBww
+DoDKjvbdcScLUEKB
+DoCkKvbdkCkjqHUg
+DoDKjvbdyTNhmSBg
+DoCkKvbdkHgLfFnL
+EPCjjvbdzoQQdcLx
+DoCjjvbdOTTvHEtp
+EPCkKvbdznopeDLx
+EPCkKvbdGFjRmhtR
+EPCkKvbdUaCQrpqy
+EOcKjvbdnGeXmOHZ
+DoDKjvbdiCPDEwRR
+DoCjjvbdRbEFLiYk
+DncKjvbdRXOECkgc
+EPCjjvbdKWUedEgJ
+DncKjvbdDjIJvYKA
+DoDKjvbdyTOJNRbH
+DoCjjvbdePFTKtTr
+DoDKjvbdhtyeWrVC
+EPCkKvbdqvolCiZR
+DoDLKvbdapHHELzd
+EObjjvbdlhdUQtrB
+EOcKjvbdptUGrRkU
+EPCjjvbdqUTfqrLU
+EPCkKvbdcJMikGWx
+DoDKjvbdlhctRVRa
+EOcLKvbdANHyTXZx
+EPDKjvbdpssfqrKt
+EPCkKvbdFeiqnJTq
+DoCkKvbdxZgfGXdr
+EOcLKvbdRWmcblHc
+DncLKvbdjggMFemk
+DoDKjvbdKeegbBQu
--- a/test/serviceability/ParserTest.java	Thu Aug 02 17:00:18 2012 +0100
+++ b/test/serviceability/ParserTest.java	Fri Aug 03 20:23:25 2012 +0100
@@ -20,6 +20,7 @@
         testNanoTime();
         testJLong();
         testBool();
+        testQuotes();
         testMemorySize();
     }
 
@@ -95,6 +96,33 @@
         parse(name, "false", "", args);
     }
 
+    public void testQuotes() throws Exception {
+        String name = "name";
+        DiagnosticCommand arg1 = new DiagnosticCommand(name,
+                "desc", DiagnosticArgumentType.STRING,
+                false, null);
+        DiagnosticCommand arg2 = new DiagnosticCommand("arg",
+                "desc", DiagnosticArgumentType.STRING,
+                false, null);
+        DiagnosticCommand[] args = {arg1, arg2};
+
+        // try with a quoted value
+        parse(name, "Recording 1", name + "=\"Recording 1\"", args);
+        // try with a quoted argument
+        parse(name, "myrec", "\"" + name + "\"" + "=myrec", args);
+        // try with both a quoted value and a quoted argument
+        parse(name, "Recording 1", "\"" + name + "\"" + "=\"Recording 1\"", args);
+
+        // now the same thing but with other arguments after
+
+        // try with a quoted value
+        parse(name, "Recording 1", name + "=\"Recording 1\",arg=value", args);
+        // try with a quoted argument
+        parse(name, "myrec", "\"" + name + "\"" + "=myrec,arg=value", args);
+        // try with both a quoted value and a quoted argument
+        parse(name, "Recording 1", "\"" + name + "\"" + "=\"Recording 1\",arg=value", args);
+    }
+
     public void testMemorySize() throws Exception {
         String name = "name";
         String defaultValue = "1024";