/*
 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.util.Base64;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicLong;
import javax.management.JMX;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeData;

/**
 * @test
 * @bug 8167099 8139870
 * @summary test compatibility of the conversion of
 *          ThreadInfo to/from CompositeData between versions
 *          of the JDK (at this time JDK7 JDK8 and JDK9).
 * @modules java.management
 * @run main MonitorInfoCompatTest
 * @author danielfuchs
 */
public class MonitorInfoCompatTest {

    public static final class TestData {
        public final ThreadInfo ti;
        public final CompositeData cd;
        public TestData(ThreadInfo ti, CompositeData cd) {
            this.ti = ti;
            this.cd = cd;
        }
    }

    public static final class A implements Runnable {
        static final AtomicLong tokens = new AtomicLong();
        static final A lock = new A();
        final long id = tokens.incrementAndGet();
        final CountDownLatch latch = new CountDownLatch(2);
        final Semaphore sem = new Semaphore(0);

        public synchronized void m1() {
            m2();
        }

        public void m2() {
            synchronized(lock) {
                m3();
            }
        }

        public void m3() {
            try {
                latch.countDown();
                System.out.println("waiting for latch");
                latch.await();
                System.out.println("acquiring sem");
                sem.acquire();
            } catch (InterruptedException ex) {

            }
        }

        @Override
        public void run() {
            m1();
            System.out.println(this + " done");
        }

        @Override
        public String toString() {
            return "A"+id;
        }

    }

    static TestData getThreadInfo() throws Exception {
        A a = new A();
        Thread t1 = new Thread(a);
        t1.start();
        a.latch.countDown();
        a.latch.await();
        long[] ids = { t1.getId() };

        ThreadInfo[] i1 = ManagementFactory.getThreadMXBean().getThreadInfo(ids, true, true);
        //System.out.println(Arrays.toString(i1) + ": " + Arrays.toString(i1[0].getLockedMonitors()));
        //System.out.println();
        ThreadInfo ti = i1[0];
        System.out.println(ti.getLockedMonitors()[0].getLockedStackFrame());
        Object cds = ManagementFactory.getPlatformMBeanServer().invoke(
                ManagementFactory.getThreadMXBean().getObjectName(),
                "getThreadInfo",
                new Object[] {ids, true, true },
                new String[] {long[].class.getName(),
                              boolean.class.getName(),
                              boolean.class.getName()});
        a.sem.release();
        t1.join();
        return new TestData(i1[0], (CompositeData)((Object[])cds)[0]);
    }

    static byte[] serialize(Object o) throws IOException {
        try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
             ObjectOutputStream oos = new ObjectOutputStream(baos)) {
            oos.writeObject(o);
            return baos.toByteArray();
        }
    }

    static <T> T deserialize(byte[] b) throws IOException, ClassNotFoundException {
        try (ByteArrayInputStream bais = new ByteArrayInputStream(b);
             ObjectInputStream ois = new ObjectInputStream(bais)) {
             return (T)ois.readObject();
        }
    }

    public static interface ThreadInfoSupplierMXBean {
        ThreadInfo getThreadInfo();
    }
    public static interface ThreadInfoSupplierMBean {
        CompositeData getThreadInfo();
    }
    public static class ThreadInfoSupplier implements ThreadInfoSupplierMBean {
        volatile CompositeData cd;
        ThreadInfoSupplier(CompositeData cd) {
            this.cd = cd;
        }
        @Override
        public CompositeData getThreadInfo() {
            return cd;
        }
    }

    static ThreadInfo toThreadInfo(CompositeData cd) throws Exception {
        MBeanServer mbs = MBeanServerFactory.newMBeanServer();
        ObjectName cdn = new ObjectName("cd:type=cd");
        mbs.registerMBean(new ThreadInfoSupplier(cd), cdn);
        ThreadInfoSupplierMXBean cdx = JMX.newMXBeanProxy(mbs, cdn, ThreadInfoSupplierMXBean.class);
        return cdx.getThreadInfo();
    }

    
    public static void writeSerialData(byte[] b) {
        //System.out.println();
        String encoded = Base64.getEncoder().encodeToString(b);
        System.out.print("final String encoded = ");
        int len = 40;
        int from = 0;
        int remaining = encoded.length();
        String prefix = "";
        while ((len = Math.min(len, remaining)) > 0) {
            System.out.print(prefix + "\"" + encoded.substring(from, from + len) +"\"");
            prefix = "\n                      + ";
            remaining -= len;
            from += len;
        }
        System.out.println(";");
    }

    public static void main(String[] args) throws Exception {
        TestData td = getThreadInfo();
        byte[] b = serialize(td.cd);
        CompositeData cd2 = deserialize(b);
        if (!cd2.equals(td.cd)) {
            throw new RuntimeException("deserialized data does not match");
        }
        ThreadInfo ti = toThreadInfo(cd2);
        System.out.println(ti.getLockedMonitors()[0].getLockedStackFrame());
        writeSerialData(b);

        for (String key : SERIALIZED.keySet()) {
            System.out.println("Decoding " + key);
            byte[] decoded = Base64.getDecoder().decode(SERIALIZED.get(key));
            CompositeData cd3 = deserialize(decoded);
            ThreadInfo ti3 = toThreadInfo(cd3);
            System.out.println(key + " successfully converted to ThreadInfo "
                 + ti3.getThreadName() + ": " + ti3.getStackTrace()[0]);
        }
    }

    static final String JDK9 = "rO0ABXNyAC9qYXZheC5tYW5hZ2VtZW50Lm9wZW5t"
                      + "YmVhbi5Db21wb3NpdGVEYXRhU3VwcG9ydG8SNhrS"
                      + "KFpkAgACTAANY29tcG9zaXRlVHlwZXQAKkxqYXZh"
                      + "eC9tYW5hZ2VtZW50L29wZW5tYmVhbi9Db21wb3Np"
                      + "dGVUeXBlO0wACGNvbnRlbnRzdAAVTGphdmEvdXRp"
                      + "bC9Tb3J0ZWRNYXA7eHBzcgAoamF2YXgubWFuYWdl"
                      + "bWVudC5vcGVubWJlYW4uQ29tcG9zaXRlVHlwZbWH"
                      + "RutaB59CAgACTAARbmFtZVRvRGVzY3JpcHRpb250"
                      + "ABNMamF2YS91dGlsL1RyZWVNYXA7TAAKbmFtZVRv"
                      + "VHlwZXEAfgAFeHIAI2phdmF4Lm1hbmFnZW1lbnQu"
                      + "b3Blbm1iZWFuLk9wZW5UeXBlgGQakenq3jwCAANM"
                      + "AAljbGFzc05hbWV0ABJMamF2YS9sYW5nL1N0cmlu"
                      + "ZztMAAtkZXNjcmlwdGlvbnEAfgAHTAAIdHlwZU5h"
                      + "bWVxAH4AB3hwdAAoamF2YXgubWFuYWdlbWVudC5v"
                      + "cGVubWJlYW4uQ29tcG9zaXRlRGF0YXQAH2phdmEu"
                      + "bGFuZy5tYW5hZ2VtZW50LlRocmVhZEluZm9xAH4A"
                      + "CnNyABFqYXZhLnV0aWwuVHJlZU1hcAzB9j4tJWrm"
                      + "AwABTAAKY29tcGFyYXRvcnQAFkxqYXZhL3V0aWwv"
                      + "Q29tcGFyYXRvcjt4cHB3BAAAABJ0AAxibG9ja2Vk"
                      + "Q291bnRxAH4ADnQAC2Jsb2NrZWRUaW1lcQB+AA90"
                      + "AAZkYWVtb25xAH4AEHQACGluTmF0aXZlcQB+ABF0"
                      + "AAhsb2NrSW5mb3EAfgASdAAIbG9ja05hbWVxAH4A"
                      + "E3QAC2xvY2tPd25lcklkcQB+ABR0AA1sb2NrT3du"
                      + "ZXJOYW1lcQB+ABV0AA5sb2NrZWRNb25pdG9yc3EA"
                      + "fgAWdAATbG9ja2VkU3luY2hyb25pemVyc3EAfgAX"
                      + "dAAIcHJpb3JpdHlxAH4AGHQACnN0YWNrVHJhY2Vx"
                      + "AH4AGXQACXN1c3BlbmRlZHEAfgAadAAIdGhyZWFk"
                      + "SWRxAH4AG3QACnRocmVhZE5hbWVxAH4AHHQAC3Ro"
                      + "cmVhZFN0YXRlcQB+AB10AAt3YWl0ZWRDb3VudHEA"
                      + "fgAedAAKd2FpdGVkVGltZXEAfgAfeHNxAH4AC3B3"
                      + "BAAAABJxAH4ADnNyACVqYXZheC5tYW5hZ2VtZW50"
                      + "Lm9wZW5tYmVhbi5TaW1wbGVUeXBlHr9P+NxleCcC"
                      + "AAB4cQB+AAZ0AA5qYXZhLmxhbmcuTG9uZ3EAfgAj"
                      + "cQB+ACNxAH4AD3EAfgAicQB+ABBzcQB+ACF0ABFq"
                      + "YXZhLmxhbmcuQm9vbGVhbnEAfgAlcQB+ACVxAH4A"
                      + "EXEAfgAkcQB+ABJzcQB+AARxAH4ACXQAHWphdmEu"
                      + "bGFuZy5tYW5hZ2VtZW50LkxvY2tJbmZvcQB+ACdz"
                      + "cQB+AAtwdwQAAAACdAAJY2xhc3NOYW1lcQB+ACl0"
                      + "ABBpZGVudGl0eUhhc2hDb2RlcQB+ACp4c3EAfgAL"
                      + "cHcEAAAAAnEAfgApc3EAfgAhdAAQamF2YS5sYW5n"
                      + "LlN0cmluZ3EAfgAtcQB+AC1xAH4AKnNxAH4AIXQA"
                      + "EWphdmEubGFuZy5JbnRlZ2VycQB+AC9xAH4AL3hx"
                      + "AH4AE3EAfgAscQB+ABRxAH4AInEAfgAVcQB+ACxx"
                      + "AH4AFnNyACRqYXZheC5tYW5hZ2VtZW50Lm9wZW5t"
                      + "YmVhbi5BcnJheVR5cGUJ/772JyGHigIAA0kACWRp"
                      + "bWVuc2lvbloADnByaW1pdGl2ZUFycmF5TAALZWxl"
                      + "bWVudFR5cGV0ACVMamF2YXgvbWFuYWdlbWVudC9v"
                      + "cGVubWJlYW4vT3BlblR5cGU7eHEAfgAGdAArW0xq"
                      + "YXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5Db21w"
                      + "b3NpdGVEYXRhO3QAPTEtZGltZW5zaW9uIGFycmF5"
                      + "IG9mIGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFu"
                      + "LkNvbXBvc2l0ZURhdGF0ACtbTGphdmF4Lm1hbmFn"
                      + "ZW1lbnQub3Blbm1iZWFuLkNvbXBvc2l0ZURhdGE7"
                      + "AAAAAQBzcQB+AARxAH4ACXQAIGphdmEubGFuZy5t"
                      + "YW5hZ2VtZW50Lk1vbml0b3JJbmZvcQB+ADdzcQB+"
                      + "AAtwdwQAAAAEdAAJY2xhc3NOYW1lcQB+ADl0ABBp"
                      + "ZGVudGl0eUhhc2hDb2RlcQB+ADp0ABBsb2NrZWRT"
                      + "dGFja0RlcHRocQB+ADt0ABBsb2NrZWRTdGFja0Zy"
                      + "YW1lcQB+ADx4c3EAfgALcHcEAAAABHEAfgA5cQB+"
                      + "ACxxAH4AOnEAfgAucQB+ADtxAH4ALnEAfgA8c3EA"
                      + "fgAEcQB+AAl0ABtqYXZhLmxhbmcuU3RhY2tUcmFj"
                      + "ZUVsZW1lbnRxAH4AP3NxAH4AC3B3BAAAAAh0AA9j"
                      + "bGFzc0xvYWRlck5hbWVxAH4AQXQACWNsYXNzTmFt"
                      + "ZXEAfgBCdAAIZmlsZU5hbWVxAH4AQ3QACmxpbmVO"
                      + "dW1iZXJxAH4ARHQACm1ldGhvZE5hbWVxAH4ARXQA"
                      + "Cm1vZHVsZU5hbWVxAH4ARnQADW1vZHVsZVZlcnNp"
                      + "b25xAH4AR3QADG5hdGl2ZU1ldGhvZHEAfgBIeHNx"
                      + "AH4AC3B3BAAAAAhxAH4AQXEAfgAscQB+AEJxAH4A"
                      + "LHEAfgBDcQB+ACxxAH4ARHEAfgAucQB+AEVxAH4A"
                      + "LHEAfgBGcQB+ACxxAH4AR3EAfgAscQB+AEhxAH4A"
                      + "JHh4cQB+ABdzcQB+ADB0ACtbTGphdmF4Lm1hbmFn"
                      + "ZW1lbnQub3Blbm1iZWFuLkNvbXBvc2l0ZURhdGE7"
                      + "dAA9MS1kaW1lbnNpb24gYXJyYXkgb2YgamF2YXgu"
                      + "bWFuYWdlbWVudC5vcGVubWJlYW4uQ29tcG9zaXRl"
                      + "RGF0YXQAK1tMamF2YXgubWFuYWdlbWVudC5vcGVu"
                      + "bWJlYW4uQ29tcG9zaXRlRGF0YTsAAAABAHEAfgAm"
                      + "cQB+ABhxAH4ALnEAfgAZc3EAfgAwdAArW0xqYXZh"
                      + "eC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5Db21wb3Np"
                      + "dGVEYXRhO3QAPTEtZGltZW5zaW9uIGFycmF5IG9m"
                      + "IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLkNv"
                      + "bXBvc2l0ZURhdGF0ACtbTGphdmF4Lm1hbmFnZW1l"
                      + "bnQub3Blbm1iZWFuLkNvbXBvc2l0ZURhdGE7AAAA"
                      + "AQBxAH4APnEAfgAacQB+ACRxAH4AG3EAfgAicQB+"
                      + "ABxxAH4ALHEAfgAdcQB+ACxxAH4AHnEAfgAicQB+"
                      + "AB9xAH4AInhzcQB+AAtwdwQAAAAScQB+AA5zcgAO"
                      + "amF2YS5sYW5nLkxvbmc7i+SQzI8j3wIAAUoABXZh"
                      + "bHVleHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5Tg"
                      + "iwIAAHhwAAAAAAAAAABxAH4AD3NxAH4AU///////"
                      + "////cQB+ABBzcgARamF2YS5sYW5nLkJvb2xlYW7N"
                      + "IHKA1Zz67gIAAVoABXZhbHVleHAAcQB+ABFzcQB+"
                      + "AFcAcQB+ABJzcQB+AABxAH4AJnNxAH4AC3B3BAAA"
                      + "AAJxAH4AKXQAKmphdmEudXRpbC5jb25jdXJyZW50"
                      + "LlNlbWFwaG9yZSROb25mYWlyU3luY3EAfgAqc3IA"
                      + "EWphdmEubGFuZy5JbnRlZ2VyEuKgpPeBhzgCAAFJ"
                      + "AAV2YWx1ZXhxAH4AVF8oKrt4cQB+ABN0ADNqYXZh"
                      + "LnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmUkTm9u"
                      + "ZmFpclN5bmNANWYyODJhYmJxAH4AFHNxAH4AU///"
                      + "////////cQB+ABVwcQB+ABZ1cgArW0xqYXZheC5t"
                      + "YW5hZ2VtZW50Lm9wZW5tYmVhbi5Db21wb3NpdGVE"
                      + "YXRhO+rFYHvwxfHiAgAAeHAAAAACc3EAfgAAcQB+"
                      + "ADZzcQB+AAtwdwQAAAAEcQB+ADl0ABdNb25pdG9y"
                      + "SW5mb0NvbXBhdFRlc3QkQXEAfgA6c3EAfgBdWhwF"
                      + "QnEAfgA7c3EAfgBdAAAAB3EAfgA8c3EAfgAAcQB+"
                      + "AD5zcQB+AAtwdwQAAAAIcQB+AEF0AANhcHBxAH4A"
                      + "QnEAfgBlcQB+AEN0ABpNb25pdG9ySW5mb0NvbXBh"
                      + "dFRlc3QuamF2YXEAfgBEc3EAfgBdAAAALHEAfgBF"
                      + "dAACbTJxAH4ARnBxAH4AR3BxAH4ASHNxAH4AVwB4"
                      + "eHNxAH4AAHEAfgA2c3EAfgALcHcEAAAABHEAfgA5"
                      + "cQB+AGVxAH4AOnNxAH4AXSel+IBxAH4AO3NxAH4A"
                      + "XQAAAAhxAH4APHNxAH4AAHEAfgA+c3EAfgALcHcE"
                      + "AAAACHEAfgBBcQB+AGpxAH4AQnEAfgBlcQB+AENx"
                      + "AH4Aa3EAfgBEc3EAfgBdAAAAJ3EAfgBFdAACbTFx"
                      + "AH4ARnBxAH4AR3BxAH4ASHNxAH4AVwB4eHEAfgAX"
                      + "dXEAfgBhAAAAAHEAfgAYc3EAfgBdAAAABXEAfgAZ"
                      + "dXEAfgBhAAAAC3NxAH4AAHEAfgA+c3EAfgALcHcE"
                      + "AAAACHEAfgBBcHEAfgBCdAAYamRrLmludGVybmFs"
                      + "Lm1pc2MuVW5zYWZlcQB+AEN0AAtVbnNhZmUuamF2"
                      + "YXEAfgBEc3EAfgBd/////nEAfgBFdAAEcGFya3EA"
                      + "fgBGdAAJamF2YS5iYXNlcQB+AEd0AAo5LWludGVy"
                      + "bmFscQB+AEhzcQB+AFcBeHNxAH4AAHEAfgA+c3EA"
                      + "fgALcHcEAAAACHEAfgBBcHEAfgBCdAAmamF2YS51"
                      + "dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9ja1N1cHBv"
                      + "cnRxAH4AQ3QAEExvY2tTdXBwb3J0LmphdmFxAH4A"
                      + "RHNxAH4AXQAAAMBxAH4ARXEAfgCAcQB+AEZxAH4A"
                      + "gXEAfgBHcQB+AIJxAH4ASHNxAH4AVwB4c3EAfgAA"
                      + "cQB+AD5zcQB+AAtwdwQAAAAIcQB+AEFwcQB+AEJ0"
                      + "ADVqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5B"
                      + "YnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplcnEAfgBD"
                      + "dAAfQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIu"
                      + "amF2YXEAfgBEc3EAfgBdAAADZ3EAfgBFdAAVcGFy"
                      + "a0FuZENoZWNrSW50ZXJydXB0cQB+AEZxAH4AgXEA"
                      + "fgBHcQB+AIJxAH4ASHNxAH4AVwB4c3EAfgAAcQB+"
                      + "AD5zcQB+AAtwdwQAAAAIcQB+AEFwcQB+AEJxAH4A"
                      + "jHEAfgBDcQB+AI1xAH4ARHNxAH4AXQAABABxAH4A"
                      + "RXQAHGRvQWNxdWlyZVNoYXJlZEludGVycnVwdGli"
                      + "bHlxAH4ARnEAfgCBcQB+AEdxAH4AgnEAfgBIc3EA"
                      + "fgBXAHhzcQB+AABxAH4APnNxAH4AC3B3BAAAAAhx"
                      + "AH4AQXBxAH4AQnEAfgCMcQB+AENxAH4AjXEAfgBE"
                      + "c3EAfgBdAAAFM3EAfgBFdAAaYWNxdWlyZVNoYXJl"
                      + "ZEludGVycnVwdGlibHlxAH4ARnEAfgCBcQB+AEdx"
                      + "AH4AgnEAfgBIc3EAfgBXAHhzcQB+AABxAH4APnNx"
                      + "AH4AC3B3BAAAAAhxAH4AQXBxAH4AQnQAHmphdmEu"
                      + "dXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZXEAfgBD"
                      + "dAAOU2VtYXBob3JlLmphdmFxAH4ARHNxAH4AXQAA"
                      + "AT5xAH4ARXQAB2FjcXVpcmVxAH4ARnEAfgCBcQB+"
                      + "AEdxAH4AgnEAfgBIc3EAfgBXAHhzcQB+AABxAH4A"
                      + "PnNxAH4AC3B3BAAAAAhxAH4AQXEAfgBqcQB+AEJx"
                      + "AH4AZXEAfgBDcQB+AGtxAH4ARHNxAH4AXQAAADZx"
                      + "AH4ARXQAAm0zcQB+AEZwcQB+AEdwcQB+AEhzcQB+"
                      + "AFcAeHNxAH4AAHEAfgA+c3EAfgALcHcEAAAACHEA"
                      + "fgBBcQB+AGpxAH4AQnEAfgBlcQB+AENxAH4Aa3EA"
                      + "fgBEc3EAfgBdAAAALHEAfgBFcQB+AG1xAH4ARnBx"
                      + "AH4AR3BxAH4ASHNxAH4AVwB4c3EAfgAAcQB+AD5z"
                      + "cQB+AAtwdwQAAAAIcQB+AEFxAH4AanEAfgBCcQB+"
                      + "AGVxAH4AQ3EAfgBrcQB+AERzcQB+AF0AAAAncQB+"
                      + "AEVxAH4AdnEAfgBGcHEAfgBHcHEAfgBIc3EAfgBX"
                      + "AHhzcQB+AABxAH4APnNxAH4AC3B3BAAAAAhxAH4A"
                      + "QXEAfgBqcQB+AEJxAH4AZXEAfgBDcQB+AGtxAH4A"
                      + "RHNxAH4AXQAAAD5xAH4ARXQAA3J1bnEAfgBGcHEA"
                      + "fgBHcHEAfgBIc3EAfgBXAHhzcQB+AABxAH4APnNx"
                      + "AH4AC3B3BAAAAAhxAH4AQXBxAH4AQnQAEGphdmEu"
                      + "bGFuZy5UaHJlYWRxAH4AQ3QAC1RocmVhZC5qYXZh"
                      + "cQB+AERzcQB+AF0AAANMcQB+AEVxAH4AsnEAfgBG"
                      + "cQB+AIFxAH4AR3EAfgCCcQB+AEhzcQB+AFcAeHEA"
                      + "fgAac3EAfgBXAHEAfgAbc3EAfgBTAAAAAAAAAAtx"
                      + "AH4AHHQACFRocmVhZC0wcQB+AB10AAdXQUlUSU5H"
                      + "cQB+AB5zcQB+AFMAAAAAAAAAAXEAfgAfc3EAfgBT"
                      + "//////////94";

    static final String JDK8 = "rO0ABXNyAC9qYXZheC5tYW5hZ2VtZW50Lm9wZW5t"
                      + "YmVhbi5Db21wb3NpdGVEYXRhU3VwcG9ydG8SNhrS"
                      + "KFpkAgACTAANY29tcG9zaXRlVHlwZXQAKkxqYXZh"
                      + "eC9tYW5hZ2VtZW50L29wZW5tYmVhbi9Db21wb3Np"
                      + "dGVUeXBlO0wACGNvbnRlbnRzdAAVTGphdmEvdXRp"
                      + "bC9Tb3J0ZWRNYXA7eHBzcgAoamF2YXgubWFuYWdl"
                      + "bWVudC5vcGVubWJlYW4uQ29tcG9zaXRlVHlwZbWH"
                      + "RutaB59CAgACTAARbmFtZVRvRGVzY3JpcHRpb250"
                      + "ABNMamF2YS91dGlsL1RyZWVNYXA7TAAKbmFtZVRv"
                      + "VHlwZXEAfgAFeHIAI2phdmF4Lm1hbmFnZW1lbnQu"
                      + "b3Blbm1iZWFuLk9wZW5UeXBlgGQakenq3jwCAANM"
                      + "AAljbGFzc05hbWV0ABJMamF2YS9sYW5nL1N0cmlu"
                      + "ZztMAAtkZXNjcmlwdGlvbnEAfgAHTAAIdHlwZU5h"
                      + "bWVxAH4AB3hwdAAoamF2YXgubWFuYWdlbWVudC5v"
                      + "cGVubWJlYW4uQ29tcG9zaXRlRGF0YXQAH2phdmEu"
                      + "bGFuZy5tYW5hZ2VtZW50LlRocmVhZEluZm9xAH4A"
                      + "CnNyABFqYXZhLnV0aWwuVHJlZU1hcAzB9j4tJWrm"
                      + "AwABTAAKY29tcGFyYXRvcnQAFkxqYXZhL3V0aWwv"
                      + "Q29tcGFyYXRvcjt4cHB3BAAAABB0AAxibG9ja2Vk"
                      + "Q291bnRxAH4ADnQAC2Jsb2NrZWRUaW1lcQB+AA90"
                      + "AAhpbk5hdGl2ZXEAfgAQdAAIbG9ja0luZm9xAH4A"
                      + "EXQACGxvY2tOYW1lcQB+ABJ0AAtsb2NrT3duZXJJ"
                      + "ZHEAfgATdAANbG9ja093bmVyTmFtZXEAfgAUdAAO"
                      + "bG9ja2VkTW9uaXRvcnNxAH4AFXQAE2xvY2tlZFN5"
                      + "bmNocm9uaXplcnNxAH4AFnQACnN0YWNrVHJhY2Vx"
                      + "AH4AF3QACXN1c3BlbmRlZHEAfgAYdAAIdGhyZWFk"
                      + "SWRxAH4AGXQACnRocmVhZE5hbWVxAH4AGnQAC3Ro"
                      + "cmVhZFN0YXRlcQB+ABt0AAt3YWl0ZWRDb3VudHEA"
                      + "fgAcdAAKd2FpdGVkVGltZXEAfgAdeHNxAH4AC3B3"
                      + "BAAAABBxAH4ADnNyACVqYXZheC5tYW5hZ2VtZW50"
                      + "Lm9wZW5tYmVhbi5TaW1wbGVUeXBlHr9P+NxleCcC"
                      + "AAB4cQB+AAZ0AA5qYXZhLmxhbmcuTG9uZ3EAfgAh"
                      + "cQB+ACFxAH4AD3EAfgAgcQB+ABBzcQB+AB90ABFq"
                      + "YXZhLmxhbmcuQm9vbGVhbnEAfgAjcQB+ACNxAH4A"
                      + "EXNxAH4ABHEAfgAJdAAdamF2YS5sYW5nLm1hbmFn"
                      + "ZW1lbnQuTG9ja0luZm9xAH4AJXNxAH4AC3B3BAAA"
                      + "AAJ0AAljbGFzc05hbWVxAH4AJ3QAEGlkZW50aXR5"
                      + "SGFzaENvZGVxAH4AKHhzcQB+AAtwdwQAAAACcQB+"
                      + "ACdzcQB+AB90ABBqYXZhLmxhbmcuU3RyaW5ncQB+"
                      + "ACtxAH4AK3EAfgAoc3EAfgAfdAARamF2YS5sYW5n"
                      + "LkludGVnZXJxAH4ALXEAfgAteHEAfgAScQB+ACpx"
                      + "AH4AE3EAfgAgcQB+ABRxAH4AKnEAfgAVc3IAJGph"
                      + "dmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLkFycmF5"
                      + "VHlwZQn/vvYnIYeKAgADSQAJZGltZW5zaW9uWgAO"
                      + "cHJpbWl0aXZlQXJyYXlMAAtlbGVtZW50VHlwZXQA"
                      + "JUxqYXZheC9tYW5hZ2VtZW50L29wZW5tYmVhbi9P"
                      + "cGVuVHlwZTt4cQB+AAZ0ACtbTGphdmF4Lm1hbmFn"
                      + "ZW1lbnQub3Blbm1iZWFuLkNvbXBvc2l0ZURhdGE7"
                      + "dAA9MS1kaW1lbnNpb24gYXJyYXkgb2YgamF2YXgu"
                      + "bWFuYWdlbWVudC5vcGVubWJlYW4uQ29tcG9zaXRl"
                      + "RGF0YXQAK1tMamF2YXgubWFuYWdlbWVudC5vcGVu"
                      + "bWJlYW4uQ29tcG9zaXRlRGF0YTsAAAABAHNxAH4A"
                      + "BHEAfgAJdAAgamF2YS5sYW5nLm1hbmFnZW1lbnQu"
                      + "TW9uaXRvckluZm9xAH4ANXNxAH4AC3B3BAAAAAR0"
                      + "AAljbGFzc05hbWVxAH4AN3QAEGlkZW50aXR5SGFz"
                      + "aENvZGVxAH4AOHQAEGxvY2tlZFN0YWNrRGVwdGhx"
                      + "AH4AOXQAEGxvY2tlZFN0YWNrRnJhbWVxAH4AOnhz"
                      + "cQB+AAtwdwQAAAAEcQB+ADdxAH4AKnEAfgA4cQB+"
                      + "ACxxAH4AOXEAfgAscQB+ADpzcQB+AARxAH4ACXQA"
                      + "G2phdmEubGFuZy5TdGFja1RyYWNlRWxlbWVudHEA"
                      + "fgA9c3EAfgALcHcEAAAABXQACWNsYXNzTmFtZXEA"
                      + "fgA/dAAIZmlsZU5hbWVxAH4AQHQACmxpbmVOdW1i"
                      + "ZXJxAH4AQXQACm1ldGhvZE5hbWVxAH4AQnQADG5h"
                      + "dGl2ZU1ldGhvZHEAfgBDeHNxAH4AC3B3BAAAAAVx"
                      + "AH4AP3EAfgAqcQB+AEBxAH4AKnEAfgBBcQB+ACxx"
                      + "AH4AQnEAfgAqcQB+AENxAH4AInh4cQB+ABZzcQB+"
                      + "AC50ACtbTGphdmF4Lm1hbmFnZW1lbnQub3Blbm1i"
                      + "ZWFuLkNvbXBvc2l0ZURhdGE7dAA9MS1kaW1lbnNp"
                      + "b24gYXJyYXkgb2YgamF2YXgubWFuYWdlbWVudC5v"
                      + "cGVubWJlYW4uQ29tcG9zaXRlRGF0YXQAK1tMamF2"
                      + "YXgubWFuYWdlbWVudC5vcGVubWJlYW4uQ29tcG9z"
                      + "aXRlRGF0YTsAAAABAHEAfgAkcQB+ABdzcQB+AC50"
                      + "ACtbTGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFu"
                      + "LkNvbXBvc2l0ZURhdGE7dAA9MS1kaW1lbnNpb24g"
                      + "YXJyYXkgb2YgamF2YXgubWFuYWdlbWVudC5vcGVu"
                      + "bWJlYW4uQ29tcG9zaXRlRGF0YXQAK1tMamF2YXgu"
                      + "bWFuYWdlbWVudC5vcGVubWJlYW4uQ29tcG9zaXRl"
                      + "RGF0YTsAAAABAHEAfgA8cQB+ABhxAH4AInEAfgAZ"
                      + "cQB+ACBxAH4AGnEAfgAqcQB+ABtxAH4AKnEAfgAc"
                      + "cQB+ACBxAH4AHXEAfgAgeHNxAH4AC3B3BAAAABBx"
                      + "AH4ADnNyAA5qYXZhLmxhbmcuTG9uZzuL5JDMjyPf"
                      + "AgABSgAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJl"
                      + "coaslR0LlOCLAgAAeHAAAAAAAAAAAXEAfgAPc3EA"
                      + "fgBO//////////9xAH4AEHNyABFqYXZhLmxhbmcu"
                      + "Qm9vbGVhbs0gcoDVnPruAgABWgAFdmFsdWV4cABx"
                      + "AH4AEXNxAH4AAHEAfgAkc3EAfgALcHcEAAAAAnEA"
                      + "fgAndAAqamF2YS51dGlsLmNvbmN1cnJlbnQuU2Vt"
                      + "YXBob3JlJE5vbmZhaXJTeW5jcQB+AChzcgARamF2"
                      + "YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZh"
                      + "bHVleHEAfgBPPU6saXhxAH4AEnQAM2phdmEudXRp"
                      + "bC5jb25jdXJyZW50LlNlbWFwaG9yZSROb25mYWly"
                      + "U3luY0AzZDRlYWM2OXEAfgATc3EAfgBO////////"
                      + "//9xAH4AFHBxAH4AFXVyACtbTGphdmF4Lm1hbmFn"
                      + "ZW1lbnQub3Blbm1iZWFuLkNvbXBvc2l0ZURhdGE7"
                      + "6sVge/DF8eICAAB4cAAAAAJzcQB+AABxAH4ANHNx"
                      + "AH4AC3B3BAAAAARxAH4AN3QAF01vbml0b3JJbmZv"
                      + "Q29tcGF0VGVzdCRBcQB+ADhzcQB+AFczkJdScQB+"
                      + "ADlzcQB+AFcAAAAHcQB+ADpzcQB+AABxAH4APHNx"
                      + "AH4AC3B3BAAAAAVxAH4AP3EAfgBfcQB+AEB0ABpN"
                      + "b25pdG9ySW5mb0NvbXBhdFRlc3QuamF2YXEAfgBB"
                      + "c3EAfgBXAAAALnEAfgBCdAACbTJxAH4AQ3NxAH4A"
                      + "UgB4eHNxAH4AAHEAfgA0c3EAfgALcHcEAAAABHEA"
                      + "fgA3cQB+AF9xAH4AOHNxAH4AV1X5YwJxAH4AOXNx"
                      + "AH4AVwAAAAhxAH4AOnNxAH4AAHEAfgA8c3EAfgAL"
                      + "cHcEAAAABXEAfgA/cQB+AF9xAH4AQHEAfgBkcQB+"
                      + "AEFzcQB+AFcAAAApcQB+AEJ0AAJtMXEAfgBDc3EA"
                      + "fgBSAHh4cQB+ABZ1cQB+AFsAAAAAcQB+ABd1cQB+"
                      + "AFsAAAALc3EAfgAAcQB+ADxzcQB+AAtwdwQAAAAF"
                      + "cQB+AD90AA9zdW4ubWlzYy5VbnNhZmVxAH4AQHQA"
                      + "C1Vuc2FmZS5qYXZhcQB+AEFzcQB+AFf////+cQB+"
                      + "AEJ0AARwYXJrcQB+AENzcQB+AFIBeHNxAH4AAHEA"
                      + "fgA8c3EAfgALcHcEAAAABXEAfgA/dAAmamF2YS51"
                      + "dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9ja1N1cHBv"
                      + "cnRxAH4AQHQAEExvY2tTdXBwb3J0LmphdmFxAH4A"
                      + "QXNxAH4AVwAAAK9xAH4AQnEAfgB4cQB+AENzcQB+"
                      + "AFIAeHNxAH4AAHEAfgA8c3EAfgALcHcEAAAABXEA"
                      + "fgA/dAA1amF2YS51dGlsLmNvbmN1cnJlbnQubG9j"
                      + "a3MuQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXJx"
                      + "AH4AQHQAH0Fic3RyYWN0UXVldWVkU3luY2hyb25p"
                      + "emVyLmphdmFxAH4AQXNxAH4AVwAAA0RxAH4AQnQA"
                      + "FXBhcmtBbmRDaGVja0ludGVycnVwdHEAfgBDc3EA"
                      + "fgBSAHhzcQB+AABxAH4APHNxAH4AC3B3BAAAAAVx"
                      + "AH4AP3EAfgCCcQB+AEBxAH4Ag3EAfgBBc3EAfgBX"
                      + "AAAD5XEAfgBCdAAcZG9BY3F1aXJlU2hhcmVkSW50"
                      + "ZXJydXB0aWJseXEAfgBDc3EAfgBSAHhzcQB+AABx"
                      + "AH4APHNxAH4AC3B3BAAAAAVxAH4AP3EAfgCCcQB+"
                      + "AEBxAH4Ag3EAfgBBc3EAfgBXAAAFGHEAfgBCdAAa"
                      + "YWNxdWlyZVNoYXJlZEludGVycnVwdGlibHlxAH4A"
                      + "Q3NxAH4AUgB4c3EAfgAAcQB+ADxzcQB+AAtwdwQA"
                      + "AAAFcQB+AD90AB5qYXZhLnV0aWwuY29uY3VycmVu"
                      + "dC5TZW1hcGhvcmVxAH4AQHQADlNlbWFwaG9yZS5q"
                      + "YXZhcQB+AEFzcQB+AFcAAAE4cQB+AEJ0AAdhY3F1"
                      + "aXJlcQB+AENzcQB+AFIAeHNxAH4AAHEAfgA8c3EA"
                      + "fgALcHcEAAAABXEAfgA/cQB+AF9xAH4AQHEAfgBk"
                      + "cQB+AEFzcQB+AFcAAAA4cQB+AEJ0AAJtM3EAfgBD"
                      + "c3EAfgBSAHhzcQB+AABxAH4APHNxAH4AC3B3BAAA"
                      + "AAVxAH4AP3EAfgBfcQB+AEBxAH4AZHEAfgBBc3EA"
                      + "fgBXAAAALnEAfgBCcQB+AGZxAH4AQ3NxAH4AUgB4"
                      + "c3EAfgAAcQB+ADxzcQB+AAtwdwQAAAAFcQB+AD9x"
                      + "AH4AX3EAfgBAcQB+AGRxAH4AQXNxAH4AVwAAAClx"
                      + "AH4AQnEAfgBvcQB+AENzcQB+AFIAeHNxAH4AAHEA"
                      + "fgA8c3EAfgALcHcEAAAABXEAfgA/cQB+AF9xAH4A"
                      + "QHEAfgBkcQB+AEFzcQB+AFcAAABAcQB+AEJ0AANy"
                      + "dW5xAH4AQ3NxAH4AUgB4c3EAfgAAcQB+ADxzcQB+"
                      + "AAtwdwQAAAAFcQB+AD90ABBqYXZhLmxhbmcuVGhy"
                      + "ZWFkcQB+AEB0AAtUaHJlYWQuamF2YXEAfgBBc3EA"
                      + "fgBXAAAC6XEAfgBCcQB+AKhxAH4AQ3NxAH4AUgB4"
                      + "cQB+ABhzcQB+AFIAcQB+ABlzcQB+AE4AAAAAAAAA"
                      + "CXEAfgAadAAIVGhyZWFkLTBxAH4AG3QAB1dBSVRJ"
                      + "TkdxAH4AHHNxAH4ATgAAAAAAAAABcQB+AB1zcQB+"
                      + "AE7//////////3g=";

    static final String JDK7 = "rO0ABXNyAC9qYXZheC5tYW5hZ2VtZW50Lm9wZW5t"
                      + "YmVhbi5Db21wb3NpdGVEYXRhU3VwcG9ydG8SNhrS"
                      + "KFpkAgACTAANY29tcG9zaXRlVHlwZXQAKkxqYXZh"
                      + "eC9tYW5hZ2VtZW50L29wZW5tYmVhbi9Db21wb3Np"
                      + "dGVUeXBlO0wACGNvbnRlbnRzdAAVTGphdmEvdXRp"
                      + "bC9Tb3J0ZWRNYXA7eHBzcgAoamF2YXgubWFuYWdl"
                      + "bWVudC5vcGVubWJlYW4uQ29tcG9zaXRlVHlwZbWH"
                      + "RutaB59CAgACTAARbmFtZVRvRGVzY3JpcHRpb250"
                      + "ABNMamF2YS91dGlsL1RyZWVNYXA7TAAKbmFtZVRv"
                      + "VHlwZXEAfgAFeHIAI2phdmF4Lm1hbmFnZW1lbnQu"
                      + "b3Blbm1iZWFuLk9wZW5UeXBlgGQakenq3jwCAANM"
                      + "AAljbGFzc05hbWV0ABJMamF2YS9sYW5nL1N0cmlu"
                      + "ZztMAAtkZXNjcmlwdGlvbnEAfgAHTAAIdHlwZU5h"
                      + "bWVxAH4AB3hwdAAoamF2YXgubWFuYWdlbWVudC5v"
                      + "cGVubWJlYW4uQ29tcG9zaXRlRGF0YXQAH2phdmEu"
                      + "bGFuZy5tYW5hZ2VtZW50LlRocmVhZEluZm9xAH4A"
                      + "CnNyABFqYXZhLnV0aWwuVHJlZU1hcAzB9j4tJWrm"
                      + "AwABTAAKY29tcGFyYXRvcnQAFkxqYXZhL3V0aWwv"
                      + "Q29tcGFyYXRvcjt4cHB3BAAAABB0AAxibG9ja2Vk"
                      + "Q291bnRxAH4ADnQAC2Jsb2NrZWRUaW1lcQB+AA90"
                      + "AAhpbk5hdGl2ZXEAfgAQdAAIbG9ja0luZm9xAH4A"
                      + "EXQACGxvY2tOYW1lcQB+ABJ0AAtsb2NrT3duZXJJ"
                      + "ZHEAfgATdAANbG9ja093bmVyTmFtZXEAfgAUdAAO"
                      + "bG9ja2VkTW9uaXRvcnNxAH4AFXQAE2xvY2tlZFN5"
                      + "bmNocm9uaXplcnNxAH4AFnQACnN0YWNrVHJhY2Vx"
                      + "AH4AF3QACXN1c3BlbmRlZHEAfgAYdAAIdGhyZWFk"
                      + "SWRxAH4AGXQACnRocmVhZE5hbWVxAH4AGnQAC3Ro"
                      + "cmVhZFN0YXRlcQB+ABt0AAt3YWl0ZWRDb3VudHEA"
                      + "fgAcdAAKd2FpdGVkVGltZXEAfgAdeHNxAH4AC3B3"
                      + "BAAAABBxAH4ADnNyACVqYXZheC5tYW5hZ2VtZW50"
                      + "Lm9wZW5tYmVhbi5TaW1wbGVUeXBlHr9P+NxleCcC"
                      + "AAB4cQB+AAZ0AA5qYXZhLmxhbmcuTG9uZ3EAfgAh"
                      + "cQB+ACFxAH4AD3EAfgAgcQB+ABBzcQB+AB90ABFq"
                      + "YXZhLmxhbmcuQm9vbGVhbnEAfgAjcQB+ACNxAH4A"
                      + "EXNxAH4ABHEAfgAJdAAdamF2YS5sYW5nLm1hbmFn"
                      + "ZW1lbnQuTG9ja0luZm9xAH4AJXNxAH4AC3B3BAAA"
                      + "AAJ0AAljbGFzc05hbWVxAH4AJ3QAEGlkZW50aXR5"
                      + "SGFzaENvZGVxAH4AKHhzcQB+AAtwdwQAAAACcQB+"
                      + "ACdzcQB+AB90ABBqYXZhLmxhbmcuU3RyaW5ncQB+"
                      + "ACtxAH4AK3EAfgAoc3EAfgAfdAARamF2YS5sYW5n"
                      + "LkludGVnZXJxAH4ALXEAfgAteHEAfgAScQB+ACpx"
                      + "AH4AE3EAfgAgcQB+ABRxAH4AKnEAfgAVc3IAJGph"
                      + "dmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLkFycmF5"
                      + "VHlwZQn/vvYnIYeKAgADSQAJZGltZW5zaW9uWgAO"
                      + "cHJpbWl0aXZlQXJyYXlMAAtlbGVtZW50VHlwZXQA"
                      + "JUxqYXZheC9tYW5hZ2VtZW50L29wZW5tYmVhbi9P"
                      + "cGVuVHlwZTt4cQB+AAZ0ACtbTGphdmF4Lm1hbmFn"
                      + "ZW1lbnQub3Blbm1iZWFuLkNvbXBvc2l0ZURhdGE7"
                      + "dAA9MS1kaW1lbnNpb24gYXJyYXkgb2YgamF2YXgu"
                      + "bWFuYWdlbWVudC5vcGVubWJlYW4uQ29tcG9zaXRl"
                      + "RGF0YXQAK1tMamF2YXgubWFuYWdlbWVudC5vcGVu"
                      + "bWJlYW4uQ29tcG9zaXRlRGF0YTsAAAABAHNxAH4A"
                      + "BHEAfgAJdAAgamF2YS5sYW5nLm1hbmFnZW1lbnQu"
                      + "TW9uaXRvckluZm9xAH4ANXNxAH4AC3B3BAAAAAR0"
                      + "AAljbGFzc05hbWVxAH4AN3QAEGlkZW50aXR5SGFz"
                      + "aENvZGVxAH4AOHQAEGxvY2tlZFN0YWNrRGVwdGhx"
                      + "AH4AOXQAEGxvY2tlZFN0YWNrRnJhbWVxAH4AOnhz"
                      + "cQB+AAtwdwQAAAAEcQB+ADdxAH4AKnEAfgA4cQB+"
                      + "ACxxAH4AOXEAfgAscQB+ADpzcQB+AARxAH4ACXQA"
                      + "G2phdmEubGFuZy5TdGFja1RyYWNlRWxlbWVudHEA"
                      + "fgA9c3EAfgALcHcEAAAABXQACWNsYXNzTmFtZXEA"
                      + "fgA/dAAIZmlsZU5hbWVxAH4AQHQACmxpbmVOdW1i"
                      + "ZXJxAH4AQXQACm1ldGhvZE5hbWVxAH4AQnQADG5h"
                      + "dGl2ZU1ldGhvZHEAfgBDeHNxAH4AC3B3BAAAAAVx"
                      + "AH4AP3EAfgAqcQB+AEBxAH4AKnEAfgBBcQB+ACxx"
                      + "AH4AQnEAfgAqcQB+AENxAH4AInh4cQB+ABZzcQB+"
                      + "AC50ACtbTGphdmF4Lm1hbmFnZW1lbnQub3Blbm1i"
                      + "ZWFuLkNvbXBvc2l0ZURhdGE7dAA9MS1kaW1lbnNp"
                      + "b24gYXJyYXkgb2YgamF2YXgubWFuYWdlbWVudC5v"
                      + "cGVubWJlYW4uQ29tcG9zaXRlRGF0YXQAK1tMamF2"
                      + "YXgubWFuYWdlbWVudC5vcGVubWJlYW4uQ29tcG9z"
                      + "aXRlRGF0YTsAAAABAHEAfgAkcQB+ABdzcQB+AC50"
                      + "ACtbTGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFu"
                      + "LkNvbXBvc2l0ZURhdGE7dAA9MS1kaW1lbnNpb24g"
                      + "YXJyYXkgb2YgamF2YXgubWFuYWdlbWVudC5vcGVu"
                      + "bWJlYW4uQ29tcG9zaXRlRGF0YXQAK1tMamF2YXgu"
                      + "bWFuYWdlbWVudC5vcGVubWJlYW4uQ29tcG9zaXRl"
                      + "RGF0YTsAAAABAHEAfgA8cQB+ABhxAH4AInEAfgAZ"
                      + "cQB+ACBxAH4AGnEAfgAqcQB+ABtxAH4AKnEAfgAc"
                      + "cQB+ACBxAH4AHXEAfgAgeHNxAH4AC3B3BAAAABBx"
                      + "AH4ADnNyAA5qYXZhLmxhbmcuTG9uZzuL5JDMjyPf"
                      + "AgABSgAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJl"
                      + "coaslR0LlOCLAgAAeHAAAAAAAAAAAHEAfgAPc3EA"
                      + "fgBO//////////9xAH4AEHNyABFqYXZhLmxhbmcu"
                      + "Qm9vbGVhbs0gcoDVnPruAgABWgAFdmFsdWV4cABx"
                      + "AH4AEXNxAH4AAHEAfgAkc3EAfgALcHcEAAAAAnEA"
                      + "fgAndAAqamF2YS51dGlsLmNvbmN1cnJlbnQuU2Vt"
                      + "YXBob3JlJE5vbmZhaXJTeW5jcQB+AChzcgARamF2"
                      + "YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZh"
                      + "bHVleHEAfgBPWz2cAnhxAH4AEnQAM2phdmEudXRp"
                      + "bC5jb25jdXJyZW50LlNlbWFwaG9yZSROb25mYWly"
                      + "U3luY0A1YjNkOWMwMnEAfgATc3EAfgBO////////"
                      + "//9xAH4AFHBxAH4AFXVyACtbTGphdmF4Lm1hbmFn"
                      + "ZW1lbnQub3Blbm1iZWFuLkNvbXBvc2l0ZURhdGE7"
                      + "6sVge/DF8eICAAB4cAAAAAJzcQB+AABxAH4ANHNx"
                      + "AH4AC3B3BAAAAARxAH4AN3QAF01vbml0b3JJbmZv"
                      + "Q29tcGF0VGVzdCRBcQB+ADhzcQB+AFc0Fd31cQB+"
                      + "ADlzcQB+AFcAAAAHcQB+ADpzcQB+AABxAH4APHNx"
                      + "AH4AC3B3BAAAAAVxAH4AP3EAfgBfcQB+AEB0ABpN"
                      + "b25pdG9ySW5mb0NvbXBhdFRlc3QuamF2YXEAfgBB"
                      + "c3EAfgBXAAAAN3EAfgBCdAACbTJxAH4AQ3NxAH4A"
                      + "UgB4eHNxAH4AAHEAfgA0c3EAfgALcHcEAAAABHEA"
                      + "fgA3cQB+AF9xAH4AOHNxAH4AVwefGopxAH4AOXNx"
                      + "AH4AVwAAAAhxAH4AOnNxAH4AAHEAfgA8c3EAfgAL"
                      + "cHcEAAAABXEAfgA/cQB+AF9xAH4AQHEAfgBkcQB+"
                      + "AEFzcQB+AFcAAAAycQB+AEJ0AAJtMXEAfgBDc3EA"
                      + "fgBSAHh4cQB+ABZ1cQB+AFsAAAAAcQB+ABd1cQB+"
                      + "AFsAAAALc3EAfgAAcQB+ADxzcQB+AAtwdwQAAAAF"
                      + "cQB+AD90AA9zdW4ubWlzYy5VbnNhZmVxAH4AQHQA"
                      + "C1Vuc2FmZS5qYXZhcQB+AEFzcQB+AFf////+cQB+"
                      + "AEJ0AARwYXJrcQB+AENzcQB+AFIBeHNxAH4AAHEA"
                      + "fgA8c3EAfgALcHcEAAAABXEAfgA/dAAmamF2YS51"
                      + "dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9ja1N1cHBv"
                      + "cnRxAH4AQHQAEExvY2tTdXBwb3J0LmphdmFxAH4A"
                      + "QXNxAH4AVwAAALpxAH4AQnEAfgB4cQB+AENzcQB+"
                      + "AFIAeHNxAH4AAHEAfgA8c3EAfgALcHcEAAAABXEA"
                      + "fgA/dAA1amF2YS51dGlsLmNvbmN1cnJlbnQubG9j"
                      + "a3MuQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXJx"
                      + "AH4AQHQAH0Fic3RyYWN0UXVldWVkU3luY2hyb25p"
                      + "emVyLmphdmFxAH4AQXNxAH4AVwAAA0JxAH4AQnQA"
                      + "FXBhcmtBbmRDaGVja0ludGVycnVwdHEAfgBDc3EA"
                      + "fgBSAHhzcQB+AABxAH4APHNxAH4AC3B3BAAAAAVx"
                      + "AH4AP3EAfgCCcQB+AEBxAH4Ag3EAfgBBc3EAfgBX"
                      + "AAAD4nEAfgBCdAAcZG9BY3F1aXJlU2hhcmVkSW50"
                      + "ZXJydXB0aWJseXEAfgBDc3EAfgBSAHhzcQB+AABx"
                      + "AH4APHNxAH4AC3B3BAAAAAVxAH4AP3EAfgCCcQB+"
                      + "AEBxAH4Ag3EAfgBBc3EAfgBXAAAFF3EAfgBCdAAa"
                      + "YWNxdWlyZVNoYXJlZEludGVycnVwdGlibHlxAH4A"
                      + "Q3NxAH4AUgB4c3EAfgAAcQB+ADxzcQB+AAtwdwQA"
                      + "AAAFcQB+AD90AB5qYXZhLnV0aWwuY29uY3VycmVu"
                      + "dC5TZW1hcGhvcmVxAH4AQHQADlNlbWFwaG9yZS5q"
                      + "YXZhcQB+AEFzcQB+AFcAAAE9cQB+AEJ0AAdhY3F1"
                      + "aXJlcQB+AENzcQB+AFIAeHNxAH4AAHEAfgA8c3EA"
                      + "fgALcHcEAAAABXEAfgA/cQB+AF9xAH4AQHEAfgBk"
                      + "cQB+AEFzcQB+AFcAAABBcQB+AEJ0AAJtM3EAfgBD"
                      + "c3EAfgBSAHhzcQB+AABxAH4APHNxAH4AC3B3BAAA"
                      + "AAVxAH4AP3EAfgBfcQB+AEBxAH4AZHEAfgBBc3EA"
                      + "fgBXAAAAN3EAfgBCcQB+AGZxAH4AQ3NxAH4AUgB4"
                      + "c3EAfgAAcQB+ADxzcQB+AAtwdwQAAAAFcQB+AD9x"
                      + "AH4AX3EAfgBAcQB+AGRxAH4AQXNxAH4AVwAAADJx"
                      + "AH4AQnEAfgBvcQB+AENzcQB+AFIAeHNxAH4AAHEA"
                      + "fgA8c3EAfgALcHcEAAAABXEAfgA/cQB+AF9xAH4A"
                      + "QHEAfgBkcQB+AEFzcQB+AFcAAABJcQB+AEJ0AANy"
                      + "dW5xAH4AQ3NxAH4AUgB4c3EAfgAAcQB+ADxzcQB+"
                      + "AAtwdwQAAAAFcQB+AD90ABBqYXZhLmxhbmcuVGhy"
                      + "ZWFkcQB+AEB0AAtUaHJlYWQuamF2YXEAfgBBc3EA"
                      + "fgBXAAAC0nEAfgBCcQB+AKhxAH4AQ3NxAH4AUgB4"
                      + "cQB+ABhzcQB+AFIAcQB+ABlzcQB+AE4AAAAAAAAA"
                      + "CHEAfgAadAAIVGhyZWFkLTBxAH4AG3QAB1dBSVRJ"
                      + "TkdxAH4AHHNxAH4ATgAAAAAAAAABcQB+AB1zcQB+"
                      + "AE7//////////3g=";

    public static final Map<String, String> SERIALIZED;
    static {
        // Do not use Map.of("JDK9", JDK9, ...) here - we want
        // to be able to run this test on JDK 8.
        Map<String, String> m = new LinkedHashMap<>();
        m.put("JDK7", JDK7);
        m.put("JDK8", JDK8);
        m.put("JDK9", JDK9);
        SERIALIZED = Collections.unmodifiableMap(m);
    }
}
